diff --git a/TECHNICAL_SPECIFICATION.md b/TECHNICAL_SPECIFICATION.md new file mode 100644 index 0000000..067fa2d --- /dev/null +++ b/TECHNICAL_SPECIFICATION.md @@ -0,0 +1,561 @@ +# ТЕХНИЧЕСКОЕ ЗАДАНИЕ +## Система удаленного доступа к камерам мобильных устройств "GodEye" + +### Версия: 1.0 +### Дата: 6 октября 2025 г. + +--- + +## 1. ОБЩИЕ ПОЛОЖЕНИЯ + +### 1.1 Наименование системы +**GodEye Signal Center** - система удаленного доступа к камерам мобильных устройств через WebRTC с централизованным управлением. + +### 1.2 Назначение системы +Система предназначена для организации удаленного доступа операторов к камерам Android устройств в режиме реального времени через веб-интерфейс. + +### 1.3 Цели разработки +- Обеспечение безопасного удаленного доступа к камерам мобильных устройств +- Централизованное управление подключениями и сессиями +- Масштабируемая архитектура для поддержки множественных подключений +- Минимальная задержка передачи видео (< 500ms) + +--- + +## 2. ХАРАКТЕРИСТИКИ ОБЪЕКТА АВТОМАТИЗАЦИИ + +### 2.1 Краткие сведения об объекте +- **Тип системы**: Распределенная система реального времени +- **Область применения**: Удаленный мониторинг, техническая поддержка, безопасность +- **Пользователи**: Операторы мониторинга, администраторы системы +- **Устройства**: Android смартфоны/планшеты, десктопные рабочие станции + +### 2.2 Функциональные требования + +#### 2.2.1 Основные функции +1. **Регистрация и аутентификация устройств** + - Уникальная идентификация Android устройств + - Регистрация операторов с правами доступа + - Система разрешений и контроля доступа + +2. **Управление камерой** + - Запрос доступа к камере устройства + - Переключение между типами камер (основная, фронтальная, широкоугольная, телеобъектив) + - Контроль качества видеопотока + - Завершение сессий + +3. **Видеотрансляция** + - WebRTC peer-to-peer соединение + - Адаптивное качество в зависимости от пропускной способности + - Поддержка разрешений: 480p, 720p, 1080p + - Кодеки: H.264, VP8, VP9 + +4. **Мониторинг и логирование** + - Отслеживание состояния устройств + - Логирование всех операций + - Статистика использования + - Система уведомлений + +#### 2.2.2 Дополнительные функции +1. **Администрирование** + - Панель управления системой + - Управление пользователями и устройствами + - Мониторинг производительности + - Конфигурация системы + +2. **Безопасность** + - Шифрование всех соединений (TLS/SSL) + - Аутентификация устройств по токенам + - Аудит действий пользователей + - Контроль сессий + +--- + +## 3. АРХИТЕКТУРА СИСТЕМЫ + +### 3.1 Компоненты системы + +#### 3.1.1 Backend Server (Node.js) +- **Технологии**: Node.js, Express.js, Socket.IO +- **Функции**: + - Сигнальный сервер для WebRTC + - Управление сессиями и устройствами + - REST API для управления + - Система логирования +- **Порт**: 3001 (конфигурируемый) + +#### 3.1.2 Android Client Application +- **Технологии**: Kotlin, Android SDK, WebRTC Android +- **Функции**: + - Регистрация в системе + - Управление камерой устройства + - WebRTC видеопоток + - Обработка команд переключения камер +- **Минимальная версия Android**: API 21 (Android 5.0) + +#### 3.1.3 Desktop Operator Application +- **Технологии**: Electron, HTML5, CSS3, JavaScript +- **Функции**: + - Интерфейс оператора + - Управление подключениями к устройствам + - Просмотр видеопотоков + - Переключение камер +- **Платформы**: Windows 10+, macOS 10.14+, Linux (Ubuntu 18.04+) + +#### 3.1.4 Web Demo Interface +- **Технологии**: HTML5, CSS3, JavaScript, Socket.IO +- **Функции**: + - Демонстрационный интерфейс + - Тестирование функциональности + - Имитация Android устройства и оператора + +### 3.2 Схема взаимодействия + +``` +Android Device <--WebSocket--> Backend Server <--WebSocket--> Desktop Operator + | | | + | | | + Camera API Session Video Display + WebRTC Management WebRTC + Stream Device Registry Controls +``` + +--- + +## 4. ТЕХНИЧЕСКИЕ ТРЕБОВАНИЯ + +### 4.1 Требования к Backend Server + +#### 4.1.1 Функциональные требования +- **Протоколы**: HTTP/HTTPS, WebSocket (Socket.IO) +- **API**: RESTful API + Socket.IO events +- **База данных**: В памяти (session storage) с возможностью подключения PostgreSQL/MongoDB +- **Логирование**: Winston с ротацией логов +- **Конфигурация**: JSON файлы + переменные окружения + +#### 4.1.2 Socket.IO Events + +**Входящие события:** +- `register:android` - регистрация Android устройства +- `register:operator` - регистрация оператора +- `camera:request` - запрос доступа к камере +- `camera:response` - ответ устройства на запрос камеры +- `camera:switch` - переключение типа камеры +- `camera:disconnect` - завершение сессии +- `webrtc:offer` - WebRTC offer +- `webrtc:answer` - WebRTC answer +- `webrtc:ice-candidate` - ICE кандидаты +- `ping` - проверка соединения + +**Исходящие события:** +- `register:success/error` - результат регистрации +- `device:connected/disconnected` - изменение статуса устройства +- `camera:request` - передача запроса камеры +- `camera:stream-ready` - готовность видеопотока +- `camera:denied` - отказ в доступе +- `session:status-update` - обновление статуса сессии +- `webrtc:offer/answer/ice-candidate` - WebRTC сигнализация + +#### 4.1.3 REST API Endpoints + +**Операторы:** +- `GET /api/operators/devices` - список доступных устройств +- `POST /api/operators/camera/request` - запрос камеры +- `POST /api/operators/camera/:sessionId/switch` - переключение камеры +- `DELETE /api/operators/camera/:sessionId` - завершение сессии +- `GET /api/operators/sessions` - активные сессии оператора + +**Администрирование:** +- `GET /api/admin/stats` - статистика системы +- `GET /api/admin/health` - состояние системы +- `GET /api/admin/devices` - все устройства +- `GET /api/admin/sessions` - все сессии +- `POST /api/admin/cleanup` - очистка неактивных сессий + +**Мониторинг:** +- `GET /api/status` - общий статус системы + +### 4.2 Требования к Android Application + +#### 4.2.1 Функциональные требования +- **Разрешения**: CAMERA, RECORD_AUDIO, INTERNET, ACCESS_NETWORK_STATE +- **Архитектура**: MVVM с использованием Android Architecture Components +- **WebRTC**: Последняя стабильная версия WebRTC Android +- **Socket.IO**: Socket.IO Android Client + +#### 4.2.2 Основные классы и функции + +**MainActivity:** +- Основной экран приложения +- Управление разрешениями +- Отображение статуса подключения +- Список активных сессий + +**SocketManager:** +- Подключение к серверу +- Обработка Socket.IO событий +- Отправка ответов на запросы камеры + +**CameraManager:** +- Инициализация камеры +- Переключение между камерами +- Управление параметрами видео + +**WebRTCManager:** +- Создание peer connection +- Обработка offer/answer +- Управление ICE кандидатами +- Потоковая передача видео + +#### 4.2.3 Пользовательский интерфейс +- **Главный экран**: Device ID, статус подключения, настройки сервера +- **Экран сессий**: Список активных запросов и сессий +- **Настройки**: URL сервера, качество видео, разрешения + +### 4.3 Требования к Desktop Operator + +#### 4.3.1 Функциональные требования +- **Framework**: Electron (последняя LTS версия) +- **UI Framework**: Собственный CSS/JavaScript +- **WebRTC**: Встроенный в Chromium +- **Архитектура**: Main process + Renderer process + +#### 4.3.2 Основные модули + +**ConfigManager:** +- Управление настройками приложения +- Сохранение конфигурации +- Валидация параметров + +**SocketManager:** +- Подключение к backend серверу +- Обработка событий +- Переподключение при обрывах + +**DeviceManager:** +- Отображение списка устройств +- Управление подключениями +- Фильтрация и поиск + +**SessionManager:** +- Управление активными сессиями +- Отображение статусов +- История операций + +**VideoManager:** +- Отображение видеопотоков +- Управление качеством +- Фильтры изображения + +#### 4.3.3 Пользовательский интерфейс + +**Главное окно:** +- Панель подключения (статус, настройки) +- Список доступных устройств +- Область просмотра видео +- Панель управления камерой +- Логи операций + +**Дополнительные окна:** +- Настройки приложения +- История сессий +- Справочная информация + +--- + +## 5. ТРЕБОВАНИЯ К ПРОИЗВОДИТЕЛЬНОСТИ + +### 5.1 Пропускная способность +- **Минимальная**: 1 Мбит/с для SD качества (480p) +- **Рекомендуемая**: 5 Мбит/с для HD качества (720p) +- **Оптимальная**: 10 Мбит/с для Full HD (1080p) + +### 5.2 Задержка +- **WebRTC соединение**: < 500ms +- **Команды управления**: < 100ms +- **Отклик интерфейса**: < 50ms + +### 5.3 Масштабируемость +- **Одновременные устройства**: до 100 +- **Одновременные операторы**: до 50 +- **Активные сессии**: до 30 +- **Время работы без перезагрузки**: 24/7 + +### 5.4 Ресурсы сервера +- **ОЗУ**: минимум 2 ГБ, рекомендуется 8 ГБ +- **CPU**: минимум 2 ядра, рекомендуется 4 ядра +- **Сеть**: 100 Мбит/с +- **Дисковое пространство**: 10 ГБ для логов + +--- + +## 6. ТРЕБОВАНИЯ К БЕЗОПАСНОСТИ + +### 6.1 Шифрование +- **WebSocket соединения**: WSS (WebSocket Secure) +- **WebRTC**: DTLS (по умолчанию) +- **REST API**: HTTPS +- **Конфигурационные файлы**: шифрование чувствительных данных + +### 6.2 Аутентификация +- **Устройства**: уникальный Device ID + токен регистрации +- **Операторы**: логин/пароль + сессионные токены +- **Администраторы**: двухфакторная аутентификация + +### 6.3 Авторизация +- **Ролевая модель**: администратор, оператор, устройство +- **Права доступа**: по устройствам и функциям +- **Аудит**: логирование всех действий + +### 6.4 Защита данных +- **Персональные данные**: минимальный объем сбора +- **Видеопотоки**: не сохраняются на сервере +- **Логи**: автоматическая очистка через 30 дней +- **Backup**: шифрованные резервные копии конфигурации + +--- + +## 7. ТРЕБОВАНИЯ К НАДЕЖНОСТИ + +### 7.1 Отказоустойчивость +- **Автоматическое переподключение** при обрыве связи +- **Graceful shutdown** с сохранением состояния +- **Обработка ошибок** с информативными сообщениями +- **Восстановление сессий** после сбоев + +### 7.2 Мониторинг +- **Health checks** для всех компонентов +- **Метрики производительности** в реальном времени +- **Система алертов** при критических событиях +- **Логирование** с различными уровнями детализации + +### 7.3 Резервное копирование +- **Конфигурация**: ежедневное автоматическое резервирование +- **Логи**: архивирование и ротация +- **Состояние системы**: snapshot при критических изменениях + +--- + +## 8. ТРЕБОВАНИЯ К ИНТЕРФЕЙСАМ + +### 8.1 Пользовательский интерфейс + +#### 8.1.1 Desktop Operator Application +- **Современный дизайн**: Material Design или аналогичный +- **Адаптивность**: масштабирование под разные разрешения +- **Темная/светлая тема**: переключение в настройках +- **Локализация**: русский и английский языки +- **Доступность**: поддержка screen readers + +#### 8.1.2 Android Application +- **Material Design 3**: соответствие последним гайдлайнам Google +- **Адаптивность**: поддержка планшетов и различных размеров экранов +- **Простота использования**: минимальное количество действий для основных функций +- **Обратная связь**: четкие индикаторы состояния и прогресса + +#### 8.1.3 Web Demo Interface +- **Responsive design**: работа на мобильных и десктопных устройствах +- **Cross-browser compatibility**: Chrome, Firefox, Safari, Edge +- **Интерактивность**: real-time обновления интерфейса +- **Отладочная информация**: детальные логи для разработчиков + +### 8.2 API интерфейсы + +#### 8.2.1 REST API +- **OpenAPI 3.0 спецификация**: полная документация API +- **Стандартные HTTP коды**: правильное использование статусов +- **JSON формат**: все запросы и ответы +- **Версионирование**: поддержка версий API +- **Rate limiting**: защита от злоупотреблений + +#### 8.2.2 WebSocket API +- **Документация событий**: полный список с примерами +- **Схемы данных**: JSON Schema для всех событий +- **Обработка ошибок**: стандартизированные коды ошибок +- **Heartbeat**: механизм проверки соединения + +--- + +## 9. ТРЕБОВАНИЯ К ТЕСТИРОВАНИЮ + +### 9.1 Модульное тестирование +- **Backend**: покрытие кода минимум 80% +- **Android**: unit тесты для бизнес-логики +- **Desktop**: тестирование основных модулей +- **Автоматизация**: запуск тестов при каждом коммите + +### 9.2 Интеграционное тестирование +- **API тестирование**: все endpoints и сценарии +- **WebSocket тестирование**: все события и error cases +- **WebRTC тестирование**: установка соединений и качество +- **Cross-platform**: тестирование на различных ОС + +### 9.3 Нагрузочное тестирование +- **Одновременные подключения**: до максимальных значений +- **Долговременная работа**: 24 часа непрерывной работы +- **Деградация сервиса**: поведение при превышении лимитов +- **Memory leaks**: отсутствие утечек памяти + +### 9.4 Безопасности тестирование +- **Penetration testing**: поиск уязвимостей +- **Authentication bypass**: проверка обхода аутентификации +- **Data validation**: валидация всех входных данных +- **SSL/TLS**: проверка конфигурации шифрования + +--- + +## 10. ТРЕБОВАНИЯ К ДОКУМЕНТАЦИИ + +### 10.1 Техническая документация +- **Архитектура системы**: диаграммы и описания компонентов +- **API документация**: полная OpenAPI спецификация +- **Database schema**: структура данных +- **Deployment guide**: инструкции по развертыванию + +### 10.2 Пользовательская документация +- **Руководство администратора**: установка, настройка, обслуживание +- **Руководство оператора**: работа с desktop приложением +- **Инструкция для пользователей**: настройка Android приложения +- **FAQ**: часто задаваемые вопросы и решения + +### 10.3 Документация разработчика +- **Setup guide**: настройка среды разработки +- **Code style**: стандарты кодирования +- **Contributing guidelines**: правила участия в проекте +- **Changelog**: история изменений + +--- + +## 11. ТРЕБОВАНИЯ К ПОСТАВКЕ + +### 11.1 Исходный код +- **Git repository**: структурированная история коммитов +- **Branching strategy**: GitFlow или аналогичная стратегия +- **Code review**: все изменения проходят ревью +- **CI/CD**: автоматическая сборка и тестирование + +### 11.2 Сборки приложений +- **Backend**: Docker образ + npm package +- **Android**: APK файл + source code +- **Desktop**: инсталляторы для Windows, macOS, Linux +- **Web Demo**: статические файлы + +### 11.3 Конфигурация +- **Environment templates**: примеры конфигурационных файлов +- **Docker Compose**: готовая конфигурация для развертывания +- **Kubernetes manifests**: для enterprise развертывания +- **Monitoring setup**: конфигурация систем мониторинга + +--- + +## 12. КРИТЕРИИ ПРИЕМКИ + +### 12.1 Функциональные критерии +- ✅ Регистрация и подключение Android устройств +- ✅ Регистрация и подключение операторов +- ✅ Запрос и получение доступа к камере +- ✅ Переключение между типами камер +- ✅ Стабильная WebRTC видеотрансляция +- ✅ Завершение сессий и отключение устройств +- ✅ Административные функции +- ✅ Система логирования и мониторинга + +### 12.2 Технические критерии +- ✅ Задержка видео < 500ms +- ✅ Стабильная работа 24 часа +- ✅ Поддержка 30 одновременных сессий +- ✅ Покрытие тестами > 80% +- ✅ Безопасность соединений (HTTPS/WSS) +- ✅ Cross-platform совместимость + +### 12.3 Качественные критерии +- ✅ Удобство использования интерфейсов +- ✅ Полнота документации +- ✅ Качество кода (code review passed) +- ✅ Отсутствие критических уязвимостей +- ✅ Соответствие техническому заданию + +--- + +## 13. УПРАВЛЕНИЕ ПРОЕКТОМ + +### 13.1 Этапы разработки + +#### Этап 1: Архитектура и Backend (4 недели) +- Проектирование архитектуры системы +- Разработка Backend Server +- Создание REST API и Socket.IO events +- Базовое тестирование API + +#### Этап 2: Android Application (3 недели) +- Разработка Android клиента +- Интеграция с Backend +- Реализация WebRTC функциональности +- Тестирование на различных устройствах + +#### Этап 3: Desktop Operator (3 недели) +- Разработка Electron приложения +- Пользовательский интерфейс +- Интеграция с Backend +- WebRTC клиент для операторов + +#### Этап 4: Интеграция и тестирование (2 недели) +- Интеграционное тестирование +- Нагрузочное тестирование +- Исправление критических багов +- Подготовка документации + +#### Этап 5: Финализация и поставка (1 неделя) +- Финальное тестирование +- Подготовка релизных сборок +- Документация и инструкции +- Передача заказчику + +### 13.2 Команда проекта +- **Tech Lead / Architect** - 1 человек +- **Backend Developer** - 1 человек +- **Android Developer** - 1 человек +- **Frontend Developer** - 1 человек +- **QA Engineer** - 1 человек + +### 13.3 Коммуникации +- **Ежедневные standups**: 15 минут +- **Еженедельные ретроспективы**: 1 час +- **Демонстрации заказчику**: каждые 2 недели +- **Отчеты о прогрессе**: еженедельно + +--- + +## 14. РИСКИ И ОГРАНИЧЕНИЯ + +### 14.1 Технические риски +- **WebRTC совместимость** между различными платформами +- **Производительность** при высокой нагрузке +- **Сетевые ограничения** (NAT, firewall) +- **Безопасность** peer-to-peer соединений + +### 14.2 Проектные риски +- **Изменение требований** в процессе разработки +- **Недоступность экспертизы** по WebRTC +- **Задержки в тестировании** на реальных устройствах +- **Интеграционные проблемы** между компонентами + +### 14.3 Митигация рисков +- **Прототипирование** критических компонентов +- **Раннее тестирование** на целевых устройствах +- **Резервные планы** для критических функций +- **Регулярная коммуникация** с заказчиком + +--- + +## 15. ЗАКЛЮЧЕНИЕ + +Данное техническое задание определяет полный объем работ по созданию системы удаленного доступа к камерам мобильных устройств "GodEye". Система должна обеспечивать безопасную, надежную и производительную работу в условиях реального времени. + +Все компоненты системы должны быть разработаны в соответствии с современными стандартами и best practices, обеспечивать высокое качество пользовательского опыта и соответствовать требованиям безопасности. + +--- + +**Документ подготовлен:** 6 октября 2025 г. +**Версия:** 1.0 +**Статус:** Для согласования с подрядчиком \ No newline at end of file diff --git a/android-client/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock b/android-client/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock deleted file mode 100644 index 19f1c6a..0000000 Binary files a/android-client/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock and /dev/null differ diff --git a/android-client/.gradle/7.2/fileHashes/fileHashes.lock b/android-client/.gradle/7.2/fileHashes/fileHashes.lock deleted file mode 100644 index 7831844..0000000 Binary files a/android-client/.gradle/7.2/fileHashes/fileHashes.lock and /dev/null differ diff --git a/android-client/.gradle/7.5/checksums/checksums.lock b/android-client/.gradle/7.5/checksums/checksums.lock deleted file mode 100644 index 4c8082f..0000000 Binary files a/android-client/.gradle/7.5/checksums/checksums.lock and /dev/null differ diff --git a/android-client/.gradle/7.5/checksums/md5-checksums.bin b/android-client/.gradle/7.5/checksums/md5-checksums.bin deleted file mode 100644 index 37badef..0000000 Binary files a/android-client/.gradle/7.5/checksums/md5-checksums.bin and /dev/null differ diff --git a/android-client/.gradle/7.5/checksums/sha1-checksums.bin b/android-client/.gradle/7.5/checksums/sha1-checksums.bin deleted file mode 100644 index adde9f4..0000000 Binary files a/android-client/.gradle/7.5/checksums/sha1-checksums.bin and /dev/null differ diff --git a/android-client/.gradle/7.5/dependencies-accessors/dependencies-accessors.lock b/android-client/.gradle/7.5/dependencies-accessors/dependencies-accessors.lock deleted file mode 100644 index 88599fd..0000000 Binary files a/android-client/.gradle/7.5/dependencies-accessors/dependencies-accessors.lock and /dev/null differ diff --git a/android-client/.gradle/7.5/executionHistory/executionHistory.lock b/android-client/.gradle/7.5/executionHistory/executionHistory.lock deleted file mode 100644 index d6289d8..0000000 Binary files a/android-client/.gradle/7.5/executionHistory/executionHistory.lock and /dev/null differ diff --git a/android-client/.gradle/7.5/fileChanges/last-build.bin b/android-client/.gradle/7.5/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/android-client/.gradle/7.5/fileChanges/last-build.bin and /dev/null differ diff --git a/android-client/.gradle/7.5/fileHashes/fileHashes.lock b/android-client/.gradle/7.5/fileHashes/fileHashes.lock deleted file mode 100644 index 1926ba1..0000000 Binary files a/android-client/.gradle/7.5/fileHashes/fileHashes.lock and /dev/null differ diff --git a/android-client/.gradle/8.0/checksums/checksums.lock b/android-client/.gradle/8.0/checksums/checksums.lock deleted file mode 100644 index 03167ad..0000000 Binary files a/android-client/.gradle/8.0/checksums/checksums.lock and /dev/null differ diff --git a/android-client/.gradle/8.0/checksums/md5-checksums.bin b/android-client/.gradle/8.0/checksums/md5-checksums.bin deleted file mode 100644 index b84679b..0000000 Binary files a/android-client/.gradle/8.0/checksums/md5-checksums.bin and /dev/null differ diff --git a/android-client/.gradle/8.0/checksums/sha1-checksums.bin b/android-client/.gradle/8.0/checksums/sha1-checksums.bin deleted file mode 100644 index e133dd2..0000000 Binary files a/android-client/.gradle/8.0/checksums/sha1-checksums.bin and /dev/null differ diff --git a/android-client/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock b/android-client/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock deleted file mode 100644 index 9ba25df..0000000 Binary files a/android-client/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock and /dev/null differ diff --git a/android-client/.gradle/8.0/executionHistory/executionHistory.lock b/android-client/.gradle/8.0/executionHistory/executionHistory.lock deleted file mode 100644 index ce11573..0000000 Binary files a/android-client/.gradle/8.0/executionHistory/executionHistory.lock and /dev/null differ diff --git a/android-client/.gradle/8.0/fileChanges/last-build.bin b/android-client/.gradle/8.0/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/android-client/.gradle/8.0/fileChanges/last-build.bin and /dev/null differ diff --git a/android-client/.gradle/8.0/fileHashes/fileHashes.lock b/android-client/.gradle/8.0/fileHashes/fileHashes.lock deleted file mode 100644 index aa59c8b..0000000 Binary files a/android-client/.gradle/8.0/fileHashes/fileHashes.lock and /dev/null differ diff --git a/android-client/.gradle/8.5/checksums/checksums.lock b/android-client/.gradle/8.5/checksums/checksums.lock deleted file mode 100644 index 80b199b..0000000 Binary files a/android-client/.gradle/8.5/checksums/checksums.lock and /dev/null differ diff --git a/android-client/.gradle/8.5/checksums/md5-checksums.bin b/android-client/.gradle/8.5/checksums/md5-checksums.bin deleted file mode 100644 index bc249e0..0000000 Binary files a/android-client/.gradle/8.5/checksums/md5-checksums.bin and /dev/null differ diff --git a/android-client/.gradle/8.5/checksums/sha1-checksums.bin b/android-client/.gradle/8.5/checksums/sha1-checksums.bin deleted file mode 100644 index aae255a..0000000 Binary files a/android-client/.gradle/8.5/checksums/sha1-checksums.bin and /dev/null differ diff --git a/android-client/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock b/android-client/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock deleted file mode 100644 index 9e1bd44..0000000 Binary files a/android-client/.gradle/8.5/dependencies-accessors/dependencies-accessors.lock and /dev/null differ diff --git a/android-client/.gradle/8.5/fileChanges/last-build.bin b/android-client/.gradle/8.5/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/android-client/.gradle/8.5/fileChanges/last-build.bin and /dev/null differ diff --git a/android-client/.gradle/8.5/fileHashes/fileHashes.lock b/android-client/.gradle/8.5/fileHashes/fileHashes.lock deleted file mode 100644 index 6261b7e..0000000 Binary files a/android-client/.gradle/8.5/fileHashes/fileHashes.lock and /dev/null differ diff --git a/android-client/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android-client/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 7415237..0000000 Binary files a/android-client/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ diff --git a/android-client/.gradle/buildOutputCleanup/cache.properties b/android-client/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index fe64799..0000000 --- a/android-client/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Mon Sep 29 19:45:19 KST 2025 -gradle.version=7.2 diff --git a/android-client/.gradle/checksums/checksums.lock b/android-client/.gradle/checksums/checksums.lock deleted file mode 100644 index ab31861..0000000 Binary files a/android-client/.gradle/checksums/checksums.lock and /dev/null differ diff --git a/android-client/GodEye_Android_Client.iml b/android-client/GodEye_Android_Client.iml deleted file mode 100644 index 0dfa191..0000000 --- a/android-client/GodEye_Android_Client.iml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android-client/README.md b/android-client/README.md deleted file mode 100644 index b5e5d5d..0000000 --- a/android-client/README.md +++ /dev/null @@ -1,127 +0,0 @@ -# GodEye Android Client - Setup Instructions - -## Требования для разработки - -### 1. Android SDK -- Android SDK Platform-tools -- Android SDK Build-tools 34.0.0 -- Android 14 (API 34) Platform -- Android Emulator - -### 2. Java Development Kit -- JDK 8 или выше - -## Настройка эмулятора - -### Создание AVD (Android Virtual Device) -```bash -# Создать эмулятор Android 14 с Google APIs -avdmanager create avd -n "GodEye_Emulator" -k "system-images;android-34;google_apis;x86_64" -d "pixel_4" - -# Запуск эмулятора -emulator -avd GodEye_Emulator -no-snapshot-save -``` - -### Альтернативно через Android Studio: -1. Tools → AVD Manager -2. Create Virtual Device -3. Choose Pixel 4 или подобное устройство -4. Select Android 14 (API 34) system image -5. Name: "GodEye_Emulator" - -## Команды сборки - -### Сборка проекта -```bash -# Debug версия -./gradlew assembleDebug - -# Release версия -./gradlew assembleRelease - -# Установка на эмулятор/устройство -./gradlew installDebug - -# Запуск тестов -./gradlew test -``` - -### Установка APK -```bash -# Найти собранный APK -ls app/build/outputs/apk/debug/ - -# Установить через adb -adb install app/build/outputs/apk/debug/app-debug.apk - -# Или напрямую -./gradlew installDebug -``` - -## Настройки IDE - -### Android Studio -1. Open Project → выбрать папку `/android-client` -2. File → Project Structure → Project SDK: Android API 34 -3. Build → Make Project -4. Run → Run 'app' - -### IntelliJ IDEA -1. New → Project from Existing Sources -2. Import as Gradle project -3. SDK Location: установить путь к Android SDK -4. Gradle JVM: JDK 8+ - -## Отладка - -### ADB команды -```bash -# Просмотр логов приложения -adb logcat | grep "GodEye\|SocketManager\|CameraManager" - -# Просмотр устройств -adb devices - -# Перенаправление портов для локального сервера -adb reverse tcp:3001 tcp:3001 -``` - -### Настройка сети для эмулятора -- Localhost backend: `http://10.0.2.2:3001` -- Внешний сервер: `http://YOUR_IP:3001` - -## Структура проекта - -``` -android-client/ -├── app/ -│ ├── src/main/ -│ │ ├── java/com/godeye/android/ -│ │ │ ├── MainActivity.kt -│ │ │ ├── network/SocketManager.kt -│ │ │ └── camera/CameraManager.kt -│ │ ├── res/layout/activity_main.xml -│ │ └── AndroidManifest.xml -│ └── build.gradle -├── gradle/wrapper/ -├── gradlew -└── settings.gradle -``` - -## Troubleshooting - -### Проблемы с правами -```bash -chmod +x gradlew -``` - -### Проблемы с SDK -```bash -export ANDROID_HOME=/path/to/android/sdk -export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools -``` - -### Проблемы с сетью в эмуляторе -- Убедиться что backend сервер запущен на порту 3001 -- Использовать `10.0.2.2` вместо `localhost` в эмуляторе -- Проверить правила firewall diff --git a/android-client/app/.gradle/8.9/checksums/checksums.lock b/android-client/app/.gradle/8.9/checksums/checksums.lock new file mode 100644 index 0000000..4131c38 Binary files /dev/null and b/android-client/app/.gradle/8.9/checksums/checksums.lock differ diff --git a/android-client/.gradle/7.2/dependencies-accessors/gc.properties b/android-client/app/.gradle/8.9/dependencies-accessors/gc.properties similarity index 100% rename from android-client/.gradle/7.2/dependencies-accessors/gc.properties rename to android-client/app/.gradle/8.9/dependencies-accessors/gc.properties diff --git a/android-client/.gradle/7.2/fileChanges/last-build.bin b/android-client/app/.gradle/8.9/fileChanges/last-build.bin similarity index 100% rename from android-client/.gradle/7.2/fileChanges/last-build.bin rename to android-client/app/.gradle/8.9/fileChanges/last-build.bin diff --git a/android-client/app/.gradle/8.9/fileHashes/fileHashes.lock b/android-client/app/.gradle/8.9/fileHashes/fileHashes.lock new file mode 100644 index 0000000..dc47f23 Binary files /dev/null and b/android-client/app/.gradle/8.9/fileHashes/fileHashes.lock differ diff --git a/android-client/.gradle/7.2/gc.properties b/android-client/app/.gradle/8.9/gc.properties similarity index 100% rename from android-client/.gradle/7.2/gc.properties rename to android-client/app/.gradle/8.9/gc.properties diff --git a/android-client/app/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android-client/app/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..e87d164 Binary files /dev/null and b/android-client/app/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/android-client/app/.gradle/buildOutputCleanup/cache.properties b/android-client/app/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..ddac78c --- /dev/null +++ b/android-client/app/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sun Oct 05 11:59:43 KST 2025 +gradle.version=8.9 diff --git a/android-client/.gradle/7.5/dependencies-accessors/gc.properties b/android-client/app/.gradle/vcs-1/gc.properties similarity index 100% rename from android-client/.gradle/7.5/dependencies-accessors/gc.properties rename to android-client/app/.gradle/vcs-1/gc.properties diff --git a/android-client/app/app.iml b/android-client/app/app.iml deleted file mode 100644 index 9d9d2e7..0000000 --- a/android-client/app/app.iml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android-client/app/proguard-rules.pro b/android-client/app/proguard-rules.pro deleted file mode 100644 index 93183c1..0000000 --- a/android-client/app/proguard-rules.pro +++ /dev/null @@ -1,29 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile - -# WebRTC ProGuard rules --keep class org.webrtc.** { *; } --dontwarn org.webrtc.** - -# Socket.IO ProGuard rules --keep class io.socket.** { *; } --dontwarn io.socket.** diff --git a/android-client/app/src/main/AndroidManifest.xml b/android-client/app/src/main/AndroidManifest.xml deleted file mode 100644 index a016f17..0000000 --- a/android-client/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android-client/app/src/main/java/com/godeye/android/network/SocketManager.kt b/android-client/app/src/main/java/com/godeye/android/network/SocketManager.kt index 1172cdf..dbc9ca8 100644 --- a/android-client/app/src/main/java/com/godeye/android/network/SocketManager.kt +++ b/android-client/app/src/main/java/com/godeye/android/network/SocketManager.kt @@ -32,7 +32,6 @@ class SocketManager( sock.on(Socket.EVENT_CONNECT, onConnect) sock.on(Socket.EVENT_DISCONNECT, onDisconnect) sock.on(Socket.EVENT_CONNECT_ERROR, onConnectError) - sock.on("server:hello", createServerHelloHandler(availableCameras)) sock.on("register:success", onRegisterSuccess) sock.on("register:error", onRegisterError) sock.on("camera:request", onCameraRequestReceived) @@ -43,6 +42,22 @@ class SocketManager( sock.on("webrtc:ice-candidate", onWebRTCIceCandidate) sock.connect() + + // Регистрация устройства + val deviceInfo = JSONObject().apply { + put("model", android.os.Build.MODEL) + put("manufacturer", android.os.Build.MANUFACTURER) + put("androidVersion", android.os.Build.VERSION.RELEASE) + put("appVersion", "1.0.0") + put("availableCameras", JSONArray(availableCameras)) + } + + val registerData = JSONObject().apply { + put("deviceId", deviceId) + put("deviceInfo", deviceInfo) + } + + sock.emit("register:android", registerData) } } catch (e: Exception) { Log.e(TAG, "Connection error", e) @@ -61,7 +76,11 @@ class SocketManager( val response = JSONObject().apply { put("sessionId", sessionId) put("accepted", accepted) - put("message", if (accepted) "Доступ разрешен" else "Доступ отклонен") + if (accepted) { + put("streamUrl", "webrtc") + } else { + put("error", "Доступ отклонен пользователем") + } } socket?.emit("camera:response", response) Log.d(TAG, "Camera request response sent: $accepted") diff --git a/android-client/app/src/main/res/drawable/ic_launcher_foreground.xml b/android-client/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index 3626962..0000000 --- a/android-client/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/android-client/app/src/main/res/layout/activity_main.xml b/android-client/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 8cb2785..0000000 --- a/android-client/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - ` : ''} - `; - - container.appendChild(sessionCard); - }); - }); -} - -// Завершение сессии -function endSession(sessionId) { - if (!operatorSocket) { - showAlert('Не подключен как оператор', 'danger'); - return; - } - - operatorSocket.emit('session:end', { sessionId }); - logMessage('info', `Завершаем сессию: ${sessionId}`); -} - -// Переключение камеры -function switchCamera(sessionId, cameraType) { - if (!operatorSocket) { - showAlert('Не подключен как оператор', 'danger'); - return; - } - - operatorSocket.emit('camera:switch', { - sessionId, - cameraType - }); - logMessage('info', `Переключаем камеру: ${sessionId} на ${cameraType}`); -} - -// Показ уведомления -function showAlert(message, type) { +// Вспомогательная функция для показа уведомлений +function showAlert(type, message) { + // Создаем временное уведомление const alert = document.createElement('div'); alert.className = `alert alert-${type}`; alert.textContent = message; @@ -909,66 +814,10 @@ function showAlert(message, type) { document.body.appendChild(alert); + // Удаляем через 5 секунд setTimeout(() => { if (document.body.contains(alert)) { document.body.removeChild(alert); } }, 5000); -} - -// === ОПЕРАТОР: Веб-камера и WebRTC === -function showOperatorWebcamButton() { - const btn = document.getElementById('startOperatorWebcam'); - if (btn) btn.style.display = ''; -} -function hideOperatorWebcamButton() { - const btn = document.getElementById('startOperatorWebcam'); - if (btn) btn.style.display = 'none'; -} -function startOperatorWebcam() { - navigator.mediaDevices.getUserMedia({ video: true, audio: false }) - .then(stream => { - operatorWebcamStream = stream; - const video = document.getElementById('operatorWebcam'); - if (video) { - video.srcObject = stream; - video.style.display = ''; - } - startOperatorWebRTC(stream); - }) - .catch(err => { - showAlert('danger', 'Ошибка доступа к веб-камере: ' + err); - }); -} -function startOperatorWebRTC(stream) { - operatorWebcamPeer = new RTCPeerConnection(rtcConfig); - stream.getTracks().forEach(track => operatorWebcamPeer.addTrack(track, stream)); - operatorWebcamPeer.onicecandidate = e => { - if (e.candidate) { - socket.emit('webrtc:ice-candidate', { candidate: e.candidate }); - } - }; - operatorWebcamPeer.createOffer().then(offer => { - return operatorWebcamPeer.setLocalDescription(offer); - }).then(() => { - socket.emit('webrtc:offer', { offer: operatorWebcamPeer.localDescription }); - }); -} -socket.on('webrtc:answer', data => { - if (operatorWebcamPeer) { - operatorWebcamPeer.setRemoteDescription(new RTCSessionDescription(data.answer)); - } -}); -socket.on('webrtc:ice-candidate', data => { - if (operatorWebcamPeer && data.candidate) { - operatorWebcamPeer.addIceCandidate(new RTCIceCandidate(data.candidate)); - } -}); -// Показывать кнопку веб-камеры при принятии сессии -socket.on('camera:response', data => { - if (data.accepted) { - showOperatorWebcamButton(); - } else { - hideOperatorWebcamButton(); - } -}); \ No newline at end of file +} \ No newline at end of file diff --git a/backend/public/index.html b/backend/public/index.html index 3bf1f8e..28c4b06 100644 --- a/backend/public/index.html +++ b/backend/public/index.html @@ -400,14 +400,13 @@ + - -
diff --git a/backend/public/mobile.html b/backend/public/mobile.html index 2432e40..e69de29 100644 --- a/backend/public/mobile.html +++ b/backend/public/mobile.html @@ -1,815 +0,0 @@ - - - - - - GodEye Mobile Camera - - - -
-
-

📱 GodEye Mobile

-
Отключено
-
- -
- -
-

📷 Камера не активна

-

Нажмите кнопку включения камеры

-
-
- -
-
📱 Device ID: Генерация...
-
📷 Camera: none
-
🔗 Sessions: 0
-
- -
- - - -
- -
-

📞 Запрос на доступ к камере

-

Оператор запрашивает доступ к камере

-
- - -
-
- -
- -
-
- - - - - \ No newline at end of file diff --git a/backend/src/managers/ConnectionManager.js b/backend/src/managers/ConnectionManager.js index bdf04ec..e69de29 100644 --- a/backend/src/managers/ConnectionManager.js +++ b/backend/src/managers/ConnectionManager.js @@ -1,486 +0,0 @@ -/** - * ConnectionManager - управляет подключениями между операторами и устройствами - */ -class ConnectionManager { - constructor(sessionManager, deviceManager, logger) { - this.sessionManager = sessionManager; - this.deviceManager = deviceManager; - this.logger = logger; - this.connectionRequests = new Map(); // requestId -> ConnectionRequest - this.activeConnections = new Map(); // connectionId -> Connection - this.connectionTimeouts = new Map(); // connectionId -> timeoutId - this.maxConnectionsPerDevice = 1; // Ограничение: одно соединение на устройство - this.connectionTimeout = 30000; // 30 секунд на установку соединения - } - - /** - * Инициация подключения оператора к устройству - * @param {string} operatorId - * @param {string} deviceId - * @param {string} cameraType - * @returns {Promise} {success: boolean, connectionId?: string, sessionId?: string, error?: string} - */ - async initiateConnection(operatorId, deviceId, cameraType = 'back') { - this.logger.info(`🔗 Initiating connection: ${operatorId} -> ${deviceId} (${cameraType})`); - - // Проверяем возможность создания соединения - const validation = this.deviceManager.canCreateSession(deviceId, operatorId); - if (!validation.canConnect) { - this.logger.error(`❌ Connection validation failed: ${validation.reason}`); - throw new Error(validation.reason); - } - - // Создаем сессию - const session = this.sessionManager.createSession(deviceId, operatorId, cameraType); - const connectionId = session.sessionId; - - // Создаем запрос на подключение - const connectionRequest = { - connectionId, - sessionId: connectionId, // Для совместимости - operatorId, - deviceId, - cameraType, - status: 'pending', - createdAt: new Date(), - timeoutAt: new Date(Date.now() + this.connectionTimeout), - // Для прямого WebRTC соединения - webrtc: { - signalingCompleted: false, - directConnection: false, - state: 'initialized', - stunServers: ['stun:stun.l.google.com:19302'] // STUN серверы для NAT traversal - } - }; - - this.connectionRequests.set(connectionId, connectionRequest); - - // Устанавливаем таймаут - const timeoutId = setTimeout(async () => { - await this.handleConnectionTimeout(connectionId); - }, this.connectionTimeout); - - this.connectionTimeouts.set(connectionId, timeoutId); - - // Отправляем запрос Android устройству - const device = this.deviceManager.getDevice(deviceId); - if (!device || !device.isConnected()) { - this.logger.error(`❌ Device not connected: ${deviceId}`); - this.connectionRequests.delete(connectionId); - clearTimeout(timeoutId); - this.connectionTimeouts.delete(connectionId); - throw new Error('Device not connected'); - } - - const requestData = { - sessionId: connectionId, - operatorId: operatorId, - cameraType: cameraType - }; - - this.logger.info(`📱 Sending camera:request to Android device ${deviceId}`); - device.socket.emit('camera:request', requestData); - - // Добавляем сессию к участникам - device.addSession(connectionId); - const operator = this.deviceManager.getOperator(operatorId); - if (operator) { - operator.addSession(connectionId); - } - - this.logger.info(`✅ Connection request created: ${connectionId}`); - return { success: true, connectionId, sessionId: connectionId }; - } - - /** - * Принятие запроса на подключение от устройства - * @param {string} connectionId - * @param {object} connectionData - * @returns {Promise} {success: boolean, error?: string} - */ - async acceptConnection(connectionId, connectionData = {}) { - const request = this.connectionRequests.get(connectionId); - if (!request) { - this.logger.error(`❌ Connection request not found: ${connectionId}`); - throw new Error('Connection request not found'); - } - - // Очищаем таймаут - this.clearConnectionTimeout(connectionId); - - // Создаем активное соединение - const connection = { - connectionId, - operatorId: request.operatorId, - deviceId: request.deviceId, - cameraType: request.cameraType, - status: 'active', - establishedAt: new Date(), - streamUrl: connectionData.streamUrl || 'webrtc', - lastActivity: new Date() - }; - - this.activeConnections.set(connectionId, connection); - this.connectionRequests.delete(connectionId); - - // Обновляем сессию - const session = this.sessionManager.getSession(connectionId); - if (session) { - session.updateStatus('active', { streamUrl: connection.streamUrl }); - } - - this.logger.info(`✅ Connection established: ${connectionId}`); - return connection; - } - - /** - * Отклонение запроса на подключение - * @param {string} connectionId - * @param {string} reason - * @returns {Promise} {success: boolean, error?: string} - */ - async rejectConnection(connectionId, reason = 'User rejected') { - const request = this.connectionRequests.get(connectionId); - if (!request) { - this.logger.error(`❌ Connection request not found: ${connectionId}`); - throw new Error('Connection request not found'); - } - - // Очищаем таймаут - this.clearConnectionTimeout(connectionId); - - // Обновляем сессию - const session = this.sessionManager.getSession(connectionId); - if (session) { - session.updateStatus('denied', { error: reason }); - } - - this.connectionRequests.delete(connectionId); - - this.logger.info(`❌ Connection rejected: ${connectionId} - ${reason}`); - return { success: true }; - } - - /** - * Завершение активного соединения - * @param {string} connectionId - * @param {string} reason - * @returns {Promise} {success: boolean, error?: string} - */ - async terminateConnection(connectionId, reason = 'Connection terminated') { - // Ищем соединение в активных или ожидающих - const connection = this.activeConnections.get(connectionId); - const request = this.connectionRequests.get(connectionId); - - if (!connection && !request) { - this.logger.error(`❌ Connection not found: ${connectionId}`); - throw new Error('Connection not found'); - } - - // Закрываем сессию - this.sessionManager.closeSession(connectionId); - - // Удаляем из соответствующих коллекций - if (connection) { - this.activeConnections.delete(connectionId); - } - if (request) { - this.connectionRequests.delete(connectionId); - } - - // Очищаем устройство и оператора - const target = connection || request; - const device = this.deviceManager.getDevice(target.deviceId); - const operator = this.deviceManager.getOperator(target.operatorId); - - if (device) { - device.removeSession(connectionId); - } - if (operator) { - operator.removeSession(connectionId); - } - - this.logger.info(`🔌 Connection terminated: ${connectionId} - ${reason}`); - return target; - } - - /** - * Обработка таймаута соединения - * @param {string} connectionId - */ - async handleConnectionTimeout(connectionId) { - this.logger.warn(`⏰ Connection timeout: ${connectionId}`); - - try { - // Проверяем есть ли запрос перед отклонением - const request = this.connectionRequests.get(connectionId); - if (request) { - await this.rejectConnection(connectionId, 'Connection timeout'); - } else { - this.logger.info(`Connection ${connectionId} already removed from pending requests`); - } - } catch (error) { - this.logger.error(`Error handling timeout for ${connectionId}:`, error.message); - } - - // Уведомляем участников о таймауте - const request = this.connectionRequests.get(connectionId); - if (request) { - const operator = this.deviceManager.getOperator(request.operatorId); - if (operator && operator.isConnected()) { - operator.socket.emit('connection:timeout', { - connectionId, - deviceId: request.deviceId, - error: 'Connection request timeout' - }); - } - } - } - - /** - * Очистка таймаута соединения - * @param {string} connectionId - */ - clearConnectionTimeout(connectionId) { - const timeoutId = this.connectionTimeouts.get(connectionId); - if (timeoutId) { - clearTimeout(timeoutId); - this.connectionTimeouts.delete(connectionId); - } - } - - /** - * Получение статистики соединений - * @returns {object} - */ - getConnectionStats() { - return { - pendingRequests: this.connectionRequests.size, - activeConnections: this.activeConnections.size, - totalRequestsProcessed: this.connectionRequests.size + this.activeConnections.size, - averageConnectionTime: this.calculateAverageConnectionTime() - }; - } - - /** - * Расчет среднего времени установки соединения - * @returns {number} время в миллисекундах - */ - calculateAverageConnectionTime() { - if (this.activeConnections.size === 0) return 0; - - let totalTime = 0; - let count = 0; - - for (const connection of this.activeConnections.values()) { - if (connection.establishedAt) { - // Примерное время установки соединения (можно улучшить, сохраняя время запроса) - totalTime += 2000; // placeholder - count++; - } - } - - return count > 0 ? totalTime / count : 0; - } - - /** - * Получение активного соединения - * @param {string} connectionId - * @returns {object|null} - */ - getConnection(connectionId) { - return this.activeConnections.get(connectionId) || null; - } - - /** - * Получение всех активных соединений для оператора - * @param {string} operatorId - * @returns {Array} - */ - getOperatorConnections(operatorId) { - return Array.from(this.activeConnections.values()) - .filter(conn => conn.operatorId === operatorId); - } - - /** - * Получение всех активных соединений для устройства - * @param {string} deviceId - * @returns {Array} - */ - getDeviceConnections(deviceId) { - return Array.from(this.activeConnections.values()) - .filter(conn => conn.deviceId === deviceId); - } - - /** - * Очистка устаревших запросов и неактивных соединений - */ - async cleanup() { - const now = new Date(); - - // Очищаем устаревшие запросы - for (const [connectionId, request] of this.connectionRequests.entries()) { - if (now > request.timeoutAt) { - await this.handleConnectionTimeout(connectionId); - } - } - - // Проверяем активные соединения на отключенные сокеты - for (const [connectionId, connection] of this.activeConnections.entries()) { - const device = this.deviceManager.getDevice(connection.deviceId); - const operator = this.deviceManager.getOperator(connection.operatorId); - - if (!device || !device.isConnected() || !operator || !operator.isConnected()) { - try { - await this.terminateConnection(connectionId, 'Participant disconnected'); - } catch (error) { - this.logger.error(`Error terminating connection ${connectionId}:`, error); - } - } - } - - this.logger.debug(`🧹 Connection cleanup completed. Active: ${this.activeConnections.size}, Pending: ${this.connectionRequests.size}`); - } - - /** - * Очистка всех подключений устройства при его отключении - * @param {string} deviceId - */ - async cleanupDeviceConnections(deviceId) { - this.logger.info(`🧹 Cleaning up connections for device: ${deviceId}`); - - const connectionsToTerminate = []; - - // Находим все активные подключения устройства - for (const [connectionId, connection] of this.activeConnections.entries()) { - if (connection.deviceId === deviceId) { - connectionsToTerminate.push(connectionId); - } - } - - // Находим все ожидающие запросы для устройства - for (const [connectionId, request] of this.connectionRequests.entries()) { - if (request.deviceId === deviceId) { - connectionsToTerminate.push(connectionId); - } - } - - // Завершаем все найденные подключения - for (const connectionId of connectionsToTerminate) { - try { - await this.terminateConnection(connectionId, 'Device disconnected'); - } catch (error) { - this.logger.error(`Error terminating connection ${connectionId}:`, error); - } - } - - this.logger.info(`🧹 Cleaned up ${connectionsToTerminate.length} connections for device ${deviceId}`); - } - - /** - * Очистка всех подключений оператора при его отключении - * @param {string} operatorId - */ - async cleanupOperatorConnections(operatorId) { - this.logger.info(`🧹 Cleaning up connections for operator: ${operatorId}`); - - const connectionsToTerminate = []; - - // Находим все активные подключения оператора - for (const [connectionId, connection] of this.activeConnections.entries()) { - if (connection.operatorId === operatorId) { - connectionsToTerminate.push(connectionId); - } - } - - // Находим все ожидающие запросы от оператора - for (const [connectionId, request] of this.connectionRequests.entries()) { - if (request.operatorId === operatorId) { - connectionsToTerminate.push(connectionId); - } - } - - // Завершаем все найденные подключения - for (const connectionId of connectionsToTerminate) { - try { - await this.terminateConnection(connectionId, 'Operator disconnected'); - } catch (error) { - this.logger.error(`Error terminating connection ${connectionId}:`, error); - } - } - - this.logger.info(`🧹 Cleaned up ${connectionsToTerminate.length} connections for operator ${operatorId}`); - } - - /** - * Обновление WebRTC состояния соединения - * @param {string} connectionId - * @param {string} state - offer_sent, answer_sent, ice_completed, connected - */ - updateWebRTCState(connectionId, state) { - const connection = this.activeConnections.get(connectionId); - const request = this.connectionRequests.get(connectionId); - - const target = connection || request; - if (!target || !target.webrtc) { - this.logger.error(`❌ Cannot update WebRTC state for connection: ${connectionId}`); - return false; - } - - target.webrtc.state = state; - target.webrtc.lastUpdated = new Date(); - - // Если соединение установлено, переходим в режим прямого соединения - if (state === 'connected') { - target.webrtc.signalingCompleted = true; - target.webrtc.directConnection = true; - this.logger.info(`🔗 WebRTC direct connection established: ${connectionId}`); - } - - this.logger.info(`🔄 WebRTC state updated: ${connectionId} -> ${state}`); - return true; - } - - /** - * Проверка готовности к прямому соединению - * @param {string} connectionId - * @returns {boolean} - */ - isDirectConnectionReady(connectionId) { - const connection = this.activeConnections.get(connectionId); - const request = this.connectionRequests.get(connectionId); - - const target = connection || request; - if (!target || !target.webrtc) { - return false; - } - - return target.webrtc.signalingCompleted && target.webrtc.directConnection; - } - - /** - * Получение WebRTC информации соединения - * @param {string} connectionId - * @returns {object|null} - */ - getWebRTCInfo(connectionId) { - const connection = this.activeConnections.get(connectionId); - const request = this.connectionRequests.get(connectionId); - - const target = connection || request; - if (!target || !target.webrtc) { - return null; - } - - return { - connectionId, - state: target.webrtc.state, - signalingCompleted: target.webrtc.signalingCompleted, - directConnection: target.webrtc.directConnection, - lastUpdated: target.webrtc.lastUpdated, - stunServers: target.webrtc.stunServers - }; - } -} - -module.exports = { ConnectionManager }; \ No newline at end of file diff --git a/backend/src/managers/DeviceManager.js b/backend/src/managers/DeviceManager.js index 9523772..81b27d0 100644 --- a/backend/src/managers/DeviceManager.js +++ b/backend/src/managers/DeviceManager.js @@ -12,29 +12,9 @@ class DeviceManager { * @returns {DeviceInfo} */ registerDevice(deviceId, deviceInfo, socket) { - // Проверяем, существует ли уже устройство с этим ID - const existingDevice = this.devices.get(deviceId); - - if (existingDevice) { - // Обновляем существующее устройство при переподключении - existingDevice.socket = socket; - existingDevice.updateStatus('connected'); - existingDevice.connectedAt = Date.now(); - existingDevice.lastSeen = Date.now(); - - // Обновляем информацию об устройстве - existingDevice.deviceInfo = { ...existingDevice.deviceInfo, ...deviceInfo }; - existingDevice.capabilities = existingDevice.parseCapabilities(deviceInfo); - - console.log(`Device reconnected: ${deviceId}`); - return existingDevice; - } else { - // Создаем новое устройство - const device = new DeviceInfo(deviceId, deviceInfo, socket); - this.devices.set(deviceId, device); - console.log(`New device registered: ${deviceId}`); - return device; - } + const device = new DeviceInfo(deviceId, deviceInfo, socket); + this.devices.set(deviceId, device); + return device; } /** @@ -45,31 +25,9 @@ class DeviceManager { * @returns {OperatorInfo} */ registerOperator(operatorId, operatorInfo, socket) { - // Проверяем, существует ли уже оператор с этим ID - const existingOperator = this.operators.get(operatorId); - - if (existingOperator) { - // Обновляем существующего оператора при переподключении - existingOperator.socket = socket; - existingOperator.status = 'connected'; - existingOperator.connectedAt = Date.now(); - existingOperator.lastSeen = Date.now(); - - // Обновляем информацию об операторе только если она предоставлена - if (operatorInfo) { - existingOperator.operatorInfo = { ...existingOperator.operatorInfo, ...operatorInfo }; - existingOperator.permissions = operatorInfo.permissions || existingOperator.permissions; - } - - console.log(`Operator reconnected: ${operatorId}`); - return existingOperator; - } else { - // Создаем нового оператора - const operator = new OperatorInfo(operatorId, operatorInfo, socket); - this.operators.set(operatorId, operator); - console.log(`New operator registered: ${operatorId}`); - return operator; - } + const operator = new OperatorInfo(operatorId, operatorInfo, socket); + this.operators.set(operatorId, operator); + return operator; } /** @@ -126,8 +84,7 @@ class DeviceManager { const device = this.devices.get(deviceId); if (device) { device.disconnect(); - // НЕ удаляем устройство из Map, только обновляем статус - // Устройство может быть переподключено позже + this.devices.delete(deviceId); } } @@ -139,116 +96,10 @@ class DeviceManager { const operator = this.operators.get(operatorId); if (operator) { operator.disconnect(); - // НЕ удаляем оператора из Map, только обновляем статус - // Оператор может быть переподключен позже + this.operators.delete(operatorId); } } - /** - * Получение статистики подключений - * @returns {object} - */ - getConnectionStats() { - const connectedDevices = this.getConnectedDevices(); - const connectedOperators = this.getConnectedOperators(); - - return { - devices: { - total: this.devices.size, - connected: connectedDevices.length, - available: connectedDevices.filter(d => d.canAcceptNewSession()).length, - busy: connectedDevices.filter(d => !d.canAcceptNewSession()).length - }, - operators: { - total: this.operators.size, - connected: connectedOperators.length, - active: connectedOperators.filter(o => o.hasActiveSessions()).length - } - }; - } - - /** - * Поиск устройства по сокету - * @param {object} socket - * @returns {DeviceInfo|null} - */ - findDeviceBySocket(socket) { - for (const device of this.devices.values()) { - if (device.socket === socket) { - return device; - } - } - return null; - } - - /** - * Поиск оператора по сокету - * @param {object} socket - * @returns {OperatorInfo|null} - */ - findOperatorBySocket(socket) { - for (const operator of this.operators.values()) { - if (operator.socket === socket) { - return operator; - } - } - return null; - } - - /** - * Очистка отключенных устройств и операторов - */ - cleanupDisconnected() { - // Очищаем отключенные устройства - for (const [deviceId, device] of this.devices.entries()) { - if (!device.isConnected()) { - console.log(`Removing disconnected device: ${deviceId}`); - this.devices.delete(deviceId); - } - } - - // Очищаем отключенных операторов - for (const [operatorId, operator] of this.operators.entries()) { - if (!operator.isConnected()) { - console.log(`Removing disconnected operator: ${operatorId}`); - this.operators.delete(operatorId); - } - } - } - - /** - * Проверка возможности создания сессии - * @param {string} deviceId - * @param {string} operatorId - * @returns {object} {canConnect: boolean, reason?: string} - */ - canCreateSession(deviceId, operatorId) { - const device = this.getDevice(deviceId); - const operator = this.getOperator(operatorId); - - if (!device) { - return { canConnect: false, reason: 'Device not found' }; - } - - if (!operator) { - return { canConnect: false, reason: 'Operator not found' }; - } - - if (!device.isConnected()) { - return { canConnect: false, reason: 'Device not connected' }; - } - - if (!operator.isConnected()) { - return { canConnect: false, reason: 'Operator not connected' }; - } - - if (!device.canAcceptNewSession()) { - return { canConnect: false, reason: 'Device busy or unavailable' }; - } - - return { canConnect: true }; - } - /** * Обновление местоположения устройства * @param {string} deviceId @@ -299,7 +150,7 @@ class DeviceManager { getDevicesByPlatform() { const stats = {}; Array.from(this.devices.values()).forEach(device => { - const platform = device.deviceInfo.manufacturer || 'unknown'; + const platform = device.deviceInfo?.manufacturer || 'unknown'; stats[platform] = (stats[platform] || 0) + 1; }); return stats; @@ -375,15 +226,19 @@ class DeviceInfo { * @returns {object} */ parseCapabilities(deviceInfo) { - // Поддерживаем как массив, так и строку для availableCameras - let availableCameras; - if (Array.isArray(deviceInfo.availableCameras)) { - availableCameras = deviceInfo.availableCameras; - } else if (typeof deviceInfo.availableCameras === 'string') { - availableCameras = deviceInfo.availableCameras.split(','); - } else { - availableCameras = ['back']; // fallback + // Проверяем, что deviceInfo существует + if (!deviceInfo || typeof deviceInfo !== 'object') { + return { + cameras: ['back'], + hasMultipleCameras: false, + hasUltraWide: false, + hasTelephoto: false, + supportedResolutions: ['720p', '1080p'], + maxConcurrentSessions: 1 + }; } + + const availableCameras = deviceInfo.availableCameras?.split(',') || ['back']; return { cameras: availableCameras, @@ -400,10 +255,7 @@ class DeviceInfo { * @returns {boolean} */ isConnected() { - // Устройство подключено если есть активный сокет и статус не 'disconnected' - return this.socket && - this.socket.connected && - this.status !== 'disconnected'; + return this.socket && this.socket.connected && this.status === 'connected'; } /** @@ -526,7 +378,7 @@ class OperatorInfo { this.lastSeen = Date.now(); this.activeSessions = new Set(); this.totalSessions = 0; - this.permissions = this.operatorInfo.permissions || ['view_cameras', 'request_camera', 'initiate_connection']; + this.permissions = this.operatorInfo.permissions || ['view_cameras', 'request_camera']; } /** @@ -563,22 +415,6 @@ class OperatorInfo { this.activeSessions.delete(sessionId); } - /** - * Проверка наличия активных сессий - * @returns {boolean} - */ - hasActiveSessions() { - return this.activeSessions.size > 0; - } - - /** - * Получение количества активных сессий - * @returns {number} - */ - getActiveSessionsCount() { - return this.activeSessions.size; - } - /** * Обновление последнего времени активности */ diff --git a/android-client/.gradle/7.5/gc.properties b/backend/src/managers/UniversalVideoManager.js similarity index 100% rename from android-client/.gradle/7.5/gc.properties rename to backend/src/managers/UniversalVideoManager.js diff --git a/backend/src/routes/operators.js b/backend/src/routes/operators.js index 698439a..5cfc9cc 100644 --- a/backend/src/routes/operators.js +++ b/backend/src/routes/operators.js @@ -334,192 +334,4 @@ router.post('/ping/:deviceId', authenticateOperator, requirePermission('view_cam } }); -/** - * POST /api/operators/connections/request - * Инициация подключения к устройству - */ -router.post('/connections/request', authenticateOperator, requirePermission('initiate_connection'), async (req, res) => { - try { - const { deviceId, cameraType = 'back' } = req.body; - const { connectionManager } = req.app.locals; - - if (!deviceId) { - return res.status(400).json({ error: 'Device ID required' }); - } - - const result = await connectionManager.initiateConnection( - req.operator.operatorId, - deviceId, - cameraType - ); - - res.json({ - success: true, - connectionId: result.connectionId, - sessionId: result.sessionId, - message: 'Connection request initiated' - }); - - } catch (error) { - res.status(400).json({ error: error.message }); - } -}); - -/** - * PUT /api/operators/connections/:connectionId/accept - * Принятие подключения (используется Android устройством) - */ -router.put('/connections/:connectionId/accept', async (req, res) => { - try { - const { connectionId } = req.params; - const { connectionManager } = req.app.locals; - - const result = await connectionManager.acceptConnection(connectionId, req.body); - - res.json({ - success: true, - connection: result, - message: 'Connection accepted' - }); - - } catch (error) { - res.status(400).json({ error: error.message }); - } -}); - -/** - * PUT /api/operators/connections/:connectionId/reject - * Отклонение подключения - */ -router.put('/connections/:connectionId/reject', async (req, res) => { - try { - const { connectionId } = req.params; - const { reason = 'User rejected' } = req.body; - const { connectionManager } = req.app.locals; - - const result = await connectionManager.rejectConnection(connectionId, reason); - - res.json({ - success: true, - message: 'Connection rejected', - reason: reason - }); - - } catch (error) { - res.status(400).json({ error: error.message }); - } -}); - -/** - * DELETE /api/operators/connections/:connectionId - * Завершение активного подключения - */ -router.delete('/connections/:connectionId', async (req, res) => { - try { - const { connectionId } = req.params; - const { reason = 'Connection terminated by user' } = req.body; - const { connectionManager } = req.app.locals; - - const result = await connectionManager.terminateConnection(connectionId, reason); - - res.json({ - success: true, - message: 'Connection terminated', - reason: reason - }); - - } catch (error) { - res.status(400).json({ error: error.message }); - } -}); - -/** - * GET /api/operators/connections - * Получение списка подключений оператора - */ -router.get('/connections', authenticateOperator, (req, res) => { - try { - const { connectionManager } = req.app.locals; - const connections = connectionManager.getOperatorConnections(req.operator.operatorId); - - res.json({ - success: true, - connections: connections, - total: connections.length - }); - - } catch (error) { - res.status(500).json({ error: error.message }); - } -}); - -/** - * GET /api/operators/connections/:connectionId - * Получение информации о конкретном подключении - */ -router.get('/connections/:connectionId', (req, res) => { - try { - const { connectionId } = req.params; - const { connectionManager } = req.app.locals; - - const connection = connectionManager.getConnection(connectionId); - - if (!connection) { - return res.status(404).json({ error: 'Connection not found' }); - } - - res.json({ - success: true, - connection: connection - }); - - } catch (error) { - res.status(500).json({ error: error.message }); - } -}); - -/** - * GET /api/operators/connections/:connectionId/webrtc - * Получение WebRTC информации подключения - */ -router.get('/connections/:connectionId/webrtc', (req, res) => { - try { - const { connectionId } = req.params; - const { connectionManager } = req.app.locals; - - const webrtcInfo = connectionManager.getWebRTCInfo(connectionId); - - if (!webrtcInfo) { - return res.status(404).json({ error: 'WebRTC info not found' }); - } - - res.json({ - success: true, - webrtc: webrtcInfo - }); - - } catch (error) { - res.status(500).json({ error: error.message }); - } -}); - -/** - * GET /api/operators/stats - * Получение статистики подключений - */ -router.get('/stats', authenticateOperator, (req, res) => { - try { - const { connectionManager } = req.app.locals; - const stats = connectionManager.getConnectionStats(); - - res.json({ - success: true, - stats: stats - }); - - } catch (error) { - res.status(500).json({ error: error.message }); - } -}); - module.exports = router; \ No newline at end of file diff --git a/backend/src/server.js b/backend/src/server.js index 14ea551..d713170 100644 --- a/backend/src/server.js +++ b/backend/src/server.js @@ -1,5 +1,3 @@ -const path = require('path'); - const express = require('express'); const http = require('http'); const socketIo = require('socket.io'); @@ -10,7 +8,6 @@ const winston = require('winston'); // Импорт наших менеджеров const { SessionManager } = require('./managers/SessionManager'); const { DeviceManager } = require('./managers/DeviceManager'); -const { ConnectionManager } = require('./managers/ConnectionManager'); // Импорт роутов const operatorsRouter = require('./routes/operators'); @@ -41,41 +38,15 @@ const io = socketIo(server, { // Middleware app.use(cors()); app.use(express.json()); -app.use(express.static(path.join(__dirname, '../public'))); // Статические файлы - -// Роуты для веб-интерфейсов -app.get('/', (req, res) => { - const userAgent = req.headers['user-agent'] || ''; - const isMobile = /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent); - - if (isMobile) { - // Перенаправляем мобильные устройства на мобильную версию - res.sendFile(path.join(__dirname, '../public/mobile.html')); - } else { - // Десктопная версия (демо) - res.sendFile(path.join(__dirname, '../public/index.html')); - } -}); - -// Принудительная мобильная версия -app.get('/mobile', (req, res) => { - res.sendFile(path.join(__dirname, '../public/mobile.html')); -}); - -// Принудительная десктопная версия -app.get('/demo', (req, res) => { - res.sendFile(path.join(__dirname, '../public/index.html')); -}); +app.use(express.static('public')); // Для статических файлов демо // Инициализация менеджеров const sessionManager = new SessionManager(); const deviceManager = new DeviceManager(); -const connectionManager = new ConnectionManager(sessionManager, deviceManager, logger); // Делаем менеджеры доступными в роутах app.locals.sessionManager = sessionManager; app.locals.deviceManager = deviceManager; -app.locals.connectionManager = connectionManager; app.locals.logger = logger; app.locals.io = io; @@ -110,36 +81,7 @@ app.get('/api/devices', (req, res) => { // WebSocket обработчики io.on('connection', (socket) => { - const userAgent = socket.handshake.headers['user-agent'] || ''; - const isAndroidClient = userAgent.includes('okhttp'); - const isMobileWeb = !isAndroidClient && /Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent); - - logger.info(`New connection: ${socket.id}`, { - address: socket.handshake.address, - userAgent: userAgent, - isAndroid: isAndroidClient, - isMobileWeb: isMobileWeb - }); - - if (isAndroidClient) { - logger.info(`🤖 Android client connected: ${socket.id}`); - // Логируем все события от Android клиента - socket.onAny((eventName, ...args) => { - logger.info(`📱 Android event: ${eventName}`, args[0]); - }); - - // Отправляем приветственное сообщение Android клиенту - socket.emit('server:hello', { - message: 'Server ready for registration', - expectedEvent: 'register:android' - }); - } else if (isMobileWeb) { - logger.info(`📱 Mobile web client connected: ${socket.id}`); - // Логируем события от мобильного веб-клиента - socket.onAny((eventName, ...args) => { - logger.info(`🌐 Mobile web event: ${eventName}`, args[0]); - }); - } + logger.info(`New connection: ${socket.id}`); // Регистрация Android клиента socket.on('register:android', (data) => { @@ -156,55 +98,14 @@ io.on('connection', (socket) => { .map(op => op.socket); operatorSockets.forEach(opSocket => { - opSocket.emit('device:connected', { - deviceId, - deviceInfo: device.getSummary() - }); + opSocket.emit('device:connected', device.getSummary()); }); socket.emit('register:success', { deviceId }); }); - // Регистрация мобильного веб-клиента - socket.on('register:mobile_web', (data) => { - const { deviceId, deviceInfo } = data; - - // Регистрируем мобильное веб-устройство - const device = deviceManager.registerDevice(deviceId, { - ...deviceInfo, - platform: 'mobile_web', - type: 'web_camera' - }, socket); - - logger.info(`Mobile web client registered: ${deviceId}`, deviceInfo); - - // Уведомляем всех операторов о новом устройстве - const operatorSockets = Array.from(deviceManager.operators.values()) - .filter(op => op.isConnected()) - .map(op => op.socket); - - operatorSockets.forEach(opSocket => { - opSocket.emit('device:connected', { - deviceId, - deviceInfo: device.getSummary() - }); - }); - - socket.emit('register:success', { deviceId }); - }); - - // Fallback: если Android отправляет register:operator вместо register:android + // Регистрация оператора socket.on('register:operator', (data) => { - const userAgent = socket.handshake.headers['user-agent'] || ''; - if (userAgent.includes('okhttp')) { - logger.warn(`🚨 Android client sent wrong event! ${socket.id} sent 'register:operator' instead of 'register:android'`); - socket.emit('register:error', { - error: 'Android clients should use register:android event, not register:operator' - }); - return; - } - - // Обычная обработка для реальных операторов const { operatorId, operatorInfo } = data; const finalOperatorId = operatorId || uuidv4(); @@ -223,199 +124,192 @@ io.on('connection', (socket) => { }); }); - // Запрос на подключение к камере через ConnectionManager - socket.on('camera:request', async (data) => { + // Запрос на подключение к камере (только через WebSocket для обратной совместимости) + socket.on('camera:request', (data) => { const { deviceId, cameraType = 'back' } = data; - logger.info(`📷 Camera request received from operator socket ${socket.id}`); - logger.info(`📷 Request data:`, { deviceId, cameraType }); - // Получаем оператора из менеджера устройств const operator = Array.from(deviceManager.operators.values()) .find(op => op.socket === socket); if (!operator) { - logger.error(`❌ Operator not found for socket ${socket.id}`); socket.emit('camera:error', { error: 'Operator not registered' }); return; } - logger.info(`✅ Operator found: ${operator.operatorId}`); - - try { - // Используем ConnectionManager для создания подключения - const connection = await connectionManager.initiateConnection( - operator.operatorId, - deviceId, - cameraType - ); - - logger.info(`✅ Connection initiated: ${connection.connectionId}`); - - // Уведомляем оператора о создании подключения - socket.emit('connection:initiated', { - connectionId: connection.connectionId, - sessionId: connection.sessionId, - deviceId: deviceId, - cameraType: cameraType, - status: 'pending', - createdAt: new Date().toISOString() - }); - - } catch (error) { - logger.error(`❌ Failed to initiate connection: ${error.message}`); - socket.emit('camera:error', { error: error.message }); + const device = deviceManager.getDevice(deviceId); + if (!device || !device.canAcceptNewSession()) { + socket.emit('camera:error', { error: 'Device not available' }); + return; } + + // Создаем сессию + const session = sessionManager.createSession(deviceId, operator.operatorId, cameraType); + + logger.info(`Camera request: operator ${operator.operatorId} -> device ${deviceId}`); + + // Отправляем запрос Android клиенту + device.socket.emit('camera:request', { + sessionId: session.sessionId, + operatorId: operator.operatorId, + cameraType + }); + + // Добавляем сессию к участникам + device.addSession(session.sessionId); + operator.addSession(session.sessionId); + + socket.emit('camera:request-sent', { sessionId: session.sessionId, deviceId }); }); - // Ответ от Android клиента на запрос камеры через ConnectionManager - socket.on('camera:response', async (data) => { - const { sessionId, accepted, streamUrl, error } = data; - - logger.info(`📱 Camera response received from Android: sessionId=${sessionId}, accepted=${accepted}`); - - try { - if (accepted) { - // Принимаем подключение через ConnectionManager - const connection = await connectionManager.acceptConnection(sessionId, { streamUrl }); - - logger.info(`✅ Connection accepted: ${connection.connectionId}`); - - // Получаем оператора для уведомления - const operator = deviceManager.getOperator(connection.operatorId); - if (operator && operator.isConnected()) { - operator.socket.emit('connection:accepted', { - connectionId: connection.connectionId, - sessionId: sessionId, - deviceId: connection.deviceId, - cameraType: connection.cameraType, - streamUrl: streamUrl, - status: 'active' - }); - - // Отправляем старое событие для обратной совместимости - operator.socket.emit('camera:response', { - success: true, - sessionId: sessionId, - session: { - id: sessionId, - deviceId: connection.deviceId, - cameraType: connection.cameraType - } - }); - } - } else { - // Отклоняем подключение через ConnectionManager - await connectionManager.rejectConnection(sessionId, error); - - logger.info(`❌ Connection rejected: sessionId=${sessionId}, error=${error}`); - - // Находим подключение для получения информации об операторе - const connection = connectionManager.getConnection(sessionId); - if (connection) { - const operator = deviceManager.getOperator(connection.operatorId); - if (operator && operator.isConnected()) { - operator.socket.emit('connection:rejected', { - sessionId: sessionId, - deviceId: connection.deviceId, - cameraType: connection.cameraType, - error: error - }); - - // Отправляем старое событие для обратной совместимости - operator.socket.emit('camera:response', { - success: false, - sessionId: sessionId, - message: error - }); - } - } - } - } catch (error) { - logger.error(`❌ Failed to handle camera response: ${error.message}`); - socket.emit('camera:error', { error: error.message }); - } - - // Переключение камеры в активной сессии - socket.on('camera:switch', (data) => { - const { sessionId, cameraType } = data; + // НОВОЕ: Обработчик подтверждения камеры от Android приложения + socket.on('camera_approved', (data) => { + logger.info(`📱 Camera approved from ${socket.id}: ${JSON.stringify(data)}`); + const { sessionId, operatorId, cameraType } = data; const session = sessionManager.getSession(sessionId); - + if (!session) { - socket.emit('camera:error', { error: 'Session not found' }); + logger.warn(`❌ Session not found for camera_approved: ${sessionId}`); return; } - - // Получаем участников сессии - const device = deviceManager.getDevice(session.deviceId); + const operator = deviceManager.getOperator(session.operatorId); - - // Проверяем, что запрос идет от оператора этой сессии - if (!operator || operator.socket !== socket) { - socket.emit('camera:error', { error: 'Unauthorized to switch camera in this session' }); + if (!operator || !operator.isConnected()) { + logger.warn(`❌ Operator not found for session: ${sessionId}`); return; } - - // Проверяем, что сессия активна - if (session.status !== 'active') { - socket.emit('camera:error', { error: 'Session is not active' }); - return; - } - - logger.info(`Camera switch requested: session ${sessionId}, camera ${cameraType}`); - - // Отправляем запрос на переключение устройству - if (device && device.isConnected()) { - device.socket.emit('camera:switch', { - sessionId: sessionId, - cameraType: cameraType - }); - - // Обновляем тип камеры в сессии - session.cameraType = cameraType; - } else { - socket.emit('camera:error', { error: 'Device not connected' }); - } + + // Обновляем статус сессии + session.updateStatus('approved'); + logger.info(`✅ Camera approved: session ${sessionId}`); + + // Уведомляем оператора + operator.socket.emit('camera_approved', { + sessionId, + deviceId: session.deviceId, + cameraType: session.cameraType, + status: 'approved' + }); }); - // Завершение сессии по инициативе оператора - socket.on('session:end', (data) => { + // НОВОЕ: Обработчик запуска камеры от Android приложения + socket.on('camera_started', (data) => { + logger.info(`📱 Camera started from ${socket.id}: ${JSON.stringify(data)}`); const { sessionId } = data; const session = sessionManager.getSession(sessionId); + + if (!session) { + logger.warn(`❌ Session not found for camera_started: ${sessionId}`); + return; + } + + const operator = deviceManager.getOperator(session.operatorId); + if (!operator || !operator.isConnected()) { + logger.warn(`❌ Operator not found for session: ${sessionId}`); + return; + } + + // Обновляем статус сессии на активный + session.updateStatus('active'); + logger.info(`✅ Camera stream started: session ${sessionId}`); + + // Уведомляем оператора с обновленным статусом + operator.socket.emit('camera_started', { + sessionId, + deviceId: session.deviceId, + cameraType: session.cameraType, + status: 'active' + }); + + // Также отправляем обновление статуса сессии + operator.socket.emit('session_status_update', { + sessionId, + status: 'active', + cameraType: session.cameraType + }); + }); + + // НОВОЕ: Обработчик отклонения камеры от Android приложения + socket.on('camera_rejected', (data) => { + logger.info(`📱 Camera rejected from ${socket.id}: ${JSON.stringify(data)}`); + const { sessionId, reason = 'Отклонено пользователем' } = data; + const session = sessionManager.getSession(sessionId); + + if (!session) { + logger.warn(`❌ Session not found for camera_rejected: ${sessionId}`); + return; + } + + const operator = deviceManager.getOperator(session.operatorId); + if (operator && operator.isConnected()) { + // Уведомляем оператора об отклонении + operator.socket.emit('camera_rejected', { + sessionId, + deviceId: session.deviceId, + reason + }); + } + + // Закрываем отклоненную сессию + const device = deviceManager.getDevice(session.deviceId); + if (device) device.removeSession(sessionId); + if (operator) operator.removeSession(sessionId); + sessionManager.closeSession(sessionId); + + logger.info(`❌ Camera request rejected: session ${sessionId}, reason: ${reason}`); + }); + + // НОВОЕ: Обработчик ответа от Android устройства (правильный формат) + socket.on('camera:response', (data) => { + logger.info(`📱 Camera response from ${socket.id}: ${JSON.stringify(data)}`); + const { sessionId, accepted, streamUrl, error } = data; + const session = sessionManager.getSession(sessionId); if (!session) { - socket.emit('session:error', { error: 'Session not found' }); + logger.warn(`❌ Session not found for camera:response: ${sessionId}`); return; } - // Получаем участников сессии - const device = deviceManager.getDevice(session.deviceId); const operator = deviceManager.getOperator(session.operatorId); - - // Проверяем, что запрос идет от оператора этой сессии - if (!operator || operator.socket !== socket) { - socket.emit('session:error', { error: 'Unauthorized to end this session' }); + if (!operator || !operator.isConnected()) { + logger.warn(`❌ Operator not found for session: ${sessionId}`); return; } - logger.info(`Session ended by operator: ${sessionId}`); - - // Уведомляем устройство о завершении - if (device && device.isConnected()) { - device.socket.emit('camera:disconnect', { sessionId }); - device.removeSession(sessionId); + if (accepted) { + session.updateStatus('active', { streamUrl }); + logger.info(`✅ Camera stream accepted: session ${sessionId}`); + + // Уведомляем оператора об успешном принятии + operator.socket.emit('camera:stream-ready', { + sessionId, + streamUrl, + status: 'active', + cameraType: session.cameraType + }); + + // Также отправляем обновление статуса + operator.socket.emit('session_status_update', { + sessionId, + status: 'active', + cameraType: session.cameraType + }); + } else { + session.updateStatus('denied', { error }); + logger.info(`❌ Camera request denied: session ${sessionId}`, error); + + // Уведомляем оператора об отклонении + operator.socket.emit('camera:denied', { + sessionId, + error: error || 'Отклонено пользователем' + }); + + // Очищаем отклоненную сессию + const device = deviceManager.getDevice(session.deviceId); + if (device) device.removeSession(sessionId); + operator.removeSession(sessionId); + sessionManager.closeSession(sessionId); } - - // Уведомляем оператора о завершении - operator.socket.emit('session:ended', { - sessionId: sessionId, - deviceId: session.deviceId, - reason: 'Ended by operator' - }); - operator.removeSession(sessionId); - - // Закрываем сессию - sessionManager.closeSession(sessionId); }); // WebRTC сигнализация @@ -432,15 +326,11 @@ io.on('connection', (socket) => { if (device && device.socket === socket && operator && operator.isConnected()) { operator.socket.emit('webrtc:offer', { sessionId, offer }); session.updateWebRTCState('offer_sent'); - // Обновляем состояние в ConnectionManager - connectionManager.updateWebRTCState(sessionId, 'offer_sent'); } // Если отправитель - оператор, то получатель - устройство else if (operator && operator.socket === socket && device && device.isConnected()) { device.socket.emit('webrtc:offer', { sessionId, offer }); session.updateWebRTCState('offer_sent'); - // Обновляем состояние в ConnectionManager - connectionManager.updateWebRTCState(sessionId, 'offer_sent'); } } }); @@ -457,15 +347,11 @@ io.on('connection', (socket) => { if (device && device.socket === socket && operator && operator.isConnected()) { operator.socket.emit('webrtc:answer', { sessionId, answer }); session.updateWebRTCState('answer_sent'); - // Обновляем состояние в ConnectionManager - connectionManager.updateWebRTCState(sessionId, 'answer_sent'); } // Если отправитель - оператор, то получатель - устройство else if (operator && operator.socket === socket && device && device.isConnected()) { device.socket.emit('webrtc:answer', { sessionId, answer }); session.updateWebRTCState('answer_sent'); - // Обновляем состояние в ConnectionManager - connectionManager.updateWebRTCState(sessionId, 'answer_sent'); } } }); @@ -487,40 +373,9 @@ io.on('connection', (socket) => { } }); - // Обработчик установки WebRTC соединения - socket.on('webrtc:connected', (data) => { - const { sessionId } = data; - const session = sessionManager.getSession(sessionId); - - if (session) { - session.updateWebRTCState('connected'); - // Обновляем состояние в ConnectionManager - connectionManager.updateWebRTCState(sessionId, 'connected'); - - const device = deviceManager.getDevice(session.deviceId); - const operator = deviceManager.getOperator(session.operatorId); - - // Уведомляем обе стороны о переходе в прямой режим - if (device && device.isConnected()) { - device.socket.emit('webrtc:direct-mode', { - sessionId, - message: 'WebRTC connection established, switching to direct mode' - }); - } - - if (operator && operator.isConnected()) { - operator.socket.emit('webrtc:direct-mode', { - sessionId, - message: 'WebRTC connection established, switching to direct mode' - }); - } - - logger.info(`🔗 WebRTC connection established: ${sessionId}`); - } - }); - // Переключение типа камеры socket.on('camera:switch', (data) => { + logger.info(`Received camera:switch from ${socket.id}: ${JSON.stringify(data)}`); const { sessionId, cameraType } = data; const session = sessionManager.getSession(sessionId); @@ -528,12 +383,21 @@ io.on('connection', (socket) => { const device = deviceManager.getDevice(session.deviceId); const operator = deviceManager.getOperator(session.operatorId); + logger.info(`Session found: ${sessionId}, device: ${session.deviceId}, operator: ${session.operatorId}`); + logger.info(`Device connected: ${device ? device.isConnected() : 'not found'}`); + logger.info(`Operator socket matches: ${operator && operator.socket === socket}`); + // Проверяем права доступа if (operator && operator.socket === socket && device && device.isConnected()) { + logger.info(`Sending camera:switch to device ${session.deviceId}: ${cameraType}`); device.socket.emit('camera:switch', { sessionId, cameraType }); session.switchCamera(cameraType); logger.info(`Camera switch requested: ${sessionId} -> ${cameraType}`); + } else { + logger.warn(`Camera switch denied: operator=${!!operator}, device=${!!device}, connected=${device ? device.isConnected() : false}`); } + } else { + logger.warn(`Session not found for camera switch: ${sessionId}`); } }); @@ -554,11 +418,6 @@ io.on('connection', (socket) => { if (operator && operator.isConnected()) { operator.socket.emit('camera:disconnected', { sessionId }); - operator.socket.emit('session:ended', { - sessionId: sessionId, - deviceId: session.deviceId, - reason: 'Device disconnected' - }); operator.removeSession(sessionId); } @@ -574,81 +433,8 @@ io.on('connection', (socket) => { } }); - // Новые события для ConnectionManager - - // Завершение подключения от оператора - socket.on('connection:terminate', async (data) => { - const { connectionId } = data; - - logger.info(`🔚 Connection termination requested: ${connectionId}`); - - try { - await connectionManager.terminateConnection(connectionId); - - socket.emit('connection:terminated', { - connectionId: connectionId, - timestamp: new Date().toISOString() - }); - - logger.info(`✅ Connection terminated: ${connectionId}`); - } catch (error) { - logger.error(`❌ Failed to terminate connection: ${error.message}`); - socket.emit('connection:error', { error: error.message }); - } - }); - - // Запрос статистики подключений - socket.on('connection:status', (data, callback) => { - const stats = connectionManager.getConnectionStats(); - - if (callback) { - callback({ - success: true, - stats: stats, - timestamp: new Date().toISOString() - }); - } else { - socket.emit('connection:status_response', { - stats: stats, - timestamp: new Date().toISOString() - }); - } - }); - }); - - // Список активных подключений для оператора - socket.on('connection:list', (data, callback) => { - const operator = Array.from(deviceManager.operators.values()) - .find(op => op.socket === socket); - - if (!operator) { - const error = 'Operator not found'; - if (callback) { - callback({ success: false, error }); - } else { - socket.emit('connection:error', { error }); - } - return; - } - - const connections = connectionManager.getOperatorConnections(operator.operatorId); - - if (callback) { - callback({ - success: true, - connections: connections, - timestamp: new Date().toISOString() - }); - } else { - socket.emit('connection:list_response', { - connections: connections, - timestamp: new Date().toISOString() - }); - } - }); - - // Обработка отключения с ConnectionManager - socket.on('disconnect', async (reason) => { + // Обработка отключения + socket.on('disconnect', (reason) => { logger.info(`Client disconnected: ${socket.id}, reason: ${reason}`); // Находим устройство или оператора по сокету @@ -659,9 +445,6 @@ io.on('connection', (socket) => { .find(op => op.socket === socket); if (device) { - // Очищаем подключения устройства через ConnectionManager - await connectionManager.cleanupDeviceConnections(device.deviceId); - // Уведомляем операторов об отключении устройства const operators = deviceManager.getConnectedOperators(); operators.forEach(op => { @@ -676,9 +459,6 @@ io.on('connection', (socket) => { } if (operator) { - // Очищаем подключения оператора через ConnectionManager - await connectionManager.cleanupOperatorConnections(operator.operatorId); - // Завершаем активные сессии оператора sessionManager.closeOperatorSessions(operator.operatorId); deviceManager.disconnectOperator(operator.operatorId); @@ -714,15 +494,13 @@ process.on('SIGINT', () => { }); const PORT = process.env.PORT || 3001; -const HOST = process.env.HOST || '0.0.0.0'; // Слушаем на всех интерфейсах для доступа из эмулятора -server.listen(PORT, HOST, () => { - logger.info(`GodEye Backend Server running on ${HOST}:${PORT}`); - console.log(`🚀 Server started on http://${HOST}:${PORT}`); +server.listen(PORT, () => { + logger.info(`GodEye Backend Server running on port ${PORT}`); + console.log(`🚀 Server started on http://localhost:${PORT}`); console.log(`📊 Admin API: http://localhost:${PORT}/api/admin/stats`); console.log(`👥 Operators API: http://localhost:${PORT}/api/operators/devices`); console.log(`📱 Status: http://localhost:${PORT}/api/status`); console.log(`🌐 Demo: http://localhost:${PORT}/`); - console.log(`📱 Android emulator: http://10.0.2.2:${PORT}/`); }); diff --git a/desktop-operator/desktop-operator.log b/desktop-operator/desktop-operator.log new file mode 100644 index 0000000..604eed3 --- /dev/null +++ b/desktop-operator/desktop-operator.log @@ -0,0 +1,4 @@ + +> godeye-operator@1.0.0 start +> electron . + diff --git a/desktop-operator/god-eye.log b/desktop-operator/god-eye.log new file mode 100644 index 0000000..0d229fe --- /dev/null +++ b/desktop-operator/god-eye.log @@ -0,0 +1,4046 @@ +{"level":"info","message":"GodEye Backend Server running on 0.0.0.0:3001","timestamp":"2025-10-05T00:46:12.653Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:46:16.332Z","userAgent":""} +{"level":"info","message":"Operator registered: 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:46:16.334Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: hRLAd01Wa5kPqmJzAAAD","timestamp":"2025-10-05T00:46:18.389Z","userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: TLJCTMT0FPONILyxAAAG","timestamp":"2025-10-05T00:47:53.339Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: TLJCTMT0FPONILyxAAAG","timestamp":"2025-10-05T00:47:53.339Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:53.387Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:53.387Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:54.933Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:54.934Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.670Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.670Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.670Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.673Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.673Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.675Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.676Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625275483} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625275483} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625275483} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625275483} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.683Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.683Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.683Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.684Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.684Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.685Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.686Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.686Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.687Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.687Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.688Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.688Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.689Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.689Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.690Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.690Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.690Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.690Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.691Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.691Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.693Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.693Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.694Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.694Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.695Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.696Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.696Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.696Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625275483} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.714Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.714Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.714Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.714Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.714Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.717Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.718Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625275483} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.721Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.721Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.724Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.725Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625275483} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759625275522} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.727Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275483} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.727Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.727Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.728Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.728Z"} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.729Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.729Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.729Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.730Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.732Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.733Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.734Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625275522} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625275522} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625275522} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625275522} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625275522} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625275522} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625275522} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.736Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.737Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.737Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.737Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.738Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.739Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.739Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.739Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.740Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.740Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.740Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.741Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.741Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.741Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.741Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.742Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.742Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.742Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.742Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.743Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.743Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.743Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.743Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.744Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.744Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.744Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.744Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.745Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.745Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.745Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Handling Android registration for socket: BRMTCRoxa5AaLCvDAAAH","timestamp":"2025-10-05T00:47:55.745Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275522} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.746Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.746Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"BRMTCRoxa5AaLCvDAAAH","status":"online","timestamp":"2025-10-05T00:47:55.746Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.747Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.748Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.749Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.749Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.750Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.752Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.752Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.753Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.753Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.753Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.753Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.754Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.755Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.755Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.755Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.755Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.756Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Handling Android registration for socket: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:55.817Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.817Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.817Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.818Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.818Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.820Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.820Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625275612} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Handling Android registration for socket: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:55.828Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.828Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.829Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.829Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.829Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.831Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.831Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625275612} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625275612} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Handling Android registration for socket: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:55.832Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.832Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.832Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.833Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.833Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Handling Android registration for socket: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:55.833Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.833Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.833Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.834Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.834Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.835Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.835Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.835Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.836Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625275612} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625275612} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625275612} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Handling Android registration for socket: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:55.837Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.837Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.837Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.837Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.837Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Handling Android registration for socket: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:55.839Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.839Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.839Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.839Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.839Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Handling Android registration for socket: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:55.839Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.839Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.839Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.840Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.840Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.841Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.841Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.842Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.842Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.842Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.843Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625275612} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Handling Android registration for socket: AXS_MSknovC2y5UuAAAJ","timestamp":"2025-10-05T00:47:55.851Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625275612} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:55.851Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.851Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"AXS_MSknovC2y5UuAAAJ","status":"online","timestamp":"2025-10-05T00:47:55.852Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:47:55.852Z"} +{"level":"info","message":"📱 Devices list requested by socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:55.854Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:55.854Z"} +{"level":"info","message":"📷 Camera request received from operator socket k6vv_bm1x5YfbLB8AAAB","timestamp":"2025-10-05T00:47:58.814Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T00:47:58.815Z"} +{"level":"info","message":"📷 Total operators registered: 1","timestamp":"2025-10-05T00:47:58.815Z"} +{"level":"info","message":"📷 Operator IDs: 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:58.815Z"} +{"level":"info","message":"✅ Operator found: 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:47:58.815Z"} +{"level":"info","message":"🔗 Initiating connection: 27047b0c-da70-46f6-946e-7c6a2c66dd20 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T00:47:58.815Z"} +{"level":"info","message":"🆔 Generated connectionId: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.816Z"} +{"level":"info","message":"💾 Saving connection request: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.816Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T00:47:58.816Z"} +{"level":"info","message":"💾 All request IDs: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.816Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:47:58.816Z"} +{"level":"info","message":"✅ Connection request created: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.817Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T00:47:58.817Z"} +{"level":"info","message":"✅ Connection initiated: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.817Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"27047b0c-da70-46f6-946e-7c6a2c66dd20","sessionId":"22880a51-d673-44b2-a32f-8c9db8517899","timestamp":1759625278667} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"27047b0c-da70-46f6-946e-7c6a2c66dd20","sessionId":"22880a51-d673-44b2-a32f-8c9db8517899","timestamp":1759625278667} +{"level":"info","message":"📱 Camera response received from Android: sessionId=22880a51-d673-44b2-a32f-8c9db8517899, accepted=true","timestamp":"2025-10-05T00:47:58.845Z"} +{"level":"info","message":"🔍 Looking for connection request: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.845Z"} +{"level":"info","message":"🔍 Available connection requests: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.845Z"} +{"level":"info","message":"✅ Connection established: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.845Z"} +{"level":"info","message":"✅ Connection accepted: 22880a51-d673-44b2-a32f-8c9db8517899","timestamp":"2025-10-05T00:47:58.845Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625305534} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625305534} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625305534} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625305620} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625305620} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625305620} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625335538} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625335538} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625335538} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625335624} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625335624} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625335624} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625365542} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625365542} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625365542} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625365628} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625365628} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625365628} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625395546} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625395546} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625395546} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625395638} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625395638} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625395638} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625425550} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625425550} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625425550} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625425644} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625425644} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625425644} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625455555} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625455555} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625455555} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625455647} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625455647} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625455647} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625485561} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625485561} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625485561} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625485651} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625485651} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625485651} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625515569} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625515569} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625515569} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625515657} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625515657} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625515657} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625545573} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625545573} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625545573} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625545661} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625545661} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625545661} +{"level":"info","message":"Client disconnected: k6vv_bm1x5YfbLB8AAAB, reason: client namespace disconnect","timestamp":"2025-10-05T00:52:47.293Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:52:47.293Z"} +{"level":"info","message":"🔌 Connection terminated: 22880a51-d673-44b2-a32f-8c9db8517899 - Operator disconnected","timestamp":"2025-10-05T00:52:47.294Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:52:47.294Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: 6PHNMDh9_HTOeW4EAAAL","timestamp":"2025-10-05T00:52:47.888Z","userAgent":""} +{"level":"info","message":"Operator registered: 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:52:47.889Z"} +{"level":"info","message":"📷 Camera request received from operator socket 6PHNMDh9_HTOeW4EAAAL","timestamp":"2025-10-05T00:52:49.173Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T00:52:49.173Z"} +{"level":"info","message":"📷 Total operators registered: 1","timestamp":"2025-10-05T00:52:49.173Z"} +{"level":"info","message":"📷 Operator IDs: 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:52:49.173Z"} +{"level":"info","message":"✅ Operator found: 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:52:49.173Z"} +{"level":"info","message":"🔗 Initiating connection: 27047b0c-da70-46f6-946e-7c6a2c66dd20 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T00:52:49.173Z"} +{"level":"info","message":"🆔 Generated connectionId: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.174Z"} +{"level":"info","message":"💾 Saving connection request: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.174Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T00:52:49.174Z"} +{"level":"info","message":"💾 All request IDs: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.174Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:52:49.174Z"} +{"level":"info","message":"✅ Connection request created: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.174Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T00:52:49.174Z"} +{"level":"info","message":"✅ Connection initiated: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.174Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"27047b0c-da70-46f6-946e-7c6a2c66dd20","sessionId":"95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":1759625569091} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"27047b0c-da70-46f6-946e-7c6a2c66dd20","sessionId":"95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":1759625569091} +{"level":"info","message":"📱 Camera response received from Android: sessionId=95e2b8f3-ffd9-442d-b622-002f2169232c, accepted=true","timestamp":"2025-10-05T00:52:49.268Z"} +{"level":"info","message":"🔍 Looking for connection request: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.268Z"} +{"level":"info","message":"🔍 Available connection requests: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.268Z"} +{"level":"info","message":"✅ Connection established: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.268Z"} +{"level":"info","message":"✅ Connection accepted: 95e2b8f3-ffd9-442d-b622-002f2169232c","timestamp":"2025-10-05T00:52:49.268Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625575576} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625575576} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625575576} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625575666} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625575666} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625575666} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625605579} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625605579} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625605579} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625605670} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625605670} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625605670} +{"level":"info","message":"Client disconnected: 6PHNMDh9_HTOeW4EAAAL, reason: transport close","timestamp":"2025-10-05T00:53:43.541Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:53:43.541Z"} +{"level":"info","message":"🔌 Connection terminated: 95e2b8f3-ffd9-442d-b622-002f2169232c - Operator disconnected","timestamp":"2025-10-05T00:53:43.541Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator 27047b0c-da70-46f6-946e-7c6a2c66dd20","timestamp":"2025-10-05T00:53:43.541Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625635584} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625635584} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625635584} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625635676} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625635676} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625635676} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:12.634Z","userAgent":""} +{"level":"info","message":"Operator registered: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:12.635Z"} +{"level":"info","message":"📷 Camera request received from operator socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:14.973Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T00:54:14.973Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T00:54:14.973Z"} +{"level":"info","message":"📷 Operator IDs: 27047b0c-da70-46f6-946e-7c6a2c66dd20, aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:14.973Z"} +{"level":"info","message":"✅ Operator found: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:14.973Z"} +{"level":"info","message":"🔗 Initiating connection: aec6ddbf-ecab-4037-847f-7337935daab5 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T00:54:14.973Z"} +{"level":"info","message":"🆔 Generated connectionId: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:14.973Z"} +{"level":"info","message":"💾 Saving connection request: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:14.973Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T00:54:14.973Z"} +{"level":"info","message":"💾 All request IDs: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:14.974Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:14.974Z"} +{"level":"info","message":"✅ Connection request created: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:14.974Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T00:54:14.974Z"} +{"level":"info","message":"✅ Connection initiated: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:14.974Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"aec6ddbf-ecab-4037-847f-7337935daab5","sessionId":"24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":1759625654897} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"aec6ddbf-ecab-4037-847f-7337935daab5","sessionId":"24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":1759625654897} +{"level":"info","message":"📱 Camera response received from Android: sessionId=24199dd8-3370-4a6c-a61c-064a49b9b7fe, accepted=true","timestamp":"2025-10-05T00:54:15.080Z"} +{"level":"info","message":"🔍 Looking for connection request: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:15.080Z"} +{"level":"info","message":"🔍 Available connection requests: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:15.080Z"} +{"level":"info","message":"✅ Connection established: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:15.080Z"} +{"level":"info","message":"✅ Connection accepted: 24199dd8-3370-4a6c-a61c-064a49b9b7fe","timestamp":"2025-10-05T00:54:15.080Z"} +{"level":"info","message":"Client disconnected: BRMTCRoxa5AaLCvDAAAH, reason: client namespace disconnect","timestamp":"2025-10-05T00:54:17.010Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:17.763Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:17.763Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Handling Android registration for socket: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:18.214Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:18.215Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.215Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.215Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:54:18.215Z"} +{"level":"info","message":"📱 Devices list requested by socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:18.216Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:18.217Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625658006} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Handling Android registration for socket: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:18.249Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:18.249Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.249Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.249Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:54:18.249Z"} +{"level":"info","message":"📱 Devices list requested by socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:18.251Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:18.251Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625658006} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625658006} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Handling Android registration for socket: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:18.253Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:18.253Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.253Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.253Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:54:18.253Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Handling Android registration for socket: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:18.254Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:18.254Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.254Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.254Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:54:18.254Z"} +{"level":"info","message":"📱 Devices list requested by socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:18.255Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:18.255Z"} +{"level":"info","message":"📱 Devices list requested by socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:18.255Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:18.256Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625658006} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625658006} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625658006} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Handling Android registration for socket: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:18.257Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:18.257Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.257Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.258Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:54:18.258Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Handling Android registration for socket: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:18.259Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:18.259Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.259Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.259Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:54:18.259Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Handling Android registration for socket: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:18.260Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:18.260Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.260Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.260Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:54:18.260Z"} +{"level":"info","message":"📱 Devices list requested by socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:18.261Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:18.261Z"} +{"level":"info","message":"📱 Devices list requested by socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:18.262Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:18.262Z"} +{"level":"info","message":"📱 Devices list requested by socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:18.262Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:18.263Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625658006} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Handling Android registration for socket: N48lJ4R1hKLWwmL7AAAP","timestamp":"2025-10-05T00:54:18.270Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625658006} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:18.270Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.270Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"N48lJ4R1hKLWwmL7AAAP","status":"online","timestamp":"2025-10-05T00:54:18.270Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:54:18.270Z"} +{"level":"info","message":"📱 Devices list requested by socket LEIs_aVA3Enm2FAsAAAN","timestamp":"2025-10-05T00:54:18.272Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:18.272Z"} +{"level":"info","message":"Client disconnected: LEIs_aVA3Enm2FAsAAAN, reason: client namespace disconnect","timestamp":"2025-10-05T00:54:21.892Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:21.892Z"} +{"level":"info","message":"🔌 Connection terminated: 24199dd8-3370-4a6c-a61c-064a49b9b7fe - Operator disconnected","timestamp":"2025-10-05T00:54:21.892Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:21.892Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: Z3BqiLnNx6l5rXauAAAR","timestamp":"2025-10-05T00:54:23.288Z","userAgent":""} +{"level":"info","message":"Operator registered: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:23.289Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625665679} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625665679} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625665679} +{"level":"info","message":"📷 Camera request received from operator socket Z3BqiLnNx6l5rXauAAAR","timestamp":"2025-10-05T00:54:27.460Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T00:54:27.460Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T00:54:27.460Z"} +{"level":"info","message":"📷 Operator IDs: 27047b0c-da70-46f6-946e-7c6a2c66dd20, aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"✅ Operator found: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"🔗 Initiating connection: aec6ddbf-ecab-4037-847f-7337935daab5 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"🆔 Generated connectionId: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"💾 Saving connection request: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"💾 All request IDs: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"✅ Connection request created: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T00:54:27.461Z"} +{"level":"info","message":"✅ Connection initiated: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.461Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"aec6ddbf-ecab-4037-847f-7337935daab5","sessionId":"f7196ecd-5148-4937-b108-f64df078df31","timestamp":1759625667392} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"aec6ddbf-ecab-4037-847f-7337935daab5","sessionId":"f7196ecd-5148-4937-b108-f64df078df31","timestamp":1759625667392} +{"level":"info","message":"📱 Camera response received from Android: sessionId=f7196ecd-5148-4937-b108-f64df078df31, accepted=true","timestamp":"2025-10-05T00:54:27.615Z"} +{"level":"info","message":"🔍 Looking for connection request: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.615Z"} +{"level":"info","message":"🔍 Available connection requests: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.615Z"} +{"level":"info","message":"✅ Connection established: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.615Z"} +{"level":"info","message":"✅ Connection accepted: f7196ecd-5148-4937-b108-f64df078df31","timestamp":"2025-10-05T00:54:27.615Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625688015} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625688015} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625688015} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625695684} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625695684} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625695684} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625718018} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625718018} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625718018} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625725709} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625725709} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625725709} +{"level":"info","message":"Client disconnected: TLJCTMT0FPONILyxAAAG, reason: transport close","timestamp":"2025-10-05T00:55:31.261Z"} +{"level":"info","message":"Client disconnected: AXS_MSknovC2y5UuAAAJ, reason: transport close","timestamp":"2025-10-05T00:55:31.262Z"} +{"level":"info","message":"Client disconnected: N48lJ4R1hKLWwmL7AAAP, reason: transport close","timestamp":"2025-10-05T00:55:31.265Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:31.265Z"} +{"level":"info","message":"🔌 Connection terminated: f7196ecd-5148-4937-b108-f64df078df31 - Device disconnected","timestamp":"2025-10-05T00:55:31.265Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:31.265Z"} +{"level":"info","message":"📱 Devices list requested by socket Z3BqiLnNx6l5rXauAAAR","timestamp":"2025-10-05T00:55:31.267Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:55:31.267Z"} +{"level":"info","message":"Client disconnected: Z3BqiLnNx6l5rXauAAAR, reason: client namespace disconnect","timestamp":"2025-10-05T00:55:45.995Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:55:45.995Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:55:45.995Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:46.390Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:46.390Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: 22Dx-Rq6Z4exN6E9AAAV","timestamp":"2025-10-05T00:55:46.591Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: 22Dx-Rq6Z4exN6E9AAAV","timestamp":"2025-10-05T00:55:46.591Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:48.493Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:48.493Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:49.951Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:49.951Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:49.951Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:49.952Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:49.952Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625749727} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.017Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.018Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.018Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.018Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.018Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625749727} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.022Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.023Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.023Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.023Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.023Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625749727} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.033Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.033Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.034Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.034Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.034Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625749727} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.055Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.055Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.055Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.055Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.055Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625749727} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.069Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.069Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.069Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.069Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.069Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625749727} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.072Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.072Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.072Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.073Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.073Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Handling Android registration for socket: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:50.082Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.082Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.082Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.083Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.083Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625749727} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.092Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749727} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.092Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.092Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.093Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.093Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.096Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.096Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.096Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.097Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.097Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625749845} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Handling Android registration for socket: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:50.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.161Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625749845} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Handling Android registration for socket: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:50.172Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.172Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.172Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.172Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.172Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625749845} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Handling Android registration for socket: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:50.178Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.178Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.178Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.178Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.178Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625749845} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625749845} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Handling Android registration for socket: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:50.185Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.185Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.185Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.186Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.186Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Handling Android registration for socket: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:50.186Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.186Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.186Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.187Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.187Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625749845} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Handling Android registration for socket: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:50.189Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.189Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.189Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.189Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.189Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625749845} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Handling Android registration for socket: 3ILKQtb5bc-cuPoRAAAX","timestamp":"2025-10-05T00:55:50.192Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749845} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.192Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.192Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"3ILKQtb5bc-cuPoRAAAX","status":"online","timestamp":"2025-10-05T00:55:50.192Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.192Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625749738} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.227Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.227Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.227Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.228Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.228Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625749738} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.238Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.238Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.238Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.238Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.239Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625749738} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.259Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.259Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.259Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.259Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.259Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625749738} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.262Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.262Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.262Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.262Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.262Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625749738} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.286Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.286Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.286Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.287Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.287Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625749738} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.301Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.302Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.302Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.302Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.302Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625749738} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Handling Android registration for socket: hhc0ItciJlGoQcJhAAAU","timestamp":"2025-10-05T00:55:50.313Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625749738} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:50.314Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.314Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"hhc0ItciJlGoQcJhAAAU","status":"online","timestamp":"2025-10-05T00:55:50.314Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T00:55:50.314Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:55:53.968Z","userAgent":""} +{"level":"info","message":"Operator registered: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:55:53.969Z"} +{"level":"info","message":"📷 Camera request received from operator socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:55:56.092Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T00:55:56.092Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T00:55:56.092Z"} +{"level":"info","message":"📷 Operator IDs: 27047b0c-da70-46f6-946e-7c6a2c66dd20, aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:55:56.092Z"} +{"level":"info","message":"✅ Operator found: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:55:56.092Z"} +{"level":"info","message":"🔗 Initiating connection: aec6ddbf-ecab-4037-847f-7337935daab5 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T00:55:56.093Z"} +{"level":"info","message":"🆔 Generated connectionId: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.093Z"} +{"level":"info","message":"💾 Saving connection request: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.093Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T00:55:56.093Z"} +{"level":"info","message":"💾 All request IDs: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.093Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:55:56.093Z"} +{"level":"info","message":"✅ Connection request created: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.093Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T00:55:56.093Z"} +{"level":"info","message":"✅ Connection initiated: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.093Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"aec6ddbf-ecab-4037-847f-7337935daab5","sessionId":"3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":1759625755974} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"aec6ddbf-ecab-4037-847f-7337935daab5","sessionId":"3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":1759625755974} +{"level":"info","message":"📱 Camera response received from Android: sessionId=3cddfc25-9b48-44e8-8319-81603bf66e6f, accepted=true","timestamp":"2025-10-05T00:55:56.155Z"} +{"level":"info","message":"🔍 Looking for connection request: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.155Z"} +{"level":"info","message":"🔍 Available connection requests: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.155Z"} +{"level":"info","message":"✅ Connection established: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.155Z"} +{"level":"info","message":"✅ Connection accepted: 3cddfc25-9b48-44e8-8319-81603bf66e6f","timestamp":"2025-10-05T00:55:56.155Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625779761} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625779761} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625779761} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625779859} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625779859} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625779859} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625809784} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625809784} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625809784} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625809863} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625809863} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625809863} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625839790} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625839790} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625839790} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625839872} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625839872} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625839872} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625869796} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625869796} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625869796} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625869878} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625869878} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625869878} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: U1ulpmuxMv-Yh9W6AAAb","timestamp":"2025-10-05T00:58:01.785Z","userAgent":""} +{"level":"info","message":"Operator registered: eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T00:58:01.787Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625899803} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625899803} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625899803} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625899887} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625899887} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625899887} +{"level":"info","message":"Client disconnected: U1ulpmuxMv-Yh9W6AAAb, reason: client namespace disconnect","timestamp":"2025-10-05T00:58:23.899Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T00:58:23.899Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T00:58:23.899Z"} +{"level":"info","message":"Client disconnected: hhc0ItciJlGoQcJhAAAU, reason: client namespace disconnect","timestamp":"2025-10-05T00:58:25.525Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:25.525Z"} +{"level":"info","message":"🔌 Connection terminated: 3cddfc25-9b48-44e8-8319-81603bf66e6f - Device disconnected","timestamp":"2025-10-05T00:58:25.525Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:25.525Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:25.527Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:25.527Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.312Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.312Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Handling Android registration for socket: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.452Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:26.452Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.452Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.453Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:58:26.453Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:26.454Z"} +{"level":"info","message":"📱 Sending 1 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:26.454Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625906201} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625906201} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625906201} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625906201} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625906201} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Handling Android registration for socket: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.486Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:26.487Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.487Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.488Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:58:26.488Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Handling Android registration for socket: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.488Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:26.488Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.488Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.489Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:58:26.489Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Handling Android registration for socket: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.489Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:26.489Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.489Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.490Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:58:26.490Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Handling Android registration for socket: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.490Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:26.490Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.490Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.490Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:58:26.491Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Handling Android registration for socket: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.491Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:26.491Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.491Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.492Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:58:26.492Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625906201} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625906201} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Handling Android registration for socket: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.493Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:26.493Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.493Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.494Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:58:26.494Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Handling Android registration for socket: J4b20kFw8pJUh9YMAAAd","timestamp":"2025-10-05T00:58:26.494Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759625906201} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:26.494Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.494Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"J4b20kFw8pJUh9YMAAAd","status":"online","timestamp":"2025-10-05T00:58:26.495Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T00:58:26.495Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:26.496Z"} +{"level":"info","message":"📱 Sending 1 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:26.496Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:26.496Z"} +{"level":"info","message":"📱 Sending 1 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:26.496Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:26.497Z"} +{"level":"info","message":"📱 Sending 1 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:26.497Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:26.497Z"} +{"level":"info","message":"📱 Sending 1 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:26.498Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:26.498Z"} +{"level":"info","message":"📱 Sending 1 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:26.498Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:26.499Z"} +{"level":"info","message":"📱 Sending 1 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:26.499Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:58:26.500Z"} +{"level":"info","message":"📱 Sending 1 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:58:26.500Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: jyjEV84D0oxqvF86AAAf","timestamp":"2025-10-05T00:58:29.080Z","userAgent":""} +{"level":"info","message":"Operator registered: eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T00:58:29.081Z"} +{"level":"info","message":"📷 Camera request received from operator socket jyjEV84D0oxqvF86AAAf","timestamp":"2025-10-05T00:58:30.539Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"📷 Total operators registered: 3","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"📷 Operator IDs: 27047b0c-da70-46f6-946e-7c6a2c66dd20, aec6ddbf-ecab-4037-847f-7337935daab5, eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"✅ Operator found: eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"🔗 Initiating connection: eb99a123-0be9-4ff4-8b93-e7c93570d8c2 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"🆔 Generated connectionId: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"💾 Saving connection request: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"💾 All request IDs: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:58:30.540Z"} +{"level":"info","message":"✅ Connection request created: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.541Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T00:58:30.541Z"} +{"level":"info","message":"✅ Connection initiated: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.541Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"eb99a123-0be9-4ff4-8b93-e7c93570d8c2","sessionId":"3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":1759625910493} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"eb99a123-0be9-4ff4-8b93-e7c93570d8c2","sessionId":"3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":1759625910493} +{"level":"info","message":"📱 Camera response received from Android: sessionId=3750d389-acbd-4cb0-ac9d-7a008f7731f6, accepted=true","timestamp":"2025-10-05T00:58:30.672Z"} +{"level":"info","message":"🔍 Looking for connection request: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.672Z"} +{"level":"info","message":"🔍 Available connection requests: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.672Z"} +{"level":"info","message":"✅ Connection established: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.672Z"} +{"level":"info","message":"✅ Connection accepted: 3750d389-acbd-4cb0-ac9d-7a008f7731f6","timestamp":"2025-10-05T00:58:30.672Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625929891} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625929891} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625929891} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625936209} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625936209} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625936209} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625959896} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625959896} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625959896} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759625966226} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759625966226} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759625966226} +{"level":"info","message":"Client disconnected: J4b20kFw8pJUh9YMAAAd, reason: transport close","timestamp":"2025-10-05T00:59:44.810Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:59:44.810Z"} +{"level":"info","message":"🔌 Connection terminated: 3750d389-acbd-4cb0-ac9d-7a008f7731f6 - Device disconnected","timestamp":"2025-10-05T00:59:44.810Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T00:59:44.810Z"} +{"level":"info","message":"Client disconnected: 3ILKQtb5bc-cuPoRAAAX, reason: transport close","timestamp":"2025-10-05T00:59:44.810Z"} +{"level":"info","message":"Client disconnected: 22Dx-Rq6Z4exN6E9AAAV, reason: transport close","timestamp":"2025-10-05T00:59:44.811Z"} +{"level":"info","message":"📱 Devices list requested by socket 3kLBunhKPnnDCGo-AAAZ","timestamp":"2025-10-05T00:59:44.811Z"} +{"level":"info","message":"📱 Sending 0 devices to operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:59:44.811Z"} +{"level":"info","message":"📱 Devices list requested by socket jyjEV84D0oxqvF86AAAf","timestamp":"2025-10-05T00:59:44.812Z"} +{"level":"info","message":"📱 Sending 0 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T00:59:44.812Z"} +{"level":"info","message":"Client disconnected: 3kLBunhKPnnDCGo-AAAZ, reason: transport close","timestamp":"2025-10-05T00:59:46.340Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:59:46.340Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for operator aec6ddbf-ecab-4037-847f-7337935daab5","timestamp":"2025-10-05T00:59:46.340Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:07.898Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:07.898Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: v1_ls5cPwJndggCCAAAj","timestamp":"2025-10-05T01:00:07.971Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: v1_ls5cPwJndggCCAAAj","timestamp":"2025-10-05T01:00:07.971Z"} +{"level":"info","message":"Client disconnected: jyjEV84D0oxqvF86AAAf, reason: client namespace disconnect","timestamp":"2025-10-05T01:00:08.634Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:08.635Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:08.635Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:09.343Z","userAgent":""} +{"level":"info","message":"Operator registered: eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:09.344Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:10.745Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:10.745Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:11.927Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:11.927Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:11.927Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:11.927Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:11.927Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:11.929Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:11.929Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626011667} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.035Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.035Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.035Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.036Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.036Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.037Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.038Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626011667} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.068Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.068Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.068Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.068Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.068Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.070Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.070Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626011667} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626011667} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626011667} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.074Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.074Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.074Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.074Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.074Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.075Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.075Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.075Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.075Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.075Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.075Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.075Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.075Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.076Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.076Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.076Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.077Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.077Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.077Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.078Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.078Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Handling Android registration for socket: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:12.094Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.094Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.094Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.094Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.094Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.095Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.096Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626011667} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.096Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.096Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.096Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.097Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.097Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.098Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.098Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626011667} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.108Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011667} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.108Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.108Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.108Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.108Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.109Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.110Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.112Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.112Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.112Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.112Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.112Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.113Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.114Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626011679} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.140Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.140Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.140Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.140Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.140Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.142Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.142Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626011908} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Handling Android registration for socket: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:12.153Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.153Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.153Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.153Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.153Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.155Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.155Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626011679} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626011679} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626011679} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626011679} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626011679} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.161Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.162Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.163Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.164Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.164Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626011908} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626011908} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Handling Android registration for socket: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:12.166Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.166Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.166Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.166Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.166Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Handling Android registration for socket: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:12.167Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.167Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.167Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.167Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.167Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.168Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.169Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.169Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.169Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.169Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.169Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626011908} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626011908} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Handling Android registration for socket: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:12.170Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.170Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.170Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.171Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.171Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Handling Android registration for socket: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:12.171Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.172Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.172Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.172Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.172Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.172Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.173Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.173Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.173Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.173Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.174Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.174Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.174Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.178Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.178Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.184Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.185Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626011908} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Handling Android registration for socket: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:12.186Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.186Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.186Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.187Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.187Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626011679} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Handling Android registration for socket: Vj8B_4C1ajSAQWpZAAAi","timestamp":"2025-10-05T01:00:12.189Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011679} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.189Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.189Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Vj8B_4C1ajSAQWpZAAAi","status":"online","timestamp":"2025-10-05T01:00:12.190Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.190Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.191Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.191Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.192Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.192Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626011908} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Handling Android registration for socket: WflNB-vYUxtpWOMlAAAn","timestamp":"2025-10-05T01:00:12.192Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626011908} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:12.193Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.193Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WflNB-vYUxtpWOMlAAAn","status":"online","timestamp":"2025-10-05T01:00:12.193Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:00:12.193Z"} +{"level":"info","message":"📱 Devices list requested by socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:12.196Z"} +{"level":"info","message":"📱 Sending 1 devices to operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:12.196Z"} +{"level":"info","message":"📷 Camera request received from operator socket kKp7JbvdWr-ONpnqAAAl","timestamp":"2025-10-05T01:00:30.559Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:00:30.559Z"} +{"level":"info","message":"📷 Total operators registered: 3","timestamp":"2025-10-05T01:00:30.559Z"} +{"level":"info","message":"📷 Operator IDs: 27047b0c-da70-46f6-946e-7c6a2c66dd20, aec6ddbf-ecab-4037-847f-7337935daab5, eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:30.559Z"} +{"level":"info","message":"✅ Operator found: eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:00:30.559Z"} +{"level":"info","message":"🔗 Initiating connection: eb99a123-0be9-4ff4-8b93-e7c93570d8c2 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:00:30.559Z"} +{"level":"info","message":"🆔 Generated connectionId: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.559Z"} +{"level":"info","message":"💾 Saving connection request: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.560Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:00:30.560Z"} +{"level":"info","message":"💾 All request IDs: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.560Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:00:30.560Z"} +{"level":"info","message":"✅ Connection request created: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.560Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:00:30.560Z"} +{"level":"info","message":"✅ Connection initiated: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.560Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"eb99a123-0be9-4ff4-8b93-e7c93570d8c2","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030402} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"eb99a123-0be9-4ff4-8b93-e7c93570d8c2","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030402} +{"level":"info","message":"📱 Camera response received from Android: sessionId=a9447a46-c10d-413d-bd22-5691736ec693, accepted=true","timestamp":"2025-10-05T01:00:30.579Z"} +{"level":"info","message":"🔍 Looking for connection request: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.579Z"} +{"level":"info","message":"🔍 Available connection requests: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.579Z"} +{"level":"info","message":"✅ Connection established: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.579Z"} +{"level":"info","message":"✅ Connection accepted: a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.580Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 1480121199932623894 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:HsjQ\r\na=ice-pwd:818PqiiI3Yp03Mv1ywm8OfKu\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 C4:EA:18:83:05:3B:A3:69:E0:C6:16:24:58:91:A1:3F:7B:B4:E4:54:15:9C:72:9B:58:1A:A1:E5:C2:E1:B2:DD\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 526940517 364646085\r\na=ssrc:526940517 cname:j3KVD0/awZM1z00l\r\na=ssrc:526940517 msid:stream videoTrack\r\na=ssrc:364646085 cname:j3KVD0/awZM1z00l\r\na=ssrc:364646085 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:HsjQ\r\na=ice-pwd:818PqiiI3Yp03Mv1ywm8OfKu\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 C4:EA:18:83:05:3B:A3:69:E0:C6:16:24:58:91:A1:3F:7B:B4:E4:54:15:9C:72:9B:58:1A:A1:E5:C2:E1:B2:DD\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:2083818458 cname:j3KVD0/awZM1z00l\r\na=ssrc:2083818458 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030498} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.714Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:00:30.715Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3516,"sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.715Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 52254 typ host generation 0 ufrag HsjQ network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030650} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.852Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.852Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 49131 typ host generation 0 ufrag HsjQ network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030653} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.870Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.870Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 60238 typ host generation 0 ufrag HsjQ network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030655} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.877Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.877Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 36427 typ host generation 0 ufrag HsjQ network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030657} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 52429 typ host generation 0 ufrag HsjQ network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030659} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.880Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.880Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.881Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.881Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 55414 typ host generation 0 ufrag HsjQ network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030665} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.881Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.882Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 55621 typ host generation 0 ufrag HsjQ network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030666} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.884Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.884Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 54982 typ host generation 0 ufrag HsjQ network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030668} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.916Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.916Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 37990 typ host generation 0 ufrag HsjQ network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030669} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.935Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.935Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 60436 typ host generation 0 ufrag HsjQ network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030670} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.937Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.937Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 49131 typ srflx raddr 192.168.219.109 rport 49131 generation 0 ufrag HsjQ network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030799} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:30.978Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:30.978Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 55621 typ srflx raddr 192.168.219.109 rport 55621 generation 0 ufrag HsjQ network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":1759626030860} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"a9447a46-c10d-413d-bd22-5691736ec693","timestamp":"2025-10-05T01:00:31.064Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:00:31.064Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626041693} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626041693} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626041693} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626041918} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626041918} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626041918} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626071698} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626071698} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626071698} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626071924} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626071924} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626071924} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626101702} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626101702} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626101702} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626101930} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626101930} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626101930} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626131717} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626131717} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626131717} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626131959} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626131959} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626131959} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626161724} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626161724} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626161724} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626161973} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626161973} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626161973} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626191728} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626191728} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626191728} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626191978} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626191978} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626191978} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626221732} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626221732} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626221732} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626221982} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626221982} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626221982} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626251737} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626251737} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626251737} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626251988} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626251988} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626251988} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626281745} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626281745} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626281745} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626281992} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626281992} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626281992} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626311750} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626311750} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626311750} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626311997} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626311997} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626311997} +{"level":"info","message":"Client disconnected: kKp7JbvdWr-ONpnqAAAl, reason: transport close","timestamp":"2025-10-05T01:05:21.217Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:05:21.217Z"} +{"level":"info","message":"🔌 Connection terminated: a9447a46-c10d-413d-bd22-5691736ec693 - Operator disconnected","timestamp":"2025-10-05T01:05:21.217Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator eb99a123-0be9-4ff4-8b93-e7c93570d8c2","timestamp":"2025-10-05T01:05:21.217Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626341756} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626341756} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626341756} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626342005} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626342005} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626342005} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626371760} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626371760} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626371760} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626372010} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626372010} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626372010} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626401765} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626401765} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626401765} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626402015} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626402015} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626402015} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626431771} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626431771} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626431771} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626432020} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626432020} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626432020} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626461798} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626461798} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626461798} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626462024} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626462024} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626462024} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:07:53.275Z","userAgent":""} +{"level":"info","message":"Operator registered: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:07:53.288Z"} +{"level":"info","message":"Client disconnected: Vj8B_4C1ajSAQWpZAAAi, reason: transport close","timestamp":"2025-10-05T01:07:55.233Z"} +{"level":"info","message":"Client disconnected: WflNB-vYUxtpWOMlAAAn, reason: transport close","timestamp":"2025-10-05T01:07:55.233Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:07:55.233Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:07:55.233Z"} +{"level":"info","message":"Client disconnected: v1_ls5cPwJndggCCAAAj, reason: transport close","timestamp":"2025-10-05T01:07:55.234Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:07:55.235Z"} +{"level":"info","message":"📱 Sending 0 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:07:55.235Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:12.791Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:12.791Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: 2Try4JXEwH4aKF8sAAAt","timestamp":"2025-10-05T01:08:12.861Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: 2Try4JXEwH4aKF8sAAAt","timestamp":"2025-10-05T01:08:12.862Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:16.016Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:16.016Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.434Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.434Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.434Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.435Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.435Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.436Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.436Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626497141} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.516Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.516Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.516Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.516Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.516Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.517Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.518Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626497141} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.519Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.519Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.519Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.519Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.520Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.521Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.521Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626497141} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.524Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.524Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.524Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.524Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.524Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.525Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.526Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626497141} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.529Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.529Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.529Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.529Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.529Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.531Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.531Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626497141} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.533Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.534Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.534Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.534Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.534Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.537Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.537Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626497141} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.539Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.539Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.539Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.539Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.539Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.541Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.541Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626497141} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.554Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497141} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.554Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.554Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.555Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.555Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.556Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.557Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.562Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.563Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.563Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.563Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.563Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.565Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.565Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626497174} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.571Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.571Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.571Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.572Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.572Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.573Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.574Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626497174} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.583Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.583Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.583Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.583Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.583Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.585Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.585Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626497174} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.603Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.603Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.603Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.604Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.604Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.605Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.606Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626497174} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626497174} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626497174} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.614Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.614Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.614Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.615Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.615Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.615Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.615Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.615Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.616Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.616Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.616Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.616Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.616Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.617Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.617Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.617Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.617Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.618Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.618Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.619Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.619Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626497174} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Handling Android registration for socket: V5JjIn8wrLqqfvhAAAAs","timestamp":"2025-10-05T01:08:17.623Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497174} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.623Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.623Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"V5JjIn8wrLqqfvhAAAAs","status":"online","timestamp":"2025-10-05T01:08:17.623Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.623Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.624Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.625Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Handling Android registration for socket: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:17.684Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.684Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.684Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.684Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.684Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.686Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.686Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626497472} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Handling Android registration for socket: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:17.713Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.713Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.713Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.714Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.714Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.715Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.715Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626497472} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Handling Android registration for socket: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:17.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.718Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.718Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.718Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.718Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.720Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626497472} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Handling Android registration for socket: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:17.721Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.721Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.721Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.722Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.722Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.723Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.723Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626497472} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Handling Android registration for socket: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:17.727Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.727Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.727Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.727Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.727Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.728Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.728Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626497472} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Handling Android registration for socket: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:17.730Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.731Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.731Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.731Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.731Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.732Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.732Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626497472} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Handling Android registration for socket: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:17.734Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.734Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.734Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.734Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.734Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.736Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.736Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626497472} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Handling Android registration for socket: Wdj0ClOnlZGBHElXAAAv","timestamp":"2025-10-05T01:08:17.739Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626497472} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:17.739Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.739Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Wdj0ClOnlZGBHElXAAAv","status":"online","timestamp":"2025-10-05T01:08:17.740Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:08:17.740Z"} +{"level":"info","message":"📱 Devices list requested by socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:17.741Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:17.741Z"} +{"level":"info","message":"📷 Camera request received from operator socket z2rSvXPFCkP4XE0QAAAp","timestamp":"2025-10-05T01:08:24.499Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:08:24.499Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T01:08:24.499Z"} +{"level":"info","message":"📷 Operator IDs: eb99a123-0be9-4ff4-8b93-e7c93570d8c2, fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:24.499Z"} +{"level":"info","message":"✅ Operator found: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:08:24.499Z"} +{"level":"info","message":"🔗 Initiating connection: fb7c61be-b1ce-40d4-b527-10f90bf16098 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:08:24.500Z"} +{"level":"info","message":"🆔 Generated connectionId: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.500Z"} +{"level":"info","message":"💾 Saving connection request: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.500Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:08:24.500Z"} +{"level":"info","message":"💾 All request IDs: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.500Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:08:24.500Z"} +{"level":"info","message":"✅ Connection request created: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.500Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:08:24.500Z"} +{"level":"info","message":"✅ Connection initiated: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.500Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"fb7c61be-b1ce-40d4-b527-10f90bf16098","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504410} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"fb7c61be-b1ce-40d4-b527-10f90bf16098","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504410} +{"level":"info","message":"📱 Camera response received from Android: sessionId=c85b5a8f-c3b4-40f6-a58d-faf31919866b, accepted=true","timestamp":"2025-10-05T01:08:24.589Z"} +{"level":"info","message":"🔍 Looking for connection request: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.589Z"} +{"level":"info","message":"🔍 Available connection requests: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.589Z"} +{"level":"info","message":"✅ Connection established: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.589Z"} +{"level":"info","message":"✅ Connection accepted: c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.589Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 6481590756695281699 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:KWGZ\r\na=ice-pwd:ZFBxbg+pKt8fiJfsiwS5ox9R\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 5C:FD:D9:F4:BD:C4:B9:95:83:3E:82:02:4B:E5:F5:06:B9:92:B7:FD:46:1D:ED:8E:62:95:13:9B:C0:4C:BF:41\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 1730296865 2358251157\r\na=ssrc:1730296865 cname:WBbz7I4UtIlwMe5e\r\na=ssrc:1730296865 msid:stream videoTrack\r\na=ssrc:2358251157 cname:WBbz7I4UtIlwMe5e\r\na=ssrc:2358251157 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:KWGZ\r\na=ice-pwd:ZFBxbg+pKt8fiJfsiwS5ox9R\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 5C:FD:D9:F4:BD:C4:B9:95:83:3E:82:02:4B:E5:F5:06:B9:92:B7:FD:46:1D:ED:8E:62:95:13:9B:C0:4C:BF:41\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:2149537368 cname:WBbz7I4UtIlwMe5e\r\na=ssrc:2149537368 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504540} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.733Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:08:24.733Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:24.734Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 32892 typ host generation 0 ufrag KWGZ network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504785} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.061Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.061Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 36709 typ host generation 0 ufrag KWGZ network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504808} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.115Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.115Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 59631 typ host generation 0 ufrag KWGZ network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504812} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.120Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.120Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 33226 typ host generation 0 ufrag KWGZ network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504814} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.149Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.149Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 34719 typ host generation 0 ufrag KWGZ network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504817} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.165Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.165Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 42207 typ host generation 0 ufrag KWGZ network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504820} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.189Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.189Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 33603 typ host generation 0 ufrag KWGZ network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504830} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.195Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.195Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 50531 typ host generation 0 ufrag KWGZ network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504833} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.205Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.205Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 43722 typ host generation 0 ufrag KWGZ network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504836} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.208Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.209Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 44515 typ host generation 0 ufrag KWGZ network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626504839} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.211Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.211Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 36709 typ srflx raddr 192.168.219.109 rport 36709 generation 0 ufrag KWGZ network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626505020} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.215Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.215Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 33603 typ srflx raddr 192.168.219.109 rport 33603 generation 0 ufrag KWGZ network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":1759626505091} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"c85b5a8f-c3b4-40f6-a58d-faf31919866b","timestamp":"2025-10-05T01:08:25.289Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:08:25.289Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626527250} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626527250} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626527250} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626527505} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626527505} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626527505} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626557268} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626557268} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626557268} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626557510} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626557510} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626557510} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626587274} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626587274} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626587274} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626587521} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626587521} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626587521} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626617280} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626617280} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626617280} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626617529} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626617529} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626617529} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626647286} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626647286} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626647286} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626647549} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626647549} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626647549} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626677292} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626677292} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626677292} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626677554} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626677554} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626677554} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626707298} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626707298} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626707298} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626707563} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626707563} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626707563} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626737302} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626737302} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626737302} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626737569} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626737569} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626737569} +{"level":"info","message":"Client disconnected: z2rSvXPFCkP4XE0QAAAp, reason: client namespace disconnect","timestamp":"2025-10-05T01:12:34.149Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:12:34.149Z"} +{"level":"info","message":"🔌 Connection terminated: c85b5a8f-c3b4-40f6-a58d-faf31919866b - Operator disconnected","timestamp":"2025-10-05T01:12:34.149Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:12:34.149Z"} +{"level":"info","message":"Client disconnected: V5JjIn8wrLqqfvhAAAAs, reason: client namespace disconnect","timestamp":"2025-10-05T01:12:35.514Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:36.538Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:36.538Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Handling Android registration for socket: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:37.097Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:37.097Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.097Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.097Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:12:37.097Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626756781} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Handling Android registration for socket: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:37.255Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:37.255Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.255Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.255Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:12:37.255Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626756781} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Handling Android registration for socket: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:37.260Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:37.260Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.260Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.260Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:12:37.260Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626756781} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Handling Android registration for socket: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:37.270Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:37.270Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.270Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.271Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:12:37.271Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626756781} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Handling Android registration for socket: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:37.273Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:37.273Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.273Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.273Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:12:37.273Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626756781} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Handling Android registration for socket: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:37.277Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:37.278Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.278Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.278Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:12:37.278Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626756781} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Handling Android registration for socket: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:37.291Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:37.291Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.291Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.292Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:12:37.292Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626756781} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Handling Android registration for socket: --1SpOq5zE9K-g7bAAAx","timestamp":"2025-10-05T01:12:37.294Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626756781} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:37.294Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.294Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"--1SpOq5zE9K-g7bAAAx","status":"online","timestamp":"2025-10-05T01:12:37.295Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:12:37.295Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626767577} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626767577} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626767577} +{"level":"info","message":"Client disconnected: --1SpOq5zE9K-g7bAAAx, reason: transport close","timestamp":"2025-10-05T01:12:50.906Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:50.907Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:12:50.907Z"} +{"level":"info","message":"Client disconnected: 2Try4JXEwH4aKF8sAAAt, reason: transport close","timestamp":"2025-10-05T01:12:50.907Z"} +{"level":"info","message":"Client disconnected: Wdj0ClOnlZGBHElXAAAv, reason: transport close","timestamp":"2025-10-05T01:12:50.913Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.309Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.309Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759626795291} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626795291} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626795291} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626795291} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Handling Android registration for socket: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.590Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:15.590Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.590Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.591Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:13:15.591Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Handling Android registration for socket: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.591Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:15.591Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.591Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.592Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:13:15.592Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Handling Android registration for socket: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.592Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:15.592Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.592Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.593Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:13:15.593Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Handling Android registration for socket: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.593Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:15.593Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.593Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.593Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:13:15.594Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Handling Android registration for socket: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.594Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:15.594Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.594Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.595Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:13:15.595Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626795291} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626795291} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Handling Android registration for socket: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.596Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:15.596Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.596Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.596Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:13:15.596Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Handling Android registration for socket: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.597Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:15.597Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.597Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.597Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:13:15.597Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626795291} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Handling Android registration for socket: uIu5U18sKlJRDM3YAAAz","timestamp":"2025-10-05T01:13:15.599Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759626795291} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:15.599Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.599Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"uIu5U18sKlJRDM3YAAAz","status":"online","timestamp":"2025-10-05T01:13:15.599Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T01:13:15.599Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: Gh1uAErc-K5oEUvRAAA1","timestamp":"2025-10-05T01:13:17.373Z","userAgent":""} +{"level":"info","message":"Operator registered: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:13:17.374Z"} +{"level":"info","message":"📷 Camera request received from operator socket Gh1uAErc-K5oEUvRAAA1","timestamp":"2025-10-05T01:13:19.610Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"📷 Total operators registered: 1","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"📷 Operator IDs: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"✅ Operator found: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"🔗 Initiating connection: fb7c61be-b1ce-40d4-b527-10f90bf16098 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"🆔 Generated connectionId: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"💾 Saving connection request: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"💾 All request IDs: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"✅ Connection request created: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:13:19.610Z"} +{"level":"info","message":"✅ Connection initiated: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.610Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"fb7c61be-b1ce-40d4-b527-10f90bf16098","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626799632} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"fb7c61be-b1ce-40d4-b527-10f90bf16098","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626799632} +{"level":"info","message":"📱 Camera response received from Android: sessionId=30fd1255-b5b9-4749-a58e-c693a3e88b6b, accepted=true","timestamp":"2025-10-05T01:13:19.811Z"} +{"level":"info","message":"🔍 Looking for connection request: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.811Z"} +{"level":"info","message":"🔍 Available connection requests: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.811Z"} +{"level":"info","message":"✅ Connection established: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.811Z"} +{"level":"info","message":"✅ Connection accepted: 30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:19.811Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 5686866452710435433 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:ulRm\r\na=ice-pwd:SkCq6avvcfyCmUlAKMetzY10\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 48:13:1B:1A:78:5F:60:42:47:0F:60:BD:A8:83:CB:C0:96:C7:78:01:EB:A7:B9:3F:F1:F1:61:20:D6:A2:BD:79\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 710371209 1587357447\r\na=ssrc:710371209 cname:b5LV6Q/DXmjN8J67\r\na=ssrc:710371209 msid:stream videoTrack\r\na=ssrc:1587357447 cname:b5LV6Q/DXmjN8J67\r\na=ssrc:1587357447 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:ulRm\r\na=ice-pwd:SkCq6avvcfyCmUlAKMetzY10\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 48:13:1B:1A:78:5F:60:42:47:0F:60:BD:A8:83:CB:C0:96:C7:78:01:EB:A7:B9:3F:F1:F1:61:20:D6:A2:BD:79\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3310859502 cname:b5LV6Q/DXmjN8J67\r\na=ssrc:3310859502 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626799784} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.044Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:13:20.044Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3519,"sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.044Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 43921 typ host generation 0 ufrag ulRm network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800021} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.250Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.250Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 41078 typ host generation 0 ufrag ulRm network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800025} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.288Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.288Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 41466 typ host generation 0 ufrag ulRm network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800028} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.295Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.295Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 40602 typ host generation 0 ufrag ulRm network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800030} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 47700 typ host generation 0 ufrag ulRm network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800034} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.300Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.300Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.301Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.301Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 37711 typ host generation 0 ufrag ulRm network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800037} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 60149 typ host generation 0 ufrag ulRm network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800040} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.302Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.302Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.302Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.302Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 51732 typ host generation 0 ufrag ulRm network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800053} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.407Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.407Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 54908 typ host generation 0 ufrag ulRm network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800056} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.444Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.444Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 42283 typ host generation 0 ufrag ulRm network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800061} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.446Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.446Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 41078 typ srflx raddr 192.168.219.109 rport 41078 generation 0 ufrag ulRm network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800307} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.516Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.516Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 60149 typ srflx raddr 192.168.219.109 rport 60149 generation 0 ufrag ulRm network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":1759626800336} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"30fd1255-b5b9-4749-a58e-c693a3e88b6b","timestamp":"2025-10-05T01:13:20.612Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:13:20.612Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626825303} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626825303} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626825303} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626855306} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626855306} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626855306} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626885310} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626885310} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626885310} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626915314} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626915314} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626915314} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626945320} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626945320} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626945320} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759626975325} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759626975325} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759626975325} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627005330} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627005330} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627005330} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627035334} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627035334} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627035334} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627065341} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627065341} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627065341} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627095346} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627095346} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627095346} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627125351} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627125351} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627125351} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627155356} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627155356} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627155356} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627185368} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627185368} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627185368} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627215373} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627215373} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627215373} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627245392} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627245392} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627245392} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627275396} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627275396} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627275396} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627305400} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627305400} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627305400} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627335407} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627335407} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627335407} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627365414} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627365414} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627365414} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627395419} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627395419} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627395419} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627425423} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627425423} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627425423} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627455448} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627455448} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627455448} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627485452} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627485452} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627485452} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627515456} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627515456} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627515456} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627545461} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627545461} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627545461} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627575464} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627575464} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627575464} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627605468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627605468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627605468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627635473} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627635473} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627635473} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627665480} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627665480} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627665480} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627695488} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627695488} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627695488} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627725492} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627725492} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627725492} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627755499} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627755499} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627755499} +{"level":"info","message":"Client disconnected: uIu5U18sKlJRDM3YAAAz, reason: transport close","timestamp":"2025-10-05T01:29:24.877Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:29:24.878Z"} +{"level":"info","message":"🔌 Connection terminated: 30fd1255-b5b9-4749-a58e-c693a3e88b6b - Device disconnected","timestamp":"2025-10-05T01:29:24.878Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:29:24.878Z"} +{"level":"info","message":"📱 Devices list requested by socket Gh1uAErc-K5oEUvRAAA1","timestamp":"2025-10-05T01:29:24.880Z"} +{"level":"info","message":"📱 Sending 0 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:29:24.880Z"} +{"level":"info","message":"Client disconnected: Gh1uAErc-K5oEUvRAAA1, reason: client namespace disconnect","timestamp":"2025-10-05T01:29:44.657Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:29:44.657Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:29:44.657Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:29:45.806Z","userAgent":""} +{"level":"info","message":"Operator registered: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:29:45.807Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.304Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.310Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Handling Android registration for socket: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:02.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.717Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:30:02.717Z"} +{"level":"info","message":"📱 Devices list requested by socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:02.719Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:02.719Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759627802314} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759627802314} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759627802314} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759627802314} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759627802314} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759627802314} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759627802314} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Handling Android registration for socket: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.757Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:02.758Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.758Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.758Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:30:02.758Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Handling Android registration for socket: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.758Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:02.758Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.758Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.759Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:30:02.759Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Handling Android registration for socket: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.759Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:02.759Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.759Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.759Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:30:02.759Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Handling Android registration for socket: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.759Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:02.760Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.760Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.760Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:30:02.760Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Handling Android registration for socket: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.760Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:02.760Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.760Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.761Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:30:02.761Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Handling Android registration for socket: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.761Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:02.761Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.761Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.761Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:30:02.761Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Handling Android registration for socket: YvEKxz8WebPf8I6zAAA5","timestamp":"2025-10-05T01:30:02.762Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759627802314} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:02.762Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.762Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"YvEKxz8WebPf8I6zAAA5","status":"online","timestamp":"2025-10-05T01:30:02.762Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:30:02.762Z"} +{"level":"info","message":"📱 Devices list requested by socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:02.763Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:02.763Z"} +{"level":"info","message":"📱 Devices list requested by socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:02.764Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:02.764Z"} +{"level":"info","message":"📱 Devices list requested by socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:02.764Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:02.764Z"} +{"level":"info","message":"📱 Devices list requested by socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:02.765Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:02.765Z"} +{"level":"info","message":"📱 Devices list requested by socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:02.770Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:02.770Z"} +{"level":"info","message":"📱 Devices list requested by socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:02.770Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:02.771Z"} +{"level":"info","message":"📱 Devices list requested by socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:02.771Z"} +{"level":"info","message":"📱 Sending 1 devices to operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:02.771Z"} +{"level":"info","message":"📷 Camera request received from operator socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:30:06.653Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:30:06.653Z"} +{"level":"info","message":"📷 Total operators registered: 1","timestamp":"2025-10-05T01:30:06.653Z"} +{"level":"info","message":"📷 Operator IDs: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:06.653Z"} +{"level":"info","message":"✅ Operator found: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:30:06.653Z"} +{"level":"info","message":"🔗 Initiating connection: fb7c61be-b1ce-40d4-b527-10f90bf16098 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:30:06.653Z"} +{"level":"info","message":"🆔 Generated connectionId: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.653Z"} +{"level":"info","message":"💾 Saving connection request: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.654Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:30:06.654Z"} +{"level":"info","message":"💾 All request IDs: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.654Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:30:06.654Z"} +{"level":"info","message":"✅ Connection request created: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.654Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:30:06.654Z"} +{"level":"info","message":"✅ Connection initiated: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.654Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"fb7c61be-b1ce-40d4-b527-10f90bf16098","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806525} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"fb7c61be-b1ce-40d4-b527-10f90bf16098","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806525} +{"level":"info","message":"📱 Camera response received from Android: sessionId=e691694b-ab3e-4735-8ce0-df3ab93a1148, accepted=true","timestamp":"2025-10-05T01:30:06.710Z"} +{"level":"info","message":"🔍 Looking for connection request: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.710Z"} +{"level":"info","message":"🔍 Available connection requests: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.710Z"} +{"level":"info","message":"✅ Connection established: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.710Z"} +{"level":"info","message":"✅ Connection accepted: e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.710Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 3624515259051950392 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:abfC\r\na=ice-pwd:9JNjDwpXM6HkzdtX+SNmlivD\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 09:1E:21:F3:42:5B:91:0D:BF:76:46:A0:59:38:4E:EA:F3:43:A6:BE:56:81:09:30:EC:CA:BD:74:BC:10:FB:AD\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 2927061039 1409627486\r\na=ssrc:2927061039 cname:S/+sC3etxMVedpYN\r\na=ssrc:2927061039 msid:stream videoTrack\r\na=ssrc:1409627486 cname:S/+sC3etxMVedpYN\r\na=ssrc:1409627486 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:abfC\r\na=ice-pwd:9JNjDwpXM6HkzdtX+SNmlivD\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 09:1E:21:F3:42:5B:91:0D:BF:76:46:A0:59:38:4E:EA:F3:43:A6:BE:56:81:09:30:EC:CA:BD:74:BC:10:FB:AD\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3467072367 cname:S/+sC3etxMVedpYN\r\na=ssrc:3467072367 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806679} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.876Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:30:06.876Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:06.876Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 53302 typ host generation 0 ufrag abfC network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806876} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.111Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.111Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 46434 typ host generation 0 ufrag abfC network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806879} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.178Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.178Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 40884 typ host generation 0 ufrag abfC network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806881} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.184Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.184Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 51522 typ host generation 0 ufrag abfC network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806887} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.187Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.187Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 45146 typ host generation 0 ufrag abfC network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806889} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.189Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.189Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 46724 typ host generation 0 ufrag abfC network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806891} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.197Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.197Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 44820 typ host generation 0 ufrag abfC network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806898} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 43780 typ host generation 0 ufrag abfC network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806900} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.205Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.205Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.205Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.205Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 52942 typ host generation 0 ufrag abfC network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806902} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.273Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.273Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 49361 typ host generation 0 ufrag abfC network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627806905} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.277Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.277Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 44820 typ srflx raddr 192.168.219.109 rport 44820 generation 0 ufrag abfC network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627807126} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.324Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.325Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 46434 typ srflx raddr 192.168.219.109 rport 46434 generation 0 ufrag abfC network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":1759627807129} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e691694b-ab3e-4735-8ce0-df3ab93a1148","timestamp":"2025-10-05T01:30:07.329Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:30:07.329Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627832348} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627832348} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627832348} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627862353} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627862353} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627862353} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627892361} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627892361} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627892361} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627922368} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627922368} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627922368} +{"level":"info","message":"📷 Camera request received from operator socket IDRa93LS41IP8M4fAAA3","timestamp":"2025-10-05T01:32:04.620Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:32:04.620Z"} +{"level":"info","message":"📷 Total operators registered: 1","timestamp":"2025-10-05T01:32:04.620Z"} +{"level":"info","message":"📷 Operator IDs: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:32:04.624Z"} +{"level":"info","message":"✅ Operator found: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:32:04.624Z"} +{"level":"info","message":"🔗 Initiating connection: fb7c61be-b1ce-40d4-b527-10f90bf16098 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:32:04.624Z"} +{"level":"error","message":"❌ Connection validation failed: Device busy or unavailable","timestamp":"2025-10-05T01:32:04.624Z"} +{"level":"error","message":"❌ Failed to initiate connection: Device busy or unavailable","timestamp":"2025-10-05T01:32:04.625Z"} +{"level":"info","message":"Client disconnected: IDRa93LS41IP8M4fAAA3, reason: client namespace disconnect","timestamp":"2025-10-05T01:32:05.968Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:32:05.968Z"} +{"level":"info","message":"🔌 Connection terminated: e691694b-ab3e-4735-8ce0-df3ab93a1148 - Operator disconnected","timestamp":"2025-10-05T01:32:05.969Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:32:05.969Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: ieyRxhILF_ej0IOkAAA7","timestamp":"2025-10-05T01:32:06.583Z","userAgent":""} +{"level":"info","message":"Operator registered: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:32:06.584Z"} +{"level":"info","message":"📷 Camera request received from operator socket ieyRxhILF_ej0IOkAAA7","timestamp":"2025-10-05T01:32:07.642Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:32:07.642Z"} +{"level":"info","message":"📷 Total operators registered: 1","timestamp":"2025-10-05T01:32:07.644Z"} +{"level":"info","message":"📷 Operator IDs: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:32:07.644Z"} +{"level":"info","message":"✅ Operator found: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:32:07.644Z"} +{"level":"info","message":"🔗 Initiating connection: fb7c61be-b1ce-40d4-b527-10f90bf16098 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:32:07.644Z"} +{"level":"info","message":"🆔 Generated connectionId: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.644Z"} +{"level":"info","message":"💾 Saving connection request: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.644Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:32:07.645Z"} +{"level":"info","message":"💾 All request IDs: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.645Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:32:07.645Z"} +{"level":"info","message":"✅ Connection request created: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.645Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:32:07.649Z"} +{"level":"info","message":"✅ Connection initiated: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.649Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"fb7c61be-b1ce-40d4-b527-10f90bf16098","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927484} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"fb7c61be-b1ce-40d4-b527-10f90bf16098","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927484} +{"level":"info","message":"📱 Camera response received from Android: sessionId=7afaca87-5c94-4035-aa7c-9a6bc47db776, accepted=true","timestamp":"2025-10-05T01:32:07.669Z"} +{"level":"info","message":"🔍 Looking for connection request: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.669Z"} +{"level":"info","message":"🔍 Available connection requests: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.670Z"} +{"level":"info","message":"✅ Connection established: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.674Z"} +{"level":"info","message":"✅ Connection accepted: 7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.674Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 6631991920175895458 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:NeT1\r\na=ice-pwd:u/LoTpntQbF23BnyPhBmHR6D\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 57:C0:ED:9C:34:86:6C:AE:E9:4A:5A:94:96:68:2B:BB:9E:E3:91:AA:4B:06:FD:CA:77:E1:BF:9C:52:B2:F9:65\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 4282545787 4088881803\r\na=ssrc:4282545787 cname:+w3a7EjyHn/2xRU4\r\na=ssrc:4282545787 msid:stream videoTrack\r\na=ssrc:4088881803 cname:+w3a7EjyHn/2xRU4\r\na=ssrc:4088881803 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:NeT1\r\na=ice-pwd:u/LoTpntQbF23BnyPhBmHR6D\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 57:C0:ED:9C:34:86:6C:AE:E9:4A:5A:94:96:68:2B:BB:9E:E3:91:AA:4B:06:FD:CA:77:E1:BF:9C:52:B2:F9:65\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3123278232 cname:+w3a7EjyHn/2xRU4\r\na=ssrc:3123278232 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927606} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.826Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:32:07.826Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.826Z"} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.826Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:32:07.827Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:07.827Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 34258 typ host generation 0 ufrag NeT1 network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927944} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.186Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.186Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.186Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.186Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 44158 typ host generation 0 ufrag NeT1 network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927951} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.216Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.216Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.216Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.216Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 35632 typ host generation 0 ufrag NeT1 network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927955} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.221Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.221Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.222Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.222Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 47518 typ host generation 0 ufrag NeT1 network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927958} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 35533 typ host generation 0 ufrag NeT1 network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927960} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.234Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.234Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.234Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.234Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.234Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.234Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.234Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.234Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 37872 typ host generation 0 ufrag NeT1 network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927972} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.235Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.235Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.236Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.237Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 38600 typ host generation 0 ufrag NeT1 network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927977} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.239Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.240Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.241Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.242Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 50230 typ host generation 0 ufrag NeT1 network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927980} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.243Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.243Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.243Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.243Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 52044 typ host generation 0 ufrag NeT1 network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927982} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.262Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.263Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.263Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.263Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 48224 typ host generation 0 ufrag NeT1 network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627927985} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.319Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.319Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.320Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.320Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 44158 typ srflx raddr 192.168.219.109 rport 44158 generation 0 ufrag NeT1 network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627928212} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.478Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.479Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.479Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.479Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 38600 typ srflx raddr 192.168.219.109 rport 38600 generation 0 ufrag NeT1 network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":1759627928289} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.564Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.564Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"7afaca87-5c94-4035-aa7c-9a6bc47db776","timestamp":"2025-10-05T01:32:08.565Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:32:08.565Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627952378} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627952378} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627952378} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759627982383} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759627982383} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759627982383} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628012388} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628012388} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628012388} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628042392} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628042392} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628042392} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628072397} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628072397} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628072397} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628102401} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628102401} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628102401} +{"level":"info","message":"Client disconnected: ieyRxhILF_ej0IOkAAA7, reason: transport close","timestamp":"2025-10-05T01:35:04.595Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:35:04.596Z"} +{"level":"info","message":"🔌 Connection terminated: 7afaca87-5c94-4035-aa7c-9a6bc47db776 - Operator disconnected","timestamp":"2025-10-05T01:35:04.596Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator fb7c61be-b1ce-40d4-b527-10f90bf16098","timestamp":"2025-10-05T01:35:04.596Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: q9r4dkfAf5tjLEtPAAA9","timestamp":"2025-10-05T01:35:14.993Z","userAgent":""} +{"level":"info","message":"Operator registered: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:35:14.996Z"} +{"level":"info","message":"📷 Camera request received from operator socket q9r4dkfAf5tjLEtPAAA9","timestamp":"2025-10-05T01:35:19.129Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"📷 Operator IDs: fb7c61be-b1ce-40d4-b527-10f90bf16098, c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"✅ Operator found: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"🔗 Initiating connection: c4fc2eec-0514-4901-9ce0-b10755c6bec8 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"🆔 Generated connectionId: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"💾 Saving connection request: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"💾 All request IDs: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:35:19.129Z"} +{"level":"info","message":"✅ Connection request created: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.130Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:35:19.130Z"} +{"level":"info","message":"✅ Connection initiated: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.130Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"c4fc2eec-0514-4901-9ce0-b10755c6bec8","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119047} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"c4fc2eec-0514-4901-9ce0-b10755c6bec8","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119047} +{"level":"info","message":"📱 Camera response received from Android: sessionId=5924ac1a-cd51-46af-9c85-9a87c77975bf, accepted=true","timestamp":"2025-10-05T01:35:19.250Z"} +{"level":"info","message":"🔍 Looking for connection request: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.250Z"} +{"level":"info","message":"🔍 Available connection requests: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.250Z"} +{"level":"info","message":"✅ Connection established: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.250Z"} +{"level":"info","message":"✅ Connection accepted: 5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.250Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 5865353099724626402 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:lLAh\r\na=ice-pwd:CiugGoXNdTluTnnbz1aHtTXM\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 7C:71:94:E7:9D:72:10:EB:38:C7:37:CC:6E:CB:CA:C5:E8:E8:7F:25:75:BD:40:49:DA:27:D0:2D:AB:AF:8C:B0\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 1908754989 4007160953\r\na=ssrc:1908754989 cname:qxzLNuBBVxGzDLfx\r\na=ssrc:1908754989 msid:stream videoTrack\r\na=ssrc:4007160953 cname:qxzLNuBBVxGzDLfx\r\na=ssrc:4007160953 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:lLAh\r\na=ice-pwd:CiugGoXNdTluTnnbz1aHtTXM\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 7C:71:94:E7:9D:72:10:EB:38:C7:37:CC:6E:CB:CA:C5:E8:E8:7F:25:75:BD:40:49:DA:27:D0:2D:AB:AF:8C:B0\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:925132896 cname:qxzLNuBBVxGzDLfx\r\na=ssrc:925132896 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119208} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.406Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:35:19.406Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3520,"sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.406Z"} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.407Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:35:19.407Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3520,"sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.407Z"} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.407Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:35:19.407Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3520,"sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.407Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 56289 typ host generation 0 ufrag lLAh network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119240} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.622Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.622Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.622Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.622Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.622Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.622Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 50781 typ host generation 0 ufrag lLAh network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119244} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.633Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.633Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.634Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.634Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.634Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.634Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 47823 typ host generation 0 ufrag lLAh network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119247} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.640Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.640Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.640Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.640Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.640Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.640Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 58470 typ host generation 0 ufrag lLAh network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119248} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.673Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.673Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.673Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.673Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.673Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.673Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 52717 typ host generation 0 ufrag lLAh network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119250} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.677Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.677Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.677Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.677Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.677Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.677Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 39586 typ host generation 0 ufrag lLAh network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119252} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.681Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.681Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.681Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.681Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.681Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.681Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 42711 typ host generation 0 ufrag lLAh network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119254} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.721Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.721Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.721Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.722Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.722Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.722Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 48794 typ host generation 0 ufrag lLAh network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119256} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 36083 typ host generation 0 ufrag lLAh network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119257} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.725Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.725Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.725Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.725Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.725Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.725Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.725Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.725Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.725Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.725Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.726Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.726Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 57428 typ host generation 0 ufrag lLAh network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119259} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.743Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.744Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.744Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.744Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.744Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.744Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 50781 typ srflx raddr 192.168.219.109 rport 50781 generation 0 ufrag lLAh network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119462} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 42711 typ srflx raddr 192.168.219.109 rport 42711 generation 0 ufrag lLAh network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":1759628119538} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.749Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.749Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.749Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.749Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.749Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.749Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.749Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.750Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.750Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.750Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"5924ac1a-cd51-46af-9c85-9a87c77975bf","timestamp":"2025-10-05T01:35:19.750Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:35:19.750Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628132406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628132406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628132406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628162410} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628162410} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628162410} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628192418} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628192418} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628192418} +{"level":"info","message":"Client disconnected: q9r4dkfAf5tjLEtPAAA9, reason: client namespace disconnect","timestamp":"2025-10-05T01:36:34.408Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:36:34.408Z"} +{"level":"info","message":"🔌 Connection terminated: 5924ac1a-cd51-46af-9c85-9a87c77975bf - Operator disconnected","timestamp":"2025-10-05T01:36:34.408Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:36:34.408Z"} +{"level":"info","message":"Client disconnected: YvEKxz8WebPf8I6zAAA5, reason: client namespace disconnect","timestamp":"2025-10-05T01:36:38.918Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:36:38.918Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:36:38.918Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: Pu_6dDpPSB_gzELsAAA_","timestamp":"2025-10-05T01:36:54.643Z","userAgent":""} +{"level":"info","message":"Operator registered: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:36:54.643Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.363Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.364Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759628231360} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759628231360} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759628231360} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759628231360} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Handling Android registration for socket: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.649Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:11.649Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.650Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.650Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:37:11.650Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Handling Android registration for socket: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.650Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:11.650Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.651Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.651Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:37:11.651Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Handling Android registration for socket: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.651Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:11.651Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.651Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.652Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:37:11.652Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Handling Android registration for socket: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.652Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:11.652Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.652Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.652Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:37:11.652Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Handling Android registration for socket: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.653Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:11.653Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.653Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.653Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:37:11.653Z"} +{"level":"info","message":"📱 Devices list requested by socket Pu_6dDpPSB_gzELsAAA_","timestamp":"2025-10-05T01:37:11.654Z"} +{"level":"info","message":"📱 Sending 1 devices to operator c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:37:11.654Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759628231360} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Handling Android registration for socket: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.663Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:11.664Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.664Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.664Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:37:11.664Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759628231360} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Handling Android registration for socket: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.684Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:11.684Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.684Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.684Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:37:11.684Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759628231360} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Handling Android registration for socket: Z0SYep1mJnGuuJCCAABB","timestamp":"2025-10-05T01:37:11.687Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628231360} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:11.687Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.687Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"Z0SYep1mJnGuuJCCAABB","status":"online","timestamp":"2025-10-05T01:37:11.688Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:37:11.688Z"} +{"level":"info","message":"📷 Camera request received from operator socket Pu_6dDpPSB_gzELsAAA_","timestamp":"2025-10-05T01:37:13.472Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:37:13.472Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T01:37:13.472Z"} +{"level":"info","message":"📷 Operator IDs: fb7c61be-b1ce-40d4-b527-10f90bf16098, c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:37:13.472Z"} +{"level":"info","message":"✅ Operator found: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:37:13.472Z"} +{"level":"info","message":"🔗 Initiating connection: c4fc2eec-0514-4901-9ce0-b10755c6bec8 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:37:13.473Z"} +{"level":"info","message":"🆔 Generated connectionId: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.473Z"} +{"level":"info","message":"💾 Saving connection request: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.473Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:37:13.473Z"} +{"level":"info","message":"💾 All request IDs: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.473Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:13.473Z"} +{"level":"info","message":"✅ Connection request created: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.473Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:37:13.473Z"} +{"level":"info","message":"✅ Connection initiated: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.473Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"c4fc2eec-0514-4901-9ce0-b10755c6bec8","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233430} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"c4fc2eec-0514-4901-9ce0-b10755c6bec8","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233430} +{"level":"info","message":"📱 Camera response received from Android: sessionId=e0642688-e4d9-4a59-950c-f2ba9ef7bab7, accepted=true","timestamp":"2025-10-05T01:37:13.614Z"} +{"level":"info","message":"🔍 Looking for connection request: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.614Z"} +{"level":"info","message":"🔍 Available connection requests: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.615Z"} +{"level":"info","message":"✅ Connection established: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.615Z"} +{"level":"info","message":"✅ Connection accepted: e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.615Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 4572658990222217329 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:h5Lt\r\na=ice-pwd:BRlA7EtlERUqVvkiJws146ii\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 3F:3E:A5:5C:FE:57:E6:A8:0C:30:98:92:95:4A:4F:19:C8:24:02:69:2A:42:AE:D8:C3:99:11:43:E9:26:FE:0C\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 2454116988 2498740150\r\na=ssrc:2454116988 cname:1d11fqdfMYhECz9a\r\na=ssrc:2454116988 msid:stream videoTrack\r\na=ssrc:2498740150 cname:1d11fqdfMYhECz9a\r\na=ssrc:2498740150 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:h5Lt\r\na=ice-pwd:BRlA7EtlERUqVvkiJws146ii\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 3F:3E:A5:5C:FE:57:E6:A8:0C:30:98:92:95:4A:4F:19:C8:24:02:69:2A:42:AE:D8:C3:99:11:43:E9:26:FE:0C\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:1899856421 cname:1d11fqdfMYhECz9a\r\na=ssrc:1899856421 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233655} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.852Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:37:13.852Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:13.852Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 32985 typ host generation 0 ufrag h5Lt network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233962} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.188Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.188Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 34353 typ host generation 0 ufrag h5Lt network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233968} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.223Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.223Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 42356 typ host generation 0 ufrag h5Lt network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233971} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 47163 typ host generation 0 ufrag h5Lt network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233985} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.226Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.227Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.227Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.227Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 54870 typ host generation 0 ufrag h5Lt network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233987} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.228Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.228Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 50094 typ host generation 0 ufrag h5Lt network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233989} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.230Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.230Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 41252 typ host generation 0 ufrag h5Lt network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233991} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.232Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.232Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 33617 typ host generation 0 ufrag h5Lt network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233992} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.250Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.250Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 57341 typ host generation 0 ufrag h5Lt network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233994} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.273Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.273Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 54391 typ host generation 0 ufrag h5Lt network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628233996} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.305Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.305Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 41252 typ srflx raddr 192.168.219.109 rport 41252 generation 0 ufrag h5Lt network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628234115} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.352Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.352Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 34353 typ srflx raddr 192.168.219.109 rport 34353 generation 0 ufrag h5Lt network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":1759628234249} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"e0642688-e4d9-4a59-950c-f2ba9ef7bab7","timestamp":"2025-10-05T01:37:14.443Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:14.443Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628261402} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628261402} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628261402} +{"level":"info","message":"Client disconnected: Pu_6dDpPSB_gzELsAAA_, reason: client namespace disconnect","timestamp":"2025-10-05T01:37:54.751Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:37:54.751Z"} +{"level":"info","message":"🔌 Connection terminated: e0642688-e4d9-4a59-950c-f2ba9ef7bab7 - Operator disconnected","timestamp":"2025-10-05T01:37:54.751Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:37:54.752Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: RsWhegarz5S-hFL3AABD","timestamp":"2025-10-05T01:37:55.275Z","userAgent":""} +{"level":"info","message":"Operator registered: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:37:55.276Z"} +{"level":"info","message":"📷 Camera request received from operator socket RsWhegarz5S-hFL3AABD","timestamp":"2025-10-05T01:37:56.544Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:37:56.544Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T01:37:56.544Z"} +{"level":"info","message":"📷 Operator IDs: fb7c61be-b1ce-40d4-b527-10f90bf16098, c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:37:56.544Z"} +{"level":"info","message":"✅ Operator found: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:37:56.544Z"} +{"level":"info","message":"🔗 Initiating connection: c4fc2eec-0514-4901-9ce0-b10755c6bec8 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:37:56.544Z"} +{"level":"info","message":"🆔 Generated connectionId: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.544Z"} +{"level":"info","message":"💾 Saving connection request: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.544Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:37:56.545Z"} +{"level":"info","message":"💾 All request IDs: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.545Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:37:56.545Z"} +{"level":"info","message":"✅ Connection request created: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.545Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:37:56.545Z"} +{"level":"info","message":"✅ Connection initiated: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.545Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"c4fc2eec-0514-4901-9ce0-b10755c6bec8","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276383} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"c4fc2eec-0514-4901-9ce0-b10755c6bec8","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276383} +{"level":"info","message":"📱 Camera response received from Android: sessionId=d2b0fe0e-8b52-4b7f-977a-5c4780e33593, accepted=true","timestamp":"2025-10-05T01:37:56.569Z"} +{"level":"info","message":"🔍 Looking for connection request: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.569Z"} +{"level":"info","message":"🔍 Available connection requests: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.569Z"} +{"level":"info","message":"✅ Connection established: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.569Z"} +{"level":"info","message":"✅ Connection accepted: d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.569Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 2932036203970845022 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:InY/\r\na=ice-pwd:xAMHeVjrzvx/0vgKP4odMShc\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 FB:F5:64:3B:68:C2:4D:51:CC:44:FC:7D:68:57:8E:D9:26:09:F5:A5:D0:3B:56:14:46:57:B6:5F:CD:C7:66:F1\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 517674559 655363639\r\na=ssrc:517674559 cname:pgEpmRNxurD4QhDH\r\na=ssrc:517674559 msid:stream videoTrack\r\na=ssrc:655363639 cname:pgEpmRNxurD4QhDH\r\na=ssrc:655363639 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:InY/\r\na=ice-pwd:xAMHeVjrzvx/0vgKP4odMShc\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 FB:F5:64:3B:68:C2:4D:51:CC:44:FC:7D:68:57:8E:D9:26:09:F5:A5:D0:3B:56:14:46:57:B6:5F:CD:C7:66:F1\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3897852348 cname:pgEpmRNxurD4QhDH\r\na=ssrc:3897852348 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276541} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.795Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:37:56.795Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3516,"sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.795Z"} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.795Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:37:56.795Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3516,"sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.796Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 39606 typ host generation 0 ufrag InY/ network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276686} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.905Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.905Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.905Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.905Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 51927 typ host generation 0 ufrag InY/ network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276690} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.979Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.979Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.979Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.979Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 53492 typ host generation 0 ufrag InY/ network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276694} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.985Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.985Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.985Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.986Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 51491 typ host generation 0 ufrag InY/ network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276697} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.988Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.988Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.988Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.988Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 56191 typ host generation 0 ufrag InY/ network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276703} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.991Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.991Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.991Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.992Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 41861 typ host generation 0 ufrag InY/ network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276706} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.997Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.997Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.997Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.997Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 37482 typ host generation 0 ufrag InY/ network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276711} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.999Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.999Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:56.999Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:56.999Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 47360 typ host generation 0 ufrag InY/ network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276714} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.047Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.047Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.047Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.047Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 51580 typ host generation 0 ufrag InY/ network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276716} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.062Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.062Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.062Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.062Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 34253 typ host generation 0 ufrag InY/ network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628276718} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.083Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.083Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.083Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.083Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 51927 typ srflx raddr 192.168.219.109 rport 51927 generation 0 ufrag InY/ network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628277003} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.196Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.196Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.196Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.196Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 37482 typ srflx raddr 192.168.219.109 rport 37482 generation 0 ufrag InY/ network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":1759628277006} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.212Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.212Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d2b0fe0e-8b52-4b7f-977a-5c4780e33593","timestamp":"2025-10-05T01:37:57.213Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:37:57.213Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628291406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628291406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628291406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628321411} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628321411} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628321411} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628351419} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628351419} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628351419} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628381424} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628381424} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628381424} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628411427} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628411427} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628411427} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628441432} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628441432} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628441432} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628471450} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628471450} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628471450} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628501454} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628501454} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628501454} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628531459} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628531459} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628531459} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628561463} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628561463} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628561463} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628591468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628591468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628591468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628621477} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628621477} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628621477} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628651486} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628651486} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628651486} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628681491} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628681491} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628681491} +{"level":"info","message":"Client disconnected: Z0SYep1mJnGuuJCCAABB, reason: transport close","timestamp":"2025-10-05T01:44:49.648Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:44:49.648Z"} +{"level":"info","message":"🔌 Connection terminated: d2b0fe0e-8b52-4b7f-977a-5c4780e33593 - Device disconnected","timestamp":"2025-10-05T01:44:49.648Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:44:49.648Z"} +{"level":"info","message":"📱 Devices list requested by socket RsWhegarz5S-hFL3AABD","timestamp":"2025-10-05T01:44:49.650Z"} +{"level":"info","message":"📱 Sending 0 devices to operator c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:44:49.650Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: Bl4uvA9z2ntzFkwtAABF","timestamp":"2025-10-05T01:45:02.097Z","userAgent":""} +{"level":"info","message":"Operator registered: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:45:02.099Z"} +{"level":"info","message":"Client disconnected: RsWhegarz5S-hFL3AABD, reason: client namespace disconnect","timestamp":"2025-10-05T01:45:08.640Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:45:08.640Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for operator c4fc2eec-0514-4901-9ce0-b10755c6bec8","timestamp":"2025-10-05T01:45:08.640Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.774Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.775Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Handling Android registration for socket: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.956Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:45.956Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.956Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.957Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:45:45.957Z"} +{"level":"info","message":"📱 Devices list requested by socket Bl4uvA9z2ntzFkwtAABF","timestamp":"2025-10-05T01:45:45.959Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:45:45.959Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759628745753} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Handling Android registration for socket: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.978Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:45.978Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.978Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.978Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:45:45.978Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759628745753} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Handling Android registration for socket: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.980Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:45.981Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.981Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.981Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:45:45.981Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759628745753} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759628745753} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759628745753} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Handling Android registration for socket: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.983Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:45.984Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.984Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.984Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:45:45.984Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Handling Android registration for socket: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.984Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:45.984Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.984Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.985Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:45:45.985Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Handling Android registration for socket: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.985Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:45.985Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.985Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.985Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:45:45.985Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759628745753} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759628745753} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Handling Android registration for socket: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.986Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:45.986Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.986Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.987Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:45:45.987Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Handling Android registration for socket: lMFWl4K1KJBnflJAAABH","timestamp":"2025-10-05T01:45:45.987Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759628745753} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:45.987Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.987Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"lMFWl4K1KJBnflJAAABH","status":"online","timestamp":"2025-10-05T01:45:45.987Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:45:45.987Z"} +{"level":"info","message":"📷 Camera request received from operator socket Bl4uvA9z2ntzFkwtAABF","timestamp":"2025-10-05T01:45:48.665Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:45:48.665Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T01:45:48.665Z"} +{"level":"info","message":"📷 Operator IDs: c4fc2eec-0514-4901-9ce0-b10755c6bec8, 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:45:48.665Z"} +{"level":"info","message":"✅ Operator found: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"🔗 Initiating connection: 7be66171-3221-4579-b2d7-70ddb96836a8 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"🆔 Generated connectionId: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"💾 Saving connection request: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"💾 All request IDs: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"✅ Connection request created: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:45:48.666Z"} +{"level":"info","message":"✅ Connection initiated: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.666Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"7be66171-3221-4579-b2d7-70ddb96836a8","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748604} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"7be66171-3221-4579-b2d7-70ddb96836a8","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748604} +{"level":"info","message":"📱 Camera response received from Android: sessionId=ba590771-b22d-40cc-a372-31080157e2d4, accepted=true","timestamp":"2025-10-05T01:45:48.794Z"} +{"level":"info","message":"🔍 Looking for connection request: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.794Z"} +{"level":"info","message":"🔍 Available connection requests: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.794Z"} +{"level":"info","message":"✅ Connection established: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.794Z"} +{"level":"info","message":"✅ Connection accepted: ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.794Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 3922746085774147355 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:v5aN\r\na=ice-pwd:gR3qFa9Rn9j64mEhCi6dvdf3\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 95:07:15:27:FD:E3:30:C1:6C:D6:4D:5A:E4:05:C8:FE:DF:D6:CE:AB:68:F1:0A:F0:C7:56:E2:17:2C:FD:3C:49\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 4149238381 745215569\r\na=ssrc:4149238381 cname:fI0PQhZ5D15P3Hhi\r\na=ssrc:4149238381 msid:stream videoTrack\r\na=ssrc:745215569 cname:fI0PQhZ5D15P3Hhi\r\na=ssrc:745215569 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:v5aN\r\na=ice-pwd:gR3qFa9Rn9j64mEhCi6dvdf3\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 95:07:15:27:FD:E3:30:C1:6C:D6:4D:5A:E4:05:C8:FE:DF:D6:CE:AB:68:F1:0A:F0:C7:56:E2:17:2C:FD:3C:49\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3872829989 cname:fI0PQhZ5D15P3Hhi\r\na=ssrc:3872829989 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748721} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.929Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:45:48.929Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3519,"sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:48.929Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 42256 typ host generation 0 ufrag v5aN network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748905} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.179Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.179Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 36125 typ host generation 0 ufrag v5aN network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748952} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.194Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.194Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 49310 typ host generation 0 ufrag v5aN network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748954} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 42574 typ host generation 0 ufrag v5aN network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748956} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 46474 typ host generation 0 ufrag v5aN network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748958} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.199Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.200Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.202Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.202Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.202Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.202Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 35961 typ host generation 0 ufrag v5aN network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748960} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 59048 typ host generation 0 ufrag v5aN network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748964} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 55861 typ host generation 0 ufrag v5aN network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748966} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.204Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.204Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.204Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.205Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.208Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.208Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 36417 typ host generation 0 ufrag v5aN network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748969} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 56684 typ host generation 0 ufrag v5aN network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628748971} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.209Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.209Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.209Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.209Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 36125 typ srflx raddr 192.168.219.109 rport 36125 generation 0 ufrag v5aN network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628749087} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.294Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.294Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 59048 typ srflx raddr 192.168.219.109 rport 59048 generation 0 ufrag v5aN network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":1759628749105} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"ba590771-b22d-40cc-a372-31080157e2d4","timestamp":"2025-10-05T01:45:49.308Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:45:49.308Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628775769} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628775769} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628775769} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628805773} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628805773} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628805773} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628835777} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628835777} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628835777} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628865781} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628865781} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628865781} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628895789} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628895789} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628895789} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628925814} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628925814} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628925814} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628955821} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628955821} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628955821} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759628985831} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759628985831} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759628985831} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629015835} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629015835} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629015835} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629045841} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629045841} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629045841} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629075848} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629075848} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629075848} +{"level":"info","message":"Client disconnected: lMFWl4K1KJBnflJAAABH, reason: transport close","timestamp":"2025-10-05T01:51:23.516Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:23.516Z"} +{"level":"info","message":"🔌 Connection terminated: ba590771-b22d-40cc-a372-31080157e2d4 - Device disconnected","timestamp":"2025-10-05T01:51:23.516Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:23.516Z"} +{"level":"info","message":"📱 Devices list requested by socket Bl4uvA9z2ntzFkwtAABF","timestamp":"2025-10-05T01:51:23.518Z"} +{"level":"info","message":"📱 Sending 0 devices to operator 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:51:23.518Z"} +{"level":"info","message":"Client disconnected: Bl4uvA9z2ntzFkwtAABF, reason: client namespace disconnect","timestamp":"2025-10-05T01:51:36.914Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:51:36.914Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for operator 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:51:36.914Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: 7g5LBlcQkYJsr83IAABJ","timestamp":"2025-10-05T01:51:39.407Z","userAgent":""} +{"level":"info","message":"Operator registered: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:51:39.408Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.354Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.354Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Handling Android registration for socket: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.532Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:47.532Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.532Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.533Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:51:47.533Z"} +{"level":"info","message":"📱 Devices list requested by socket 7g5LBlcQkYJsr83IAABJ","timestamp":"2025-10-05T01:51:47.534Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:51:47.535Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759629107312} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Handling Android registration for socket: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.560Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:47.560Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.560Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.560Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:51:47.561Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759629107312} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Handling Android registration for socket: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.563Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:47.564Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.564Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.564Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:51:47.564Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759629107312} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Handling Android registration for socket: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.571Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:47.571Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.571Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.572Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:51:47.572Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759629107312} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Handling Android registration for socket: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.592Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:47.592Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.592Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.593Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:51:47.593Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759629107312} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Handling Android registration for socket: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.600Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:47.600Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.600Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.601Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:51:47.601Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759629107312} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Handling Android registration for socket: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.604Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:47.604Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.604Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.604Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:51:47.604Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759629107312} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Handling Android registration for socket: eKvyeDjBOdcqbLO_AABL","timestamp":"2025-10-05T01:51:47.607Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759629107312} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:47.608Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.608Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"eKvyeDjBOdcqbLO_AABL","status":"online","timestamp":"2025-10-05T01:51:47.608Z"} +{"level":"info","message":"📡 Notifying 1 operators about new device","timestamp":"2025-10-05T01:51:47.608Z"} +{"level":"info","message":"📷 Camera request received from operator socket 7g5LBlcQkYJsr83IAABJ","timestamp":"2025-10-05T01:51:50.299Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"📷 Total operators registered: 1","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"📷 Operator IDs: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"✅ Operator found: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"🔗 Initiating connection: 7be66171-3221-4579-b2d7-70ddb96836a8 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"🆔 Generated connectionId: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"💾 Saving connection request: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"💾 All request IDs: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"✅ Connection request created: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:51:50.299Z"} +{"level":"info","message":"✅ Connection initiated: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.300Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"7be66171-3221-4579-b2d7-70ddb96836a8","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110177} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"7be66171-3221-4579-b2d7-70ddb96836a8","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110177} +{"level":"info","message":"📱 Camera response received from Android: sessionId=1168e3bd-e9a1-4e95-b5ee-d9ad27d90497, accepted=true","timestamp":"2025-10-05T01:51:50.370Z"} +{"level":"info","message":"🔍 Looking for connection request: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.370Z"} +{"level":"info","message":"🔍 Available connection requests: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.370Z"} +{"level":"info","message":"✅ Connection established: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.370Z"} +{"level":"info","message":"✅ Connection accepted: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.370Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 2050819790412801989 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:5of7\r\na=ice-pwd:Uv2xGke5DbrdlxxM7k6ybrxl\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 5B:5A:8E:EE:CA:28:52:72:A9:8A:F8:23:29:DC:ED:22:C2:8B:F8:2A:60:E0:C1:50:36:ED:ED:9F:84:E9:43:B9\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 3133717401 3097268367\r\na=ssrc:3133717401 cname:IjgciEKUHwADfcZf\r\na=ssrc:3133717401 msid:stream videoTrack\r\na=ssrc:3097268367 cname:IjgciEKUHwADfcZf\r\na=ssrc:3097268367 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:5of7\r\na=ice-pwd:Uv2xGke5DbrdlxxM7k6ybrxl\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 5B:5A:8E:EE:CA:28:52:72:A9:8A:F8:23:29:DC:ED:22:C2:8B:F8:2A:60:E0:C1:50:36:ED:ED:9F:84:E9:43:B9\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:164884548 cname:IjgciEKUHwADfcZf\r\na=ssrc:164884548 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110380} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.659Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:51:50.659Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3520,"sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:50.659Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 48274 typ host generation 0 ufrag 5of7 network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110920} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.192Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.192Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 33515 typ host generation 0 ufrag 5of7 network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110930} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.248Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.248Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 37683 typ host generation 0 ufrag 5of7 network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110933} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 54547 typ host generation 0 ufrag 5of7 network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110936} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.261Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.261Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.261Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.262Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 58508 typ host generation 0 ufrag 5of7 network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110939} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 44114 typ host generation 0 ufrag 5of7 network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110943} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 57321 typ host generation 0 ufrag 5of7 network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110946} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.263Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.263Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.263Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.263Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.263Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.264Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 35452 typ host generation 0 ufrag 5of7 network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110949} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.267Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.267Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 39087 typ host generation 0 ufrag 5of7 network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110954} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.269Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.269Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 35389 typ host generation 0 ufrag 5of7 network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629110959} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.271Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.271Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 33515 typ srflx raddr 192.168.219.109 rport 33515 generation 0 ufrag 5of7 network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629111074} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.309Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.309Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 7965 typ srflx raddr 192.168.219.109 rport 57321 generation 0 ufrag 5of7 network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":1759629111106} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"1168e3bd-e9a1-4e95-b5ee-d9ad27d90497","timestamp":"2025-10-05T01:51:51.328Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:51:51.328Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629137341} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629137341} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629137341} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629167346} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629167346} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629167346} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629197352} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629197352} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629197352} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629227359} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629227359} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629227359} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629257376} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629257376} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629257376} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629287380} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629287380} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629287380} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629317389} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629317389} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629317389} +{"level":"info","message":"Client disconnected: 7g5LBlcQkYJsr83IAABJ, reason: client namespace disconnect","timestamp":"2025-10-05T01:55:36.035Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:55:36.035Z"} +{"level":"info","message":"🔌 Connection terminated: 1168e3bd-e9a1-4e95-b5ee-d9ad27d90497 - Operator disconnected","timestamp":"2025-10-05T01:55:36.035Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:55:36.035Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: xJVEyy6PbVJrNCWqAABN","timestamp":"2025-10-05T01:55:37.669Z","userAgent":""} +{"level":"info","message":"Operator registered: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:55:37.670Z"} +{"level":"info","message":"📷 Camera request received from operator socket xJVEyy6PbVJrNCWqAABN","timestamp":"2025-10-05T01:55:39.604Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"📷 Total operators registered: 1","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"📷 Operator IDs: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"✅ Operator found: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"🔗 Initiating connection: 7be66171-3221-4579-b2d7-70ddb96836a8 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"🆔 Generated connectionId: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"💾 Saving connection request: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"💾 All request IDs: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"✅ Connection request created: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T01:55:39.604Z"} +{"level":"info","message":"✅ Connection initiated: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.605Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"7be66171-3221-4579-b2d7-70ddb96836a8","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339430} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"7be66171-3221-4579-b2d7-70ddb96836a8","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339430} +{"level":"info","message":"📱 Camera response received from Android: sessionId=790418e7-9ffc-4c20-bd4c-52cf94d6afa3, accepted=true","timestamp":"2025-10-05T01:55:39.630Z"} +{"level":"info","message":"🔍 Looking for connection request: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.630Z"} +{"level":"info","message":"🔍 Available connection requests: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.630Z"} +{"level":"info","message":"✅ Connection established: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.631Z"} +{"level":"info","message":"✅ Connection accepted: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.631Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 2068752446486500314 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:SJfd\r\na=ice-pwd:Lmgmk70L1KWWDfZKu7Rg8efy\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 29:09:8E:01:58:99:18:CD:9A:A8:4D:74:47:1D:CF:C6:E3:81:9A:84:FA:75:84:8F:8B:C9:92:07:DF:86:F4:06\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 3898283048 2965249652\r\na=ssrc:3898283048 cname:YhNdku6LBVZI8qqd\r\na=ssrc:3898283048 msid:stream videoTrack\r\na=ssrc:2965249652 cname:YhNdku6LBVZI8qqd\r\na=ssrc:2965249652 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:SJfd\r\na=ice-pwd:Lmgmk70L1KWWDfZKu7Rg8efy\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 29:09:8E:01:58:99:18:CD:9A:A8:4D:74:47:1D:CF:C6:E3:81:9A:84:FA:75:84:8F:8B:C9:92:07:DF:86:F4:06\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3206377493 cname:YhNdku6LBVZI8qqd\r\na=ssrc:3206377493 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339556} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.767Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:55:39.767Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.767Z"} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.767Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T01:55:39.768Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.768Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 42762 typ host generation 0 ufrag SJfd network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339721} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.950Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:39.950Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:39.950Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:39.950Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 34558 typ host generation 0 ufrag SJfd network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339723} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.011Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.011Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.011Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.011Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 41267 typ host generation 0 ufrag SJfd network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339725} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 47111 typ host generation 0 ufrag SJfd network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339727} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.016Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.016Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.017Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.017Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.017Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.017Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.017Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.017Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 39999 typ host generation 0 ufrag SJfd network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339758} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.020Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.021Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.021Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.021Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 47125 typ host generation 0 ufrag SJfd network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339760} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.025Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.025Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.026Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.026Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 47432 typ host generation 0 ufrag SJfd network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339790} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 49048 typ host generation 0 ufrag SJfd network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339793} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.029Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.029Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.029Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.031Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.031Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.031Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.031Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.031Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 36951 typ host generation 0 ufrag SJfd network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339824} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.044Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.044Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.044Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.044Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 39748 typ host generation 0 ufrag SJfd network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339835} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.073Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.073Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.073Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.073Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 47432 typ srflx raddr 192.168.219.109 rport 47432 generation 0 ufrag SJfd network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339915} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.160Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.160Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.161Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.161Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 34558 typ srflx raddr 192.168.219.109 rport 34558 generation 0 ufrag SJfd network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":1759629339976} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.195Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.195Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"790418e7-9ffc-4c20-bd4c-52cf94d6afa3","timestamp":"2025-10-05T01:55:40.195Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T01:55:40.195Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629347393} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629347393} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629347393} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629377399} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629377399} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629377399} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629407406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629407406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629407406} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629437409} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629437409} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629437409} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629467414} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629467414} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629467414} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629497416} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629497416} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629497416} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629527418} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629527418} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629527418} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629557421} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629557421} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629557421} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629587428} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629587428} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629587428} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629617431} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629617431} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629617431} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629647436} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629647436} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629647436} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629677452} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629677452} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629677452} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629707455} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629707455} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629707455} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629737462} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629737462} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629737462} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629767464} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629767464} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629767464} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629797468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629797468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629797468} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629827471} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629827471} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629827471} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629857474} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629857474} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629857474} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629887477} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629887477} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629887477} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629917480} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629917480} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629917480} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629947483} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629947483} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629947483} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759629977486} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759629977486} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759629977486} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630007489} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630007489} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630007489} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630037492} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630037492} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630037492} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630067495} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630067495} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630067495} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630097497} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630097497} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630097497} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630127510} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630127510} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630127510} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630157514} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630157514} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630157514} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630187518} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630187518} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630187518} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630217520} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630217520} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630217520} +{"level":"info","message":"Client disconnected: hRLAd01Wa5kPqmJzAAAD, reason: transport close","timestamp":"2025-10-05T02:10:43.814Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630247529} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630247529} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630247529} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630277533} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630277533} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630277533} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: LB9k1YSqN84uvUGEAABP","timestamp":"2025-10-05T02:11:38.319Z","userAgent":""} +{"level":"info","message":"Operator registered: be83169d-e3df-4d28-bdcb-0eb68444b7a4","timestamp":"2025-10-05T02:11:38.331Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630307541} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630307541} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630307541} +{"level":"info","message":"Client disconnected: eKvyeDjBOdcqbLO_AABL, reason: client namespace disconnect","timestamp":"2025-10-05T02:11:57.459Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:11:57.460Z"} +{"level":"info","message":"🔌 Connection terminated: 790418e7-9ffc-4c20-bd4c-52cf94d6afa3 - Device disconnected","timestamp":"2025-10-05T02:11:57.460Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:11:57.460Z"} +{"level":"info","message":"📱 Devices list requested by socket xJVEyy6PbVJrNCWqAABN","timestamp":"2025-10-05T02:11:57.461Z"} +{"level":"info","message":"📱 Sending 0 devices to operator 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T02:11:57.461Z"} +{"level":"info","message":"📱 Devices list requested by socket LB9k1YSqN84uvUGEAABP","timestamp":"2025-10-05T02:11:57.461Z"} +{"level":"info","message":"📱 Sending 0 devices to operator be83169d-e3df-4d28-bdcb-0eb68444b7a4","timestamp":"2025-10-05T02:11:57.461Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:01.857Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:01.857Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759630321790} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759630321790} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759630321790} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759630321790} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Handling Android registration for socket: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:02.110Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:02.110Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.110Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.110Z"} +{"level":"info","message":"📡 Notifying 2 operators about new device","timestamp":"2025-10-05T02:12:02.110Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Handling Android registration for socket: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:02.110Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:02.111Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.111Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.111Z"} +{"level":"info","message":"📡 Notifying 2 operators about new device","timestamp":"2025-10-05T02:12:02.111Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Handling Android registration for socket: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:02.111Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:02.111Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.111Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.112Z"} +{"level":"info","message":"📡 Notifying 2 operators about new device","timestamp":"2025-10-05T02:12:02.112Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Handling Android registration for socket: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:02.112Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:02.112Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.112Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.113Z"} +{"level":"info","message":"📡 Notifying 2 operators about new device","timestamp":"2025-10-05T02:12:02.113Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Handling Android registration for socket: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:02.113Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:02.113Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.113Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.113Z"} +{"level":"info","message":"📡 Notifying 2 operators about new device","timestamp":"2025-10-05T02:12:02.114Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759630321790} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759630321790} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Handling Android registration for socket: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:02.115Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:02.115Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.115Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.115Z"} +{"level":"info","message":"📡 Notifying 2 operators about new device","timestamp":"2025-10-05T02:12:02.115Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Handling Android registration for socket: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:02.115Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:02.116Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.116Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.116Z"} +{"level":"info","message":"📡 Notifying 2 operators about new device","timestamp":"2025-10-05T02:12:02.116Z"} +{"level":"info","message":"📱 Devices list requested by socket xJVEyy6PbVJrNCWqAABN","timestamp":"2025-10-05T02:12:02.116Z"} +{"level":"info","message":"📱 Sending 1 devices to operator 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T02:12:02.117Z"} +{"level":"info","message":"📱 Devices list requested by socket LB9k1YSqN84uvUGEAABP","timestamp":"2025-10-05T02:12:02.117Z"} +{"level":"info","message":"📱 Sending 1 devices to operator be83169d-e3df-4d28-bdcb-0eb68444b7a4","timestamp":"2025-10-05T02:12:02.117Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759630321790} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Handling Android registration for socket: WVzYyi-2QaMDRnAuAABR","timestamp":"2025-10-05T02:12:02.117Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759630321790} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:02.117Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.118Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"WVzYyi-2QaMDRnAuAABR","status":"online","timestamp":"2025-10-05T02:12:02.118Z"} +{"level":"info","message":"📡 Notifying 2 operators about new device","timestamp":"2025-10-05T02:12:02.118Z"} +{"level":"info","message":"📷 Camera request received from operator socket LB9k1YSqN84uvUGEAABP","timestamp":"2025-10-05T02:12:04.999Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"📷 Total operators registered: 2","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"📷 Operator IDs: 7be66171-3221-4579-b2d7-70ddb96836a8, be83169d-e3df-4d28-bdcb-0eb68444b7a4","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"✅ Operator found: be83169d-e3df-4d28-bdcb-0eb68444b7a4","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"🔗 Initiating connection: be83169d-e3df-4d28-bdcb-0eb68444b7a4 -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"🆔 Generated connectionId: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"💾 Saving connection request: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"💾 All request IDs: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"✅ Connection request created: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T02:12:04.999Z"} +{"level":"info","message":"✅ Connection initiated: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:04.999Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"be83169d-e3df-4d28-bdcb-0eb68444b7a4","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630324819} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"be83169d-e3df-4d28-bdcb-0eb68444b7a4","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630324819} +{"level":"info","message":"📱 Camera response received from Android: sessionId=4cf3709d-c095-44a4-950d-0295a4d04d75, accepted=true","timestamp":"2025-10-05T02:12:05.024Z"} +{"level":"info","message":"🔍 Looking for connection request: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.024Z"} +{"level":"info","message":"🔍 Available connection requests: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.024Z"} +{"level":"info","message":"✅ Connection established: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.024Z"} +{"level":"info","message":"✅ Connection accepted: 4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.024Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 1371367764671667532 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:MPFI\r\na=ice-pwd:7kYRs55gNHIugW1yUGbgcmEs\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 69:F9:D9:97:E1:81:3F:31:04:FF:65:D7:11:D8:1F:0C:5E:03:5B:32:3A:33:A6:F8:57:00:2D:36:60:1C:88:39\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 3718311999 1786824186\r\na=ssrc:3718311999 cname:+2w09PghkKEec5U3\r\na=ssrc:3718311999 msid:stream videoTrack\r\na=ssrc:1786824186 cname:+2w09PghkKEec5U3\r\na=ssrc:1786824186 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:MPFI\r\na=ice-pwd:7kYRs55gNHIugW1yUGbgcmEs\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 69:F9:D9:97:E1:81:3F:31:04:FF:65:D7:11:D8:1F:0C:5E:03:5B:32:3A:33:A6:F8:57:00:2D:36:60:1C:88:39\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3856985742 cname:+2w09PghkKEec5U3\r\na=ssrc:3856985742 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630324912} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.204Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T02:12:05.204Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.204Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 35206 typ host generation 0 ufrag MPFI network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325133} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.473Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.473Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 34909 typ host generation 0 ufrag MPFI network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325169} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.480Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.480Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 53472 typ host generation 0 ufrag MPFI network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325181} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.486Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.486Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 34601 typ host generation 0 ufrag MPFI network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325218} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 48873 typ host generation 0 ufrag MPFI network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325231} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 42077 typ host generation 0 ufrag MPFI network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325258} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.494Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.494Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.494Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.494Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.494Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.494Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 37104 typ host generation 0 ufrag MPFI network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325260} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.533Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.533Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 50191 typ host generation 0 ufrag MPFI network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325267} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.535Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.535Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 40290 typ host generation 0 ufrag MPFI network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325274} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.658Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.658Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 34896 typ host generation 0 ufrag MPFI network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325275} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.661Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.661Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 34909 typ srflx raddr 192.168.219.109 rport 34909 generation 0 ufrag MPFI network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325284} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.662Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.662Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 37104 typ srflx raddr 192.168.219.109 rport 37104 generation 0 ufrag MPFI network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":1759630325304} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"4cf3709d-c095-44a4-950d-0295a4d04d75","timestamp":"2025-10-05T02:12:05.664Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:12:05.664Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630351795} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630351795} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630351795} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630381798} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630381798} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630381798} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630411800} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630411800} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630411800} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630441805} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630441805} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630441805} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630471808} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630471808} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630471808} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630501816} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630501816} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630501816} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630531818} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630531818} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630531818} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630561821} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630561821} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630561821} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630591825} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630591825} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630591825} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630621829} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630621829} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630621829} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630651839} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630651839} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630651839} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630681843} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630681843} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630681843} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630711846} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630711846} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630711846} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630741852} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630741852} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630741852} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630771856} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630771856} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630771856} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630801858} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630801858} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630801858} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630831860} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630831860} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630831860} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630861863} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630861863} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630861863} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630891866} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630891866} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630891866} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630921871} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630921871} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630921871} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630951876} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630951876} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630951876} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759630981879} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759630981879} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759630981879} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631011896} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631011896} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631011896} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631041907} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631041907} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631041907} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631071913} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631071913} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631071913} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631101916} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631101916} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631101916} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631131924} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631131924} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631131924} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631161931} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631161931} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631161931} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631191938} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631191938} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631191938} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631221944} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631221944} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631221944} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631251948} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631251948} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631251948} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631281951} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631281951} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631281951} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631311954} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631311954} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631311954} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631341956} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631341956} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631341956} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631371958} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631371958} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631371958} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631401961} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631401961} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631401961} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631431968} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631431968} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631431968} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631461972} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631461972} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631461972} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631491976} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631491976} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631491976} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631521979} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631521979} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631521979} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631551984} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631551984} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631551984} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631581986} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631581986} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631581986} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631611989} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631611989} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631611989} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631641992} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631641992} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631641992} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631671997} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631671997} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631671997} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631702005} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631702005} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631702005} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631732008} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631732008} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631732008} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631762010} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631762010} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631762010} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631792015} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631792015} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631792015} +{"level":"info","message":"Client disconnected: xJVEyy6PbVJrNCWqAABN, reason: transport close","timestamp":"2025-10-05T02:36:44.622Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T02:36:44.622Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for operator 7be66171-3221-4579-b2d7-70ddb96836a8","timestamp":"2025-10-05T02:36:44.622Z"} +{"level":"info","message":"Client disconnected: LB9k1YSqN84uvUGEAABP, reason: transport close","timestamp":"2025-10-05T02:36:58.856Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: be83169d-e3df-4d28-bdcb-0eb68444b7a4","timestamp":"2025-10-05T02:36:58.856Z"} +{"level":"info","message":"🔌 Connection terminated: 4cf3709d-c095-44a4-950d-0295a4d04d75 - Operator disconnected","timestamp":"2025-10-05T02:36:58.856Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator be83169d-e3df-4d28-bdcb-0eb68444b7a4","timestamp":"2025-10-05T02:36:58.856Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631822018} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631822018} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631822018} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: T5rjpq6BPLXav_8-AABT","timestamp":"2025-10-05T02:37:07.248Z","userAgent":""} +{"level":"info","message":"Operator registered: 38fa09d4-1898-4b49-a071-c4d1b30af80c","timestamp":"2025-10-05T02:37:07.251Z"} +{"level":"info","message":"📷 Camera request received from operator socket T5rjpq6BPLXav_8-AABT","timestamp":"2025-10-05T02:37:11.708Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"📷 Total operators registered: 3","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"📷 Operator IDs: 7be66171-3221-4579-b2d7-70ddb96836a8, be83169d-e3df-4d28-bdcb-0eb68444b7a4, 38fa09d4-1898-4b49-a071-c4d1b30af80c","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"✅ Operator found: 38fa09d4-1898-4b49-a071-c4d1b30af80c","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"🔗 Initiating connection: 38fa09d4-1898-4b49-a071-c4d1b30af80c -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"🆔 Generated connectionId: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"💾 Saving connection request: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"💾 All request IDs: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:37:11.708Z"} +{"level":"info","message":"✅ Connection request created: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.709Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T02:37:11.709Z"} +{"level":"info","message":"✅ Connection initiated: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.709Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"38fa09d4-1898-4b49-a071-c4d1b30af80c","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831538} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"38fa09d4-1898-4b49-a071-c4d1b30af80c","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831538} +{"level":"info","message":"📱 Camera response received from Android: sessionId=163aee01-352c-4275-8544-8054a2745f0d, accepted=true","timestamp":"2025-10-05T02:37:11.744Z"} +{"level":"info","message":"🔍 Looking for connection request: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.744Z"} +{"level":"info","message":"🔍 Available connection requests: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.745Z"} +{"level":"info","message":"✅ Connection established: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.745Z"} +{"level":"info","message":"✅ Connection accepted: 163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.745Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 4152790376600027612 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:sDFV\r\na=ice-pwd:g8Xa5PUHhzLDigb7Jtp7NfDz\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 3E:52:A6:A9:03:2F:4A:5C:26:06:EC:9A:18:91:92:22:BC:68:26:3B:E4:40:AA:06:6A:8A:BC:43:36:E8:64:98\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 1965384903 4282540621\r\na=ssrc:1965384903 cname:IOXFe/b1/19scmb1\r\na=ssrc:1965384903 msid:stream videoTrack\r\na=ssrc:4282540621 cname:IOXFe/b1/19scmb1\r\na=ssrc:4282540621 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:sDFV\r\na=ice-pwd:g8Xa5PUHhzLDigb7Jtp7NfDz\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 3E:52:A6:A9:03:2F:4A:5C:26:06:EC:9A:18:91:92:22:BC:68:26:3B:E4:40:AA:06:6A:8A:BC:43:36:E8:64:98\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3638745988 cname:IOXFe/b1/19scmb1\r\na=ssrc:3638745988 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831628} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.844Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T02:37:11.844Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.844Z"} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.844Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T02:37:11.844Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:11.844Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 60194 typ host generation 0 ufrag sDFV network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831791} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.038Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.038Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.038Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.038Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 36900 typ host generation 0 ufrag sDFV network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831793} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.077Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.077Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.077Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.077Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 36168 typ host generation 0 ufrag sDFV network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831795} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.078Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.079Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.079Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.080Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 58022 typ host generation 0 ufrag sDFV network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831797} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 53353 typ host generation 0 ufrag sDFV network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831800} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 52525 typ host generation 0 ufrag sDFV network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831803} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 56770 typ host generation 0 ufrag sDFV network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831831} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 60394 typ host generation 0 ufrag sDFV network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831841} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.185Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.185Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.185Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.185Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.185Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.185Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.185Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.186Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.186Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.186Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.186Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.186Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.186Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.186Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.186Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.186Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.186Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.186Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.186Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.186Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 55975 typ host generation 0 ufrag sDFV network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831870} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.187Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.187Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.188Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.188Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 59701 typ host generation 0 ufrag sDFV network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631831872} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.192Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.192Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.192Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.192Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 52882 typ srflx raddr 192.168.219.109 rport 56770 generation 0 ufrag sDFV network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631832095} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.318Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.318Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.318Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.318Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 36900 typ srflx raddr 192.168.219.109 rport 36900 generation 0 ufrag sDFV network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":1759631832102} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.319Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.320Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"163aee01-352c-4275-8544-8054a2745f0d","timestamp":"2025-10-05T02:37:12.320Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:37:12.320Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631852022} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631852022} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631852022} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631882026} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631882026} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631882026} +{"level":"info","message":"Client disconnected: T5rjpq6BPLXav_8-AABT, reason: transport close","timestamp":"2025-10-05T02:38:15.529Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: 38fa09d4-1898-4b49-a071-c4d1b30af80c","timestamp":"2025-10-05T02:38:15.529Z"} +{"level":"info","message":"🔌 Connection terminated: 163aee01-352c-4275-8544-8054a2745f0d - Operator disconnected","timestamp":"2025-10-05T02:38:15.529Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator 38fa09d4-1898-4b49-a071-c4d1b30af80c","timestamp":"2025-10-05T02:38:15.530Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631912028} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631912028} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631912028} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631942033} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631942033} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631942033} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759631972039} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759631972039} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759631972039} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632002043} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632002043} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632002043} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632032045} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632032045} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632032045} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: _MLE0EY39NeObHT5AABV","timestamp":"2025-10-05T02:40:37.563Z","userAgent":""} +{"level":"info","message":"Operator registered: e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:40:37.565Z"} +{"level":"info","message":"📷 Camera request received from operator socket _MLE0EY39NeObHT5AABV","timestamp":"2025-10-05T02:40:42.095Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"📷 Total operators registered: 4","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"📷 Operator IDs: 7be66171-3221-4579-b2d7-70ddb96836a8, be83169d-e3df-4d28-bdcb-0eb68444b7a4, 38fa09d4-1898-4b49-a071-c4d1b30af80c, e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"✅ Operator found: e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"🔗 Initiating connection: e5fe6dd2-b265-4d38-9114-a6971fe552dc -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"🆔 Generated connectionId: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"💾 Saving connection request: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"💾 All request IDs: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:40:42.096Z"} +{"level":"info","message":"✅ Connection request created: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.097Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T02:40:42.097Z"} +{"level":"info","message":"✅ Connection initiated: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.097Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"e5fe6dd2-b265-4d38-9114-a6971fe552dc","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632041969} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"e5fe6dd2-b265-4d38-9114-a6971fe552dc","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632041969} +{"level":"info","message":"📱 Camera response received from Android: sessionId=d5e2d1d2-fe90-40c0-81db-cc5591a8c131, accepted=true","timestamp":"2025-10-05T02:40:42.177Z"} +{"level":"info","message":"🔍 Looking for connection request: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.177Z"} +{"level":"info","message":"🔍 Available connection requests: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.177Z"} +{"level":"info","message":"✅ Connection established: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.178Z"} +{"level":"info","message":"✅ Connection accepted: d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.178Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 6677664499902068472 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:gQVB\r\na=ice-pwd:LGFf20HTy0oKRfgR/QVQyoKa\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 23:9B:7C:E0:32:71:E4:D2:B8:BB:89:B3:0A:1D:86:E1:F5:03:70:87:86:27:2B:10:A3:B0:88:1B:21:5A:AB:F6\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 4048150404 788480275\r\na=ssrc:4048150404 cname:z80v3llFALNh4cuP\r\na=ssrc:4048150404 msid:stream videoTrack\r\na=ssrc:788480275 cname:z80v3llFALNh4cuP\r\na=ssrc:788480275 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:gQVB\r\na=ice-pwd:LGFf20HTy0oKRfgR/QVQyoKa\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 23:9B:7C:E0:32:71:E4:D2:B8:BB:89:B3:0A:1D:86:E1:F5:03:70:87:86:27:2B:10:A3:B0:88:1B:21:5A:AB:F6\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3431375263 cname:z80v3llFALNh4cuP\r\na=ssrc:3431375263 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042063} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.295Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T02:40:42.295Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3519,"sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.295Z"} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.296Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T02:40:42.297Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3519,"sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.297Z"} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.297Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T02:40:42.297Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3519,"sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.297Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 36525 typ host generation 0 ufrag gQVB network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042097} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.363Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.364Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.364Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.364Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.365Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.365Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 37802 typ host generation 0 ufrag gQVB network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042106} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.519Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.519Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.519Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.519Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.519Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.519Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 40074 typ host generation 0 ufrag gQVB network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042108} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.521Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.521Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.521Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.521Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.521Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.521Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 56013 typ host generation 0 ufrag gQVB network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042114} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.552Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.552Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.552Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.552Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.552Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.552Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 58724 typ host generation 0 ufrag gQVB network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042116} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.564Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.564Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.564Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.564Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.564Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.564Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 46456 typ host generation 0 ufrag gQVB network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042118} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.568Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.568Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.568Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.569Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.569Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.569Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 55184 typ host generation 0 ufrag gQVB network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042120} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.583Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.583Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.583Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.584Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.586Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.587Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 40704 typ host generation 0 ufrag gQVB network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042123} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 44408 typ host generation 0 ufrag gQVB network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042125} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 40892 typ host generation 0 ufrag gQVB network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042127} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.590Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.590Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.590Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.590Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.590Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.590Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.590Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.590Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.590Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.590Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.590Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.590Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.591Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.591Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.591Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.591Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.591Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.591Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 55184 typ srflx raddr 192.168.219.109 rport 55184 generation 0 ufrag gQVB network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042307} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.594Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.594Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.594Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.594Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.594Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.594Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 37802 typ srflx raddr 192.168.219.109 rport 37802 generation 0 ufrag gQVB network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":1759632042349} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.596Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.596Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.596Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.596Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"d5e2d1d2-fe90-40c0-81db-cc5591a8c131","timestamp":"2025-10-05T02:40:42.596Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:40:42.596Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632062050} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632062050} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632062050} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632092053} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632092053} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632092053} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632122061} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632122061} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632122061} +{"level":"info","message":"Client disconnected: _MLE0EY39NeObHT5AABV, reason: client namespace disconnect","timestamp":"2025-10-05T02:42:20.971Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:42:20.971Z"} +{"level":"info","message":"🔌 Connection terminated: d5e2d1d2-fe90-40c0-81db-cc5591a8c131 - Operator disconnected","timestamp":"2025-10-05T02:42:20.971Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:42:20.971Z"} +{"level":"info","message":"Client disconnected: WVzYyi-2QaMDRnAuAABR, reason: client namespace disconnect","timestamp":"2025-10-05T02:42:25.878Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:25.878Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:25.878Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:26.980Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:26.980Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Handling Android registration for socket: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:27.131Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:27.131Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.131Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.131Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:42:27.132Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759632146876} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759632146876} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759632146876} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759632146876} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759632146876} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Handling Android registration for socket: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:27.159Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:27.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.160Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:42:27.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Handling Android registration for socket: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:27.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:27.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.160Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.161Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:42:27.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Handling Android registration for socket: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:27.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:27.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.161Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.162Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:42:27.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Handling Android registration for socket: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:27.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:27.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.162Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:42:27.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Handling Android registration for socket: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:27.162Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:27.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.163Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:42:27.163Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759632146876} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759632146876} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Handling Android registration for socket: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:27.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:27.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.164Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:42:27.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Handling Android registration for socket: w5YGQ7c8YOZlhXruAABX","timestamp":"2025-10-05T02:42:27.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632146876} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:27.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.164Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"w5YGQ7c8YOZlhXruAABX","status":"online","timestamp":"2025-10-05T02:42:27.165Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:42:27.165Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: YWDbwAO1O8mW-qVQAABZ","timestamp":"2025-10-05T02:42:29.526Z","userAgent":""} +{"level":"info","message":"Operator registered: e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:42:29.527Z"} +{"level":"info","message":"📷 Camera request received from operator socket YWDbwAO1O8mW-qVQAABZ","timestamp":"2025-10-05T02:42:31.332Z"} +{"cameraType":"back","deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📷 Request data:","timestamp":"2025-10-05T02:42:31.332Z"} +{"level":"info","message":"📷 Total operators registered: 4","timestamp":"2025-10-05T02:42:31.332Z"} +{"level":"info","message":"📷 Operator IDs: 7be66171-3221-4579-b2d7-70ddb96836a8, be83169d-e3df-4d28-bdcb-0eb68444b7a4, 38fa09d4-1898-4b49-a071-c4d1b30af80c, e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:42:31.332Z"} +{"level":"info","message":"✅ Operator found: e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:42:31.332Z"} +{"level":"info","message":"🔗 Initiating connection: e5fe6dd2-b265-4d38-9114-a6971fe552dc -> 381068ea-78a3-45c9-a960-8f5b5896c814 (back)","timestamp":"2025-10-05T02:42:31.332Z"} +{"level":"info","message":"🆔 Generated connectionId: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.333Z"} +{"level":"info","message":"💾 Saving connection request: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.333Z"} +{"level":"info","message":"💾 Connection requests count: 1","timestamp":"2025-10-05T02:42:31.333Z"} +{"level":"info","message":"💾 All request IDs: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.333Z"} +{"level":"info","message":"📱 Sending camera:request to Android device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:42:31.333Z"} +{"level":"info","message":"✅ Connection request created: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.333Z"} +{"level":"info","message":"✅ Final connectionRequests count: 1","timestamp":"2025-10-05T02:42:31.333Z"} +{"level":"info","message":"✅ Connection initiated: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.333Z"} +{"approved":true,"level":"info","message":"📱 Android event: camera-response","operatorId":"e5fe6dd2-b265-4d38-9114-a6971fe552dc","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151142} +{"approved":true,"level":"info","message":"📱 Android camera-response received, converting to camera:response format:","operatorId":"e5fe6dd2-b265-4d38-9114-a6971fe552dc","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151142} +{"level":"info","message":"📱 Camera response received from Android: sessionId=35ca2017-4357-4487-a626-caf8453b9e54, accepted=true","timestamp":"2025-10-05T02:42:31.356Z"} +{"level":"info","message":"🔍 Looking for connection request: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.356Z"} +{"level":"info","message":"🔍 Available connection requests: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.356Z"} +{"level":"info","message":"✅ Connection established: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.357Z"} +{"level":"info","message":"✅ Connection accepted: 35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.357Z"} +{"level":"info","message":"📱 Android event: webrtc:offer","offer":{"sdp":"v=0\r\no=- 8478561460443287040 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 0 1\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS stream\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 35 36 127 124 123 122 125\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:Efwl\r\na=ice-pwd:EXoX7tHCaEm7KZjg8O6kxGG0\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 34:62:61:57:E2:40:E7:27:60:0E:F8:CC:1C:35:32:3B:2E:51:E8:FD:5F:89:7D:77:A8:07:4E:30:6E:BF:28:C4\r\na=setup:actpass\r\na=mid:0\r\na=extmap:1 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 urn:3gpp:video-orientation\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\r\na=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\r\na=sendonly\r\na=msid:stream videoTrack\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:35 AV1/90000\r\na=rtcp-fb:35 goog-remb\r\na=rtcp-fb:35 transport-cc\r\na=rtcp-fb:35 ccm fir\r\na=rtcp-fb:35 nack\r\na=rtcp-fb:35 nack pli\r\na=rtpmap:36 rtx/90000\r\na=fmtp:36 apt=35\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=127\r\na=rtpmap:123 red/90000\r\na=rtpmap:122 rtx/90000\r\na=fmtp:122 apt=123\r\na=rtpmap:125 ulpfec/90000\r\na=ssrc-group:FID 1771305594 3410262367\r\na=ssrc:1771305594 cname:fa+24PdM+uBFN8w/\r\na=ssrc:1771305594 msid:stream videoTrack\r\na=ssrc:3410262367 cname:fa+24PdM+uBFN8w/\r\na=ssrc:3410262367 msid:stream videoTrack\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 63 103 104 9 102 0 8 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:Efwl\r\na=ice-pwd:EXoX7tHCaEm7KZjg8O6kxGG0\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 34:62:61:57:E2:40:E7:27:60:0E:F8:CC:1C:35:32:3B:2E:51:E8:FD:5F:89:7D:77:A8:07:4E:30:6E:BF:28:C4\r\na=setup:actpass\r\na=mid:1\r\na=extmap:14 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid\r\na=sendonly\r\na=msid:stream audioTrack\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:63 red/48000/2\r\na=fmtp:63 111/111\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:2758768870 cname:fa+24PdM+uBFN8w/\r\na=ssrc:2758768870 msid:stream audioTrack\r\n","type":"offer"},"sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151235} +{"level":"info","message":"🔄 WebRTC offer received:","offerKeys":["type","sdp"],"offerType":"object","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.450Z"} +{"level":"info","message":"📤 Forwarding offer from device to operator","timestamp":"2025-10-05T02:42:31.450Z"} +{"level":"info","message":"🔄 Forwarding normalized offer:","offerType":"offer","sdpLength":3522,"sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.450Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 36480 typ host generation 0 ufrag Efwl network-id 7 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151376} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.612Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.612Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 46737 typ host generation 0 ufrag Efwl network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151377} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.626Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.626Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 38438 typ host generation 0 ufrag Efwl network-id 4 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151378} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.629Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.629Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 50351 typ host generation 0 ufrag Efwl network-id 5 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151379} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.634Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.634Z"} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 52260 typ host generation 0 ufrag Efwl network-id 3 network-cost 900","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151379} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122262783 2406:5900:90da:a64:de0b:34ff:feb8:8619 40815 typ host generation 0 ufrag Efwl network-id 7 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151380} +{"candidate":{"candidate":"candidate:42056630 1 udp 2122194687 192.168.219.109 58396 typ host generation 0 ufrag Efwl network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151381} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122131711 2406:5900:90da:a64:de0b:34ff:feb8:8619 58153 typ host generation 0 ufrag Efwl network-id 4 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151381} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.655Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.655Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.655Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.655Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.655Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.655Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.655Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.655Z"} +{"candidate":{"candidate":"candidate:1680673774 1 udp 2122066175 2406:5900:90da:a64:de0b:34ff:feb8:8619 43802 typ host generation 0 ufrag Efwl network-id 5 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151383} +{"candidate":{"candidate":"candidate:42056630 1 udp 2121998079 192.168.219.109 34541 typ host generation 0 ufrag Efwl network-id 3 network-cost 900","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151384} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.657Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.657Z"} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.657Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.657Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 46737 typ srflx raddr 192.168.219.109 rport 46737 generation 0 ufrag Efwl network-id 6 network-cost 10","sdpMLineIndex":0,"sdpMid":"0"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151565} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.780Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.780Z"} +{"candidate":{"candidate":"candidate:842163049 1 udp 1685987071 211.118.216.184 58396 typ srflx raddr 192.168.219.109 rport 58396 generation 0 ufrag Efwl network-id 6 network-cost 10","sdpMLineIndex":1,"sdpMid":"1"},"level":"info","message":"📱 Android event: webrtc:ice-candidate","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":1759632151637} +{"candidateKeys":["candidate","sdpMLineIndex","sdpMid"],"candidateType":"object","level":"info","message":"🔄 WebRTC ICE candidate received:","sessionId":"35ca2017-4357-4487-a626-caf8453b9e54","timestamp":"2025-10-05T02:42:31.862Z"} +{"level":"info","message":"📤 Forwarding ICE candidate from device to operator","timestamp":"2025-10-05T02:42:31.862Z"} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632176890} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632176890} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632176890} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: SUFerH1xn-kvjPo5AABb","timestamp":"2025-10-05T02:43:18.517Z","userAgent":""} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632206899} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632206899} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632206899} +{"level":"info","message":"Client disconnected: SUFerH1xn-kvjPo5AABb, reason: transport close","timestamp":"2025-10-05T02:43:30.058Z"} +{"level":"info","message":"Client disconnected: YWDbwAO1O8mW-qVQAABZ, reason: transport close","timestamp":"2025-10-05T02:43:39.247Z"} +{"level":"info","message":"🧹 Cleaning up connections for operator: e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:43:39.247Z"} +{"level":"info","message":"🔌 Connection terminated: 35ca2017-4357-4487-a626-caf8453b9e54 - Operator disconnected","timestamp":"2025-10-05T02:43:39.247Z"} +{"level":"info","message":"🧹 Cleaned up 1 connections for operator e5fe6dd2-b265-4d38-9114-a6971fe552dc","timestamp":"2025-10-05T02:43:39.247Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: zUzKrU5Rjp9aO-_XAABd","timestamp":"2025-10-05T02:43:48.152Z","userAgent":""} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: O3qYycwsxbJfVPgRAABf","timestamp":"2025-10-05T02:43:52.095Z","userAgent":""} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632236921} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632236921} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632236921} +{"level":"info","message":"Client disconnected: w5YGQ7c8YOZlhXruAABX, reason: client namespace disconnect","timestamp":"2025-10-05T02:43:58.802Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:58.802Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:58.802Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.509Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.509Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759632239399} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759632239399} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759632239399} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759632239399} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Handling Android registration for socket: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:59.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.716Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:43:59.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Handling Android registration for socket: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:59.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.716Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.717Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Handling Android registration for socket: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.717Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Handling Android registration for socket: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.717Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Handling Android registration for socket: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:59.717Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.718Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.718Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:43:59.718Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759632239399} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759632239399} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759632239399} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Handling Android registration for socket: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.719Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:59.719Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.719Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.719Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:43:59.719Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Handling Android registration for socket: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:59.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.720Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:43:59.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Handling Android registration for socket: br0pgJMtn_UY8KVCAABh","timestamp":"2025-10-05T02:43:59.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632239399} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:43:59.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.720Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"br0pgJMtn_UY8KVCAABh","status":"online","timestamp":"2025-10-05T02:43:59.720Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:43:59.720Z"} +{"level":"info","message":"📱 Devices list requested by socket O3qYycwsxbJfVPgRAABf","timestamp":"2025-10-05T02:44:01.196Z"} +{"level":"error","message":"❌ Operator not found for devices:list request from socket O3qYycwsxbJfVPgRAABf","timestamp":"2025-10-05T02:44:01.196Z"} +{"level":"info","message":"📱 Devices list requested by socket O3qYycwsxbJfVPgRAABf","timestamp":"2025-10-05T02:44:01.292Z"} +{"level":"error","message":"❌ Operator not found for devices:list request from socket O3qYycwsxbJfVPgRAABf","timestamp":"2025-10-05T02:44:01.292Z"} +{"level":"info","message":"📱 Devices list requested by socket O3qYycwsxbJfVPgRAABf","timestamp":"2025-10-05T02:44:01.908Z"} +{"level":"error","message":"❌ Operator not found for devices:list request from socket O3qYycwsxbJfVPgRAABf","timestamp":"2025-10-05T02:44:01.908Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: UCdkzcMFQ8vseiEnAABj","timestamp":"2025-10-05T02:44:02.704Z","userAgent":""} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: v74GFTzPeq-QkMXgAABl","timestamp":"2025-10-05T02:44:03.415Z","userAgent":""} +{"level":"info","message":"Client disconnected: v74GFTzPeq-QkMXgAABl, reason: transport close","timestamp":"2025-10-05T02:44:04.880Z"} +{"level":"info","message":"Client disconnected: UCdkzcMFQ8vseiEnAABj, reason: transport close","timestamp":"2025-10-05T02:44:04.881Z"} +{"level":"info","message":"Client disconnected: zUzKrU5Rjp9aO-_XAABd, reason: transport close","timestamp":"2025-10-05T02:44:04.881Z"} +{"level":"info","message":"Client disconnected: O3qYycwsxbJfVPgRAABf, reason: transport close","timestamp":"2025-10-05T02:44:04.881Z"} +{"address":"192.168.219.108","isAndroid":false,"isMobileWeb":false,"level":"info","message":"New connection: MRX06cm7R_7iIXSnAABn","timestamp":"2025-10-05T02:44:22.154Z","userAgent":""} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: device-keepalive","status":"online","timestamp":1759632269407} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: keepalive","status":"online","timestamp":1759632269407} +{"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","level":"info","message":"📱 Android event: ping","status":"online","timestamp":1759632269407} +{"level":"info","message":"Client disconnected: br0pgJMtn_UY8KVCAABh, reason: client namespace disconnect","timestamp":"2025-10-05T02:44:31.460Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:31.460Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:31.460Z"} +{"address":"192.168.219.109","isAndroid":true,"isMobileWeb":false,"level":"info","message":"New connection: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.293Z","userAgent":"okhttp/4.12.0"} +{"level":"info","message":"🤖 Android client connected: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.293Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register:android","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Handling Android registration for socket: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.405Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:32.405Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.405Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.405Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:44:32.405Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759632272168} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-register","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Handling Android registration for socket: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.438Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:32.438Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.438Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.438Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:44:32.438Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759632272168} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759632272168} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759632272168} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759632272168} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759632272168} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register-device","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Handling Android registration for socket: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.439Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:32.439Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.439Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.440Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:44:32.440Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device:register","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Handling Android registration for socket: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.440Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:32.440Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.440Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.440Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:44:32.440Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: register","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Handling Android registration for socket: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.441Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:32.441Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.441Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.441Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:44:32.441Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device-info","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Handling Android registration for socket: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.441Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:32.441Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.441Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.442Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:44:32.442Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: devices:register","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Handling Android registration for socket: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.442Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:32.442Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.442Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.442Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:44:32.442Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759632272168} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Android event: device_register","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Handling Android registration for socket: 0thFEaR3t42L_ERcAABp","timestamp":"2025-10-05T02:44:32.443Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceId":"381068ea-78a3-45c9-a960-8f5b5896c814","deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Registration data:","status":"online","timestamp":1759632272168} +{"level":"info","message":"📱 Processed deviceId: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:32.443Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"📱 Processed deviceInfo:","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.443Z"} +{"androidVersion":"9","appVersion":"1.0.0","capabilities":{"camera":true,"microphone":true,"webrtc":true},"deviceName":"LGM-G600S","deviceType":"android","level":"info","message":"✅ Android client registered: 381068ea-78a3-45c9-a960-8f5b5896c814","socketId":"0thFEaR3t42L_ERcAABp","status":"online","timestamp":"2025-10-05T02:44:32.444Z"} +{"level":"info","message":"📡 Notifying 0 operators about new device","timestamp":"2025-10-05T02:44:32.444Z"} +{"level":"info","message":"Client disconnected: 0thFEaR3t42L_ERcAABp, reason: client namespace disconnect","timestamp":"2025-10-05T02:44:33.166Z"} +{"level":"info","message":"🧹 Cleaning up connections for device: 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:33.166Z"} +{"level":"info","message":"🧹 Cleaned up 0 connections for device 381068ea-78a3-45c9-a960-8f5b5896c814","timestamp":"2025-10-05T02:44:33.166Z"} +{"level":"info","message":"SIGINT received, shutting down gracefully","timestamp":"2025-10-05T02:44:50.956Z"} diff --git a/desktop-operator/node_modules/.package-lock.json b/desktop-operator/node_modules/.package-lock.json index 81897db..e811143 100644 --- a/desktop-operator/node_modules/.package-lock.json +++ b/desktop-operator/node_modules/.package-lock.json @@ -676,9 +676,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.18.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz", - "integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==", + "version": "22.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz", + "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", "dev": true, "dependencies": { "undici-types": "~6.21.0" @@ -1915,9 +1915,9 @@ } }, "node_modules/electron": { - "version": "38.2.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-38.2.0.tgz", - "integrity": "sha512-Cw5Mb+N5NxsG0Hc1qr8I65Kt5APRrbgTtEEn3zTod30UNJRnAE1xbGk/1NOaDn3ODzI/MYn6BzT9T9zreP7xWA==", + "version": "38.2.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-38.2.1.tgz", + "integrity": "sha512-P4pE2RpRg3kM8IeOK+heg6iAxR5wcXnNHrbVchn7M3GBnYAhjfJRkROusdOro5PlKzdtfKjesbbqaG4MqQXccg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -4468,9 +4468,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/desktop-operator/node_modules/@types/node/README.md b/desktop-operator/node_modules/@types/node/README.md index f31d102..428d7b5 100644 --- a/desktop-operator/node_modules/@types/node/README.md +++ b/desktop-operator/node_modules/@types/node/README.md @@ -8,7 +8,7 @@ This package contains type definitions for node (https://nodejs.org/). Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node/v22. ### Additional Details - * Last updated: Thu, 18 Sep 2025 00:04:03 GMT + * Last updated: Tue, 30 Sep 2025 23:32:16 GMT * Dependencies: [undici-types](https://npmjs.com/package/undici-types) # Credits diff --git a/desktop-operator/node_modules/@types/node/assert.d.ts b/desktop-operator/node_modules/@types/node/assert.d.ts index c340ef6..f01d48e 100644 --- a/desktop-operator/node_modules/@types/node/assert.d.ts +++ b/desktop-operator/node_modules/@types/node/assert.d.ts @@ -11,6 +11,25 @@ declare module "assert" { */ function assert(value: unknown, message?: string | Error): asserts value; namespace assert { + type AssertMethodNames = + | "deepEqual" + | "deepStrictEqual" + | "doesNotMatch" + | "doesNotReject" + | "doesNotThrow" + | "equal" + | "fail" + | "ifError" + | "match" + | "notDeepEqual" + | "notDeepStrictEqual" + | "notEqual" + | "notStrictEqual" + | "ok" + | "partialDeepStrictEqual" + | "rejects" + | "strictEqual" + | "throws"; /** * Indicates the failure of an assertion. All errors thrown by the `node:assert` module will be instances of the `AssertionError` class. */ diff --git a/desktop-operator/node_modules/@types/node/events.d.ts b/desktop-operator/node_modules/@types/node/events.d.ts index 1912273..c8bae9a 100644 --- a/desktop-operator/node_modules/@types/node/events.d.ts +++ b/desktop-operator/node_modules/@types/node/events.d.ts @@ -36,39 +36,6 @@ */ declare module "events" { import { AsyncResource, AsyncResourceOptions } from "node:async_hooks"; - // NOTE: This class is in the docs but is **not actually exported** by Node. - // If https://github.com/nodejs/node/issues/39903 gets resolved and Node - // actually starts exporting the class, uncomment below. - // import { EventListener, EventListenerObject } from '__dom-events'; - // /** The NodeEventTarget is a Node.js-specific extension to EventTarget that emulates a subset of the EventEmitter API. */ - // interface NodeEventTarget extends EventTarget { - // /** - // * Node.js-specific extension to the `EventTarget` class that emulates the equivalent `EventEmitter` API. - // * The only difference between `addListener()` and `addEventListener()` is that addListener() will return a reference to the EventTarget. - // */ - // addListener(type: string, listener: EventListener | EventListenerObject, options?: { once: boolean }): this; - // /** Node.js-specific extension to the `EventTarget` class that returns an array of event `type` names for which event listeners are registered. */ - // eventNames(): string[]; - // /** Node.js-specific extension to the `EventTarget` class that returns the number of event listeners registered for the `type`. */ - // listenerCount(type: string): number; - // /** Node.js-specific alias for `eventTarget.removeListener()`. */ - // off(type: string, listener: EventListener | EventListenerObject): this; - // /** Node.js-specific alias for `eventTarget.addListener()`. */ - // on(type: string, listener: EventListener | EventListenerObject, options?: { once: boolean }): this; - // /** Node.js-specific extension to the `EventTarget` class that adds a `once` listener for the given event `type`. This is equivalent to calling `on` with the `once` option set to `true`. */ - // once(type: string, listener: EventListener | EventListenerObject): this; - // /** - // * Node.js-specific extension to the `EventTarget` class. - // * If `type` is specified, removes all registered listeners for `type`, - // * otherwise removes all registered listeners. - // */ - // removeAllListeners(type: string): this; - // /** - // * Node.js-specific extension to the `EventTarget` class that removes the listener for the given `type`. - // * The only difference between `removeListener()` and `removeEventListener()` is that `removeListener()` will return a reference to the `EventTarget`. - // */ - // removeListener(type: string, listener: EventListener | EventListenerObject): this; - // } interface EventEmitterOptions { /** * Enables automatic capturing of promise rejection. @@ -584,6 +551,85 @@ declare module "events" { */ readonly asyncResource: EventEmitterReferencingAsyncResource; } + /** + * The `NodeEventTarget` is a Node.js-specific extension to `EventTarget` + * that emulates a subset of the `EventEmitter` API. + * @since v14.5.0 + */ + export interface NodeEventTarget extends EventTarget { + /** + * Node.js-specific extension to the `EventTarget` class that emulates the + * equivalent `EventEmitter` API. The only difference between `addListener()` and + * `addEventListener()` is that `addListener()` will return a reference to the + * `EventTarget`. + * @since v14.5.0 + */ + addListener(type: string, listener: (arg: any) => void): this; + /** + * Node.js-specific extension to the `EventTarget` class that dispatches the + * `arg` to the list of handlers for `type`. + * @since v15.2.0 + * @returns `true` if event listeners registered for the `type` exist, + * otherwise `false`. + */ + emit(type: string, arg: any): boolean; + /** + * Node.js-specific extension to the `EventTarget` class that returns an array + * of event `type` names for which event listeners are registered. + * @since 14.5.0 + */ + eventNames(): string[]; + /** + * Node.js-specific extension to the `EventTarget` class that returns the number + * of event listeners registered for the `type`. + * @since v14.5.0 + */ + listenerCount(type: string): number; + /** + * Node.js-specific extension to the `EventTarget` class that sets the number + * of max event listeners as `n`. + * @since v14.5.0 + */ + setMaxListeners(n: number): void; + /** + * Node.js-specific extension to the `EventTarget` class that returns the number + * of max event listeners. + * @since v14.5.0 + */ + getMaxListeners(): number; + /** + * Node.js-specific alias for `eventTarget.removeEventListener()`. + * @since v14.5.0 + */ + off(type: string, listener: (arg: any) => void, options?: EventListenerOptions): this; + /** + * Node.js-specific alias for `eventTarget.addEventListener()`. + * @since v14.5.0 + */ + on(type: string, listener: (arg: any) => void): this; + /** + * Node.js-specific extension to the `EventTarget` class that adds a `once` + * listener for the given event `type`. This is equivalent to calling `on` + * with the `once` option set to `true`. + * @since v14.5.0 + */ + once(type: string, listener: (arg: any) => void): this; + /** + * Node.js-specific extension to the `EventTarget` class. If `type` is specified, + * removes all registered listeners for `type`, otherwise removes all registered + * listeners. + * @since v14.5.0 + */ + removeAllListeners(type?: string): this; + /** + * Node.js-specific extension to the `EventTarget` class that removes the + * `listener` for the given `type`. The only difference between `removeListener()` + * and `removeEventListener()` is that `removeListener()` will return a reference + * to the `EventTarget`. + * @since v14.5.0 + */ + removeListener(type: string, listener: (arg: any) => void, options?: EventListenerOptions): this; + } } global { namespace NodeJS { diff --git a/desktop-operator/node_modules/@types/node/package.json b/desktop-operator/node_modules/@types/node/package.json index d8cd1c4..37db6f5 100644 --- a/desktop-operator/node_modules/@types/node/package.json +++ b/desktop-operator/node_modules/@types/node/package.json @@ -1,6 +1,6 @@ { "name": "@types/node", - "version": "22.18.6", + "version": "22.18.8", "description": "TypeScript definitions for node", "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node", "license": "MIT", @@ -140,6 +140,6 @@ "undici-types": "~6.21.0" }, "peerDependencies": {}, - "typesPublisherContentHash": "223d0ed2825fc2dbdef1d6dd0cb95b10912c9cb13dc3bdb5a089e502d84cbb1b", + "typesPublisherContentHash": "044f75e3119c1f821a07c434b16c3cebf99c812c67c1db15d8b7abd8caad071d", "typeScriptVersion": "5.2" } \ No newline at end of file diff --git a/desktop-operator/node_modules/@types/node/test.d.ts b/desktop-operator/node_modules/@types/node/test.d.ts index 5bd2926..1c173f6 100644 --- a/desktop-operator/node_modules/@types/node/test.d.ts +++ b/desktop-operator/node_modules/@types/node/test.d.ts @@ -79,6 +79,7 @@ * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/test.js) */ declare module "node:test" { + import { AssertMethodNames } from "node:assert"; import { Readable } from "node:stream"; import TestFn = test.TestFn; import TestOptions = test.TestOptions; @@ -1157,29 +1158,7 @@ declare module "node:test" { */ readonly mock: MockTracker; } - interface TestContextAssert extends - Pick< - typeof import("assert"), - | "deepEqual" - | "deepStrictEqual" - | "doesNotMatch" - | "doesNotReject" - | "doesNotThrow" - | "equal" - | "fail" - | "ifError" - | "match" - | "notDeepEqual" - | "notDeepStrictEqual" - | "notEqual" - | "notStrictEqual" - | "ok" - | "partialDeepStrictEqual" - | "rejects" - | "strictEqual" - | "throws" - > - { + interface TestContextAssert extends Pick { /** * This function serializes `value` and writes it to the file specified by `path`. * diff --git a/desktop-operator/node_modules/@types/node/web-globals/events.d.ts b/desktop-operator/node_modules/@types/node/web-globals/events.d.ts index a61e1fa..fbc1d49 100644 --- a/desktop-operator/node_modules/@types/node/web-globals/events.d.ts +++ b/desktop-operator/node_modules/@types/node/web-globals/events.d.ts @@ -51,6 +51,7 @@ interface EventListenerObject { handleEvent(object: Event): void; } +type _EventListenerOptions = typeof globalThis extends { onmessage: any } ? {} : EventListenerOptions; interface EventListenerOptions { capture?: boolean; } @@ -85,6 +86,8 @@ declare global { new(type: string, eventInitDict?: EventInit): Event; }; + interface EventListenerOptions extends _EventListenerOptions {} + interface EventTarget extends _EventTarget {} var EventTarget: typeof globalThis extends { onmessage: any; EventTarget: infer T } ? T : { diff --git a/desktop-operator/node_modules/@types/node/worker_threads.d.ts b/desktop-operator/node_modules/@types/node/worker_threads.d.ts index 75f64ce..39cf893 100644 --- a/desktop-operator/node_modules/@types/node/worker_threads.d.ts +++ b/desktop-operator/node_modules/@types/node/worker_threads.d.ts @@ -56,7 +56,7 @@ */ declare module "worker_threads" { import { Context } from "node:vm"; - import { EventEmitter } from "node:events"; + import { EventEmitter, NodeEventTarget } from "node:events"; import { EventLoopUtilityFunction } from "node:perf_hooks"; import { FileHandle } from "node:fs/promises"; import { Readable, Writable } from "node:stream"; @@ -111,7 +111,7 @@ declare module "worker_threads" { * This implementation matches [browser `MessagePort`](https://developer.mozilla.org/en-US/docs/Web/API/MessagePort) s. * @since v10.5.0 */ - class MessagePort extends EventEmitter { + class MessagePort implements EventTarget { /** * Disables further sending of messages on either side of the connection. * This method can be called when no further communication will happen over this `MessagePort`. @@ -224,42 +224,32 @@ declare module "worker_threads" { * @since v10.5.0 */ start(): void; - addListener(event: "close", listener: () => void): this; + addListener(event: "close", listener: (ev: Event) => void): this; addListener(event: "message", listener: (value: any) => void): this; addListener(event: "messageerror", listener: (error: Error) => void): this; - addListener(event: string | symbol, listener: (...args: any[]) => void): this; - emit(event: "close"): boolean; + addListener(event: string, listener: (arg: any) => void): this; + emit(event: "close", ev: Event): boolean; emit(event: "message", value: any): boolean; emit(event: "messageerror", error: Error): boolean; - emit(event: string | symbol, ...args: any[]): boolean; - on(event: "close", listener: () => void): this; + emit(event: string, arg: any): boolean; + off(event: "close", listener: (ev: Event) => void, options?: EventListenerOptions): this; + off(event: "message", listener: (value: any) => void, options?: EventListenerOptions): this; + off(event: "messageerror", listener: (error: Error) => void, options?: EventListenerOptions): this; + off(event: string, listener: (arg: any) => void, options?: EventListenerOptions): this; + on(event: "close", listener: (ev: Event) => void): this; on(event: "message", listener: (value: any) => void): this; on(event: "messageerror", listener: (error: Error) => void): this; - on(event: string | symbol, listener: (...args: any[]) => void): this; - once(event: "close", listener: () => void): this; + on(event: string, listener: (arg: any) => void): this; + once(event: "close", listener: (ev: Event) => void): this; once(event: "message", listener: (value: any) => void): this; once(event: "messageerror", listener: (error: Error) => void): this; - once(event: string | symbol, listener: (...args: any[]) => void): this; - prependListener(event: "close", listener: () => void): this; - prependListener(event: "message", listener: (value: any) => void): this; - prependListener(event: "messageerror", listener: (error: Error) => void): this; - prependListener(event: string | symbol, listener: (...args: any[]) => void): this; - prependOnceListener(event: "close", listener: () => void): this; - prependOnceListener(event: "message", listener: (value: any) => void): this; - prependOnceListener(event: "messageerror", listener: (error: Error) => void): this; - prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this; - removeListener(event: "close", listener: () => void): this; - removeListener(event: "message", listener: (value: any) => void): this; - removeListener(event: "messageerror", listener: (error: Error) => void): this; - removeListener(event: string | symbol, listener: (...args: any[]) => void): this; - off(event: "close", listener: () => void): this; - off(event: "message", listener: (value: any) => void): this; - off(event: "messageerror", listener: (error: Error) => void): this; - off(event: string | symbol, listener: (...args: any[]) => void): this; - addEventListener: EventTarget["addEventListener"]; - dispatchEvent: EventTarget["dispatchEvent"]; - removeEventListener: EventTarget["removeEventListener"]; + once(event: string, listener: (arg: any) => void): this; + removeListener(event: "close", listener: (ev: Event) => void, options?: EventListenerOptions): this; + removeListener(event: "message", listener: (value: any) => void, options?: EventListenerOptions): this; + removeListener(event: "messageerror", listener: (error: Error) => void, options?: EventListenerOptions): this; + removeListener(event: string, listener: (arg: any) => void, options?: EventListenerOptions): this; } + interface MessagePort extends NodeEventTarget {} interface WorkerOptions { /** * List of arguments which would be stringified and appended to @@ -428,24 +418,6 @@ declare module "worker_threads" { * @since v10.5.0 */ postMessage(value: any, transferList?: readonly Transferable[]): void; - /** - * Sends a value to another worker, identified by its thread ID. - * @param threadId The target thread ID. If the thread ID is invalid, a `ERR_WORKER_MESSAGING_FAILED` error will be thrown. - * If the target thread ID is the current thread ID, a `ERR_WORKER_MESSAGING_SAME_THREAD` error will be thrown. - * @param value The value to send. - * @param transferList If one or more `MessagePort`-like objects are passed in value, a `transferList` is required for those items - * or `ERR_MISSING_MESSAGE_PORT_IN_TRANSFER_LIST` is thrown. See `port.postMessage()` for more information. - * @param timeout Time to wait for the message to be delivered in milliseconds. By default it's `undefined`, which means wait forever. - * If the operation times out, a `ERR_WORKER_MESSAGING_TIMEOUT` error is thrown. - * @since v22.5.0 - */ - postMessageToThread(threadId: number, value: any, timeout?: number): Promise; - postMessageToThread( - threadId: number, - value: any, - transferList: readonly Transferable[], - timeout?: number, - ): Promise; /** * Opposite of `unref()`, calling `ref()` on a previously `unref()`ed worker does _not_ let the program exit if it's the only active handle left (the default * behavior). If the worker is `ref()`ed, calling `ref()` again has diff --git a/desktop-operator/node_modules/electron/checksums.json b/desktop-operator/node_modules/electron/checksums.json index 8f090d5..ea3a928 100644 --- a/desktop-operator/node_modules/electron/checksums.json +++ b/desktop-operator/node_modules/electron/checksums.json @@ -1,77 +1,77 @@ { - "chromedriver-v38.2.0-darwin-arm64.zip": "97345d6f601c009ae810ee82dea77d90ff32040f95aefa7d1dbd95ab76ccebc7", - "chromedriver-v38.2.0-darwin-x64.zip": "d116d52170eecf0b982c0019f538aa7f01646c8b32b85512ec36096d18a3ed68", - "chromedriver-v38.2.0-linux-arm64.zip": "a1402389fe0b9687308020bc9b58909fa0987e5af3f5368557a88f18c9576a02", - "chromedriver-v38.2.0-linux-armv7l.zip": "7d038066c6c708517c08f06972dc688364a60b4537e1b83c3bf1db1baf290e45", - "chromedriver-v38.2.0-linux-x64.zip": "0ad0238eedb81f71ade28056288b13a3c6a5223654300c423eb266ac0163765c", - "chromedriver-v38.2.0-mas-arm64.zip": "df053233dc2f84e240bb62aee370eefd06632aa7b4e7a0cf747ff6f1e2654c83", - "chromedriver-v38.2.0-mas-x64.zip": "f576fa428820d0f1f086fbe8f9c81efb3828fbbf37b23042f2f100e2ceb09a49", - "chromedriver-v38.2.0-win32-arm64.zip": "d25061c60a757c506b5ca5b909f376f3b75e78035754e6cfb5765455010c4379", - "chromedriver-v38.2.0-win32-ia32.zip": "39b1d363415ae196c8c6ad8699831349a8af88f71dfae2e055d86fd3b005270d", - "chromedriver-v38.2.0-win32-x64.zip": "3d9e1bda42ced7d839389247f324ace56dab8d568ef579fefe9b1c97b3e32ba2", - "electron-api.json": "076c18e4c5a4760d01ea1b44b1bd978524370d696ce3f2f226ead63d41e4f707", - "electron-v38.2.0-darwin-arm64-dsym-snapshot.zip": "6ad66396e62ee5650fab7cd69efcf02904a7ed02127f17956c8bb901658458c7", - "electron-v38.2.0-darwin-arm64-dsym.zip": "f87a8e54516b390f8d0fac79c6ecd014826a751a8b257f02ad22235033bf75bc", - "electron-v38.2.0-darwin-arm64-symbols.zip": "dce9b62139bf577a98af028a41abe05afc3590c877bab0153eb301cd66673a5c", - "electron-v38.2.0-darwin-arm64.zip": "cff178e2cb9ae0d957d43009ef46d249d5594bc107d7704130bc0ce2e234bbd1", - "electron-v38.2.0-darwin-x64-dsym-snapshot.zip": "7749e09b87dba4a555c199e9e17f39c79ca66ba55403dcd2193d58ed7e9d92fe", - "electron-v38.2.0-darwin-x64-dsym.zip": "4f089113390d471067d8de2e52b865fcfda85f9068322e5674914cc8f45305cf", - "electron-v38.2.0-darwin-x64-symbols.zip": "b6212cebfc0ad6401d98bad0644d9ceb0b9a5827d7a5478f709bae85169e35b8", - "electron-v38.2.0-darwin-x64.zip": "232a83cb11b37f67dc0683402463ef30ac0309afb8e96f3bc1ea53e72fafa789", - "electron-v38.2.0-linux-arm64-debug.zip": "b60a4ee1093bdd289c67764bd03cd96c328fae31717a9e6b6dc74afb1b6dd0de", - "electron-v38.2.0-linux-arm64-symbols.zip": "dcf2f6940778448782848b391fd0b7dde955bd9a80d1f3fef166b92c87785161", - "electron-v38.2.0-linux-arm64.zip": "76116429b368c883f93eb98cbdb053f98d811c35943133fe3cf9b408018ebe2f", - "electron-v38.2.0-linux-armv7l-debug.zip": "df1e16509c44c7e2e93ac59e364f47391acdcad5d5da769668678b861191716c", - "electron-v38.2.0-linux-armv7l-symbols.zip": "ec6cac3347c256565a64909b96a9756f078cecada64c8c265421ea9e678f72b8", - "electron-v38.2.0-linux-armv7l.zip": "a4345bb87504b6b2bef29c0dc53b99770b203a7052fd2c5d38fd3e16177d3e68", - "electron-v38.2.0-linux-x64-debug.zip": "845c3d04899b3198c7f7c6cde91994c5216fccbd88864130877aac37d286ecd4", - "electron-v38.2.0-linux-x64-symbols.zip": "d7730b9c0b29e779d8c8f5fc9b2796ccb9dace6eab96464bc9b6c25b0f470b0b", - "electron-v38.2.0-linux-x64.zip": "f0028975282a6f2946797175ac406a95096f29c5dcda98048148668dfa36eff8", - "electron-v38.2.0-mas-arm64-dsym-snapshot.zip": "e44122e13946f35993ea2e0a4ce5ac4ca5d06aaf21d9d413284f851cfe7b4fbd", - "electron-v38.2.0-mas-arm64-dsym.zip": "449248269ba9640cf903df0491ef4560834b75393e70da98008efe659c611458", - "electron-v38.2.0-mas-arm64-symbols.zip": "f9ce155f70b020ff0c8f17e452c65bc136ccc0abb9718e8223c9d3cab4e8e952", - "electron-v38.2.0-mas-arm64.zip": "9d20149b1ab5f8075d9a13d6afac42af0070ce508804a4bd391cdb73beb4f6ce", - "electron-v38.2.0-mas-x64-dsym-snapshot.zip": "64f8e69d3f60ba74e9c63c44809e9f9cbc12ac5fc5ce5264273fbc20d100e6a8", - "electron-v38.2.0-mas-x64-dsym.zip": "99078e8754894bc08086ec94a127fd3451001247cca4c42285a4850a77766a01", - "electron-v38.2.0-mas-x64-symbols.zip": "c3f499e8b0b6e97d49bbe0915c5ffb7bc3744f9af48fcccf7ead0c17e56d5f1f", - "electron-v38.2.0-mas-x64.zip": "ea1decf697475333dc6dcf6649f809764224108575b63d23964aee3389bafedd", - "electron-v38.2.0-win32-arm64-pdb.zip": "0139650ab1ad003fe6b6b10a0bab1b5a2a594e30dd2bc3f45d7a0fdbe00ed312", - "electron-v38.2.0-win32-arm64-symbols.zip": "9701d4605fcb3440f296d9b0ae8eba40f6dc80c831cac14449bf7ae5a87db43f", - "electron-v38.2.0-win32-arm64-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5", - "electron-v38.2.0-win32-arm64.zip": "801e520e3ec8a0af1bdab5110846def06af3f427267351eb3c4359a00cd1294e", - "electron-v38.2.0-win32-ia32-pdb.zip": "d413d24833fc3f4ea9da0c4577c28c1ccd5e684288f54b2da17d7e999ed22561", - "electron-v38.2.0-win32-ia32-symbols.zip": "2f1441dbd2ab6ea8b5998f343d27c9a3485ec6395f4643dd2a09a71281378f8e", - "electron-v38.2.0-win32-ia32-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5", - "electron-v38.2.0-win32-ia32.zip": "b3bd0de05613ab5312013133de1587c35fdfa22e11e1f76fcaf6ea0248128f0c", - "electron-v38.2.0-win32-x64-pdb.zip": "7727b6b192b7a621ccb1b260b7204f59ecb9043361356f9b33204f1b760186c2", - "electron-v38.2.0-win32-x64-symbols.zip": "e76f3db9e670dce9979a513ce16ca1275d8f048c73f8eeae8555085180b996e1", - "electron-v38.2.0-win32-x64-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5", - "electron-v38.2.0-win32-x64.zip": "4382b317dbbbc0bbf8a301304749324b88207218aac240b670f1c1247c2a02b0", - "electron.d.ts": "e76a7d03aeb0b0f702c76dc9aeba8e8f0b12b22e5107b2135c1174228ac76947", - "ffmpeg-v38.2.0-darwin-arm64.zip": "04d284c52ec7718c1d325f27ccf14fb7abf638db5e371d04b08eed307d1915e4", - "ffmpeg-v38.2.0-darwin-x64.zip": "1680b9b2eec4868e7ef745997a29716f947551e79ca66dbe013508a943d5f107", - "ffmpeg-v38.2.0-linux-arm64.zip": "c93699ce1c7944f94bbcc761b93367768b6c9e45c9fb48eec3cc5198cb7fc6e4", - "ffmpeg-v38.2.0-linux-armv7l.zip": "41cb057e1b25203202d0b067bce4a9f554f47f85e674c888d890ef2b1c473991", - "ffmpeg-v38.2.0-linux-x64.zip": "bb741cab02f42f0046ab0d38d2f52d5627a980d2e533609c83d451da5ef1d972", - "ffmpeg-v38.2.0-mas-arm64.zip": "04d284c52ec7718c1d325f27ccf14fb7abf638db5e371d04b08eed307d1915e4", - "ffmpeg-v38.2.0-mas-x64.zip": "1680b9b2eec4868e7ef745997a29716f947551e79ca66dbe013508a943d5f107", - "ffmpeg-v38.2.0-win32-arm64.zip": "84a57167a9226e19304bde6728e6b88349c3bc6644bab056b98fb3449d5d928f", - "ffmpeg-v38.2.0-win32-ia32.zip": "da003cce1929a74c6b90591a3a89ef7ef9b53ba8b3aa7752191353b807374410", - "ffmpeg-v38.2.0-win32-x64.zip": "c736ac3c4281b60b8a02587c413ef1f1b83051ce18bfaaa483ac6afb01516285", - "hunspell_dictionaries.zip": "67ed5ea6b3c90b81abaa6e7ea1c736f703abd93716782fee545c2a0ee541cd4a", - "libcxx-objects-v38.2.0-linux-arm64.zip": "f2bdb8741e5e129ea23fde19744e349723b3c975d3b4ad1d95db77f1004e7448", - "libcxx-objects-v38.2.0-linux-armv7l.zip": "ea9f3d3955dc494a948abfd02a2a67fd0500bbd3cf72d6da13a7271a6b579a56", - "libcxx-objects-v38.2.0-linux-x64.zip": "77fb7ef16b09c49c15f2d568f332dd76942c1c5603127975f9fc66929bae2dad", - "libcxx_headers.zip": "9e2f483547b92864f6deb7b575b71d4ece0e4ed1ec3d510c6b9c64cd9f3bb772", - "libcxxabi_headers.zip": "006ccb83761a3bf5791d165bc9795e4de3308c65df646b4cbcaa61025fe7a6c5", - "mksnapshot-v38.2.0-darwin-arm64.zip": "274a273cdbab09b7851a9a5515ee9c385fe0e0a841e25156541a9d464161e62a", - "mksnapshot-v38.2.0-darwin-x64.zip": "576dc1d77dba2137d9700586542cdb9a993fadb622e4e119e6de06a5562c9d2a", - "mksnapshot-v38.2.0-linux-arm64-x64.zip": "fb84bc0d58fcab474a04afd8e429675b68d30ce1005defc3082abf7110e946bb", - "mksnapshot-v38.2.0-linux-armv7l-x64.zip": "9b0001ced0218770f18fab34928ad2df3c4d4e155bdc94949975f3b33a72916e", - "mksnapshot-v38.2.0-linux-x64.zip": "3bba4a42ac6828553e931e6f44284877a06ec11f9d389684d1101b6023254ce5", - "mksnapshot-v38.2.0-mas-arm64.zip": "a3995fb30ebaf916608ddcef8fbe393856395465178a21ec69198ca26ca67764", - "mksnapshot-v38.2.0-mas-x64.zip": "d7f662ddc0e2b8346177eb9b87575f34e4bb6fba4a7b4894af6273ad4d5a9c6e", - "mksnapshot-v38.2.0-win32-arm64-x64.zip": "7e92793dbb6b0e5e8bfa8b6e558f7a8841686faf5072e1a263855556760282ad", - "mksnapshot-v38.2.0-win32-ia32.zip": "573c49311b5fbf44b00082092341739c893dbbd050400e4329d16e541f435aab", - "mksnapshot-v38.2.0-win32-x64.zip": "55e03c4fd2caa3f4b1a52d0038fb129835a93328afa100b3c8bd7caa4c5dbebd" + "chromedriver-v38.2.1-darwin-arm64.zip": "29e5cbaf4fce59fdc09c6fac4cbef9e40bb967cfcc191f757253c50051d64591", + "chromedriver-v38.2.1-darwin-x64.zip": "0f941ed1f47a9ace7242b59ec94ea67c8ca1e38a8f5b9f7953fe397854874871", + "chromedriver-v38.2.1-linux-arm64.zip": "b98fb4b96ccb84f5f59406570f3f9775e075ebf2995757ac8a02ff9d751a72dc", + "chromedriver-v38.2.1-linux-armv7l.zip": "ddc4ccc54c0be867e416acf760da26491a95463da15688a9ecb71e9294f682ed", + "chromedriver-v38.2.1-linux-x64.zip": "1b235b1ee31a824b16494fc0740485b00db446a4bfb25b4dcf4e72fc48f2c10b", + "chromedriver-v38.2.1-mas-arm64.zip": "5dbf61e83b62cfac2ee7d09649f94ff862cf8490c97b8da848f7f8d1799eca00", + "chromedriver-v38.2.1-mas-x64.zip": "92ea7656078d0baf2ff8c10b7cbaeb1683a5bfe5475aee18a66ea1f07b832f7c", + "chromedriver-v38.2.1-win32-arm64.zip": "8f1b9d91defe9ff9e4a5ef0a5aa4812bd63c8a48639c99a0e112f755b2bb33c1", + "chromedriver-v38.2.1-win32-ia32.zip": "2defbe13bba2977d41c2ee92ebf86dd87841b665ea58644afc984bfef15c2e1e", + "chromedriver-v38.2.1-win32-x64.zip": "9bfec31346954fb5c3f44ab2031df117838603bd36444e52620a257e188ac024", + "electron-api.json": "6575b7ad9db9b79b014384d3f8d6c1bfe59a1f37cc22409fe6cec45f7c447974", + "electron-v38.2.1-darwin-arm64-dsym-snapshot.zip": "2fd04efe16f5af71da2369a895610f723c47e7083599187d7cfe8205784604c1", + "electron-v38.2.1-darwin-arm64-dsym.zip": "cf152b6a3a335589185444e92fc748c9228e27408ae14e9687b13f817f3490da", + "electron-v38.2.1-darwin-arm64-symbols.zip": "044f5ac4f5e31805b85fcb8b940467a17571a6d2922fd6d4a29986251c7e8e98", + "electron-v38.2.1-darwin-arm64.zip": "8f8eb31c69bbf0fb45bc596e271571ade426cf076a3e07a858390c45c399e213", + "electron-v38.2.1-darwin-x64-dsym-snapshot.zip": "59327f344d3021ae072b5c1f1080f321ceb823f8f02bec092b55f6f10e4762a7", + "electron-v38.2.1-darwin-x64-dsym.zip": "e94a9e006ca8e60d1608a9d2e8eb5cd7ab78da2737ec6871adace34d60957c48", + "electron-v38.2.1-darwin-x64-symbols.zip": "9651b24a6fe375c081f2f44c266a1f93fde6dbf93bfdcfcdcbf147ae48902661", + "electron-v38.2.1-darwin-x64.zip": "3b636e2826a90f6e8b9ebf1c6dc5a6fb7c7fad876aa91520eed520b40bcab3c8", + "electron-v38.2.1-linux-arm64-debug.zip": "57b8315a082483ea4a8ec49dde4a4b841ac5f5a8eb86d64e428e5bab6fff816a", + "electron-v38.2.1-linux-arm64-symbols.zip": "62ea8e51ff4c4098a3ec5bb42efdb9d2149301409b9ef67d283009c76dfc6913", + "electron-v38.2.1-linux-arm64.zip": "99ed0b3e4edbdf4f8c51e8dabb92dccc7b0b5d728aa5c014d5e5adaf17a6993c", + "electron-v38.2.1-linux-armv7l-debug.zip": "43528f34953b1b4b3605d68430d5535e77fde583bc9b7d8452d2e34f292306b0", + "electron-v38.2.1-linux-armv7l-symbols.zip": "c7d31193109ddcdb7bf5eea5b8cf1b34286aa12c480d9b35f36df70d8b8fa9e8", + "electron-v38.2.1-linux-armv7l.zip": "634371ed0224e4ccc96b09f8887530068f478d438df6ecfd7fdbdde7fde588e3", + "electron-v38.2.1-linux-x64-debug.zip": "3b90f171dd23f2187f424e2ba32780fe08134600760614552f2c9685036a9a5b", + "electron-v38.2.1-linux-x64-symbols.zip": "70c479a8d7cb8952aa4db2b6cde7dbbc25430d93faa4900e8c8e953af00ee501", + "electron-v38.2.1-linux-x64.zip": "471b91628357ffd40f4f9d61f2421b6e9fb7aa1769d6c9728d24f8376acf775a", + "electron-v38.2.1-mas-arm64-dsym-snapshot.zip": "146c418b0424e4fac20e16a83ecf64625e09e7aef3e49bb7babf721a6746b53d", + "electron-v38.2.1-mas-arm64-dsym.zip": "f080e0eedef215fdae2939c7ff1323911aac0b89db0bbfde8eda44028db6a2a9", + "electron-v38.2.1-mas-arm64-symbols.zip": "9433e3400581e684efdcd1e958b35de07506dea4d9eb10f5fa4d4ade4b4c1d66", + "electron-v38.2.1-mas-arm64.zip": "fbd21868231849a7904a046168b88afc892e081d5cf36216b44c366334da59d6", + "electron-v38.2.1-mas-x64-dsym-snapshot.zip": "310ac182253c215d206a4b5a64a25c919f929d6d424ad540e266dcc27c317361", + "electron-v38.2.1-mas-x64-dsym.zip": "4ca5cffb3851916107634ea20a1d847453d25aa654455b9e4e73b80042c9ab98", + "electron-v38.2.1-mas-x64-symbols.zip": "d7301076c860ccc5c4581c99b36a482b924d394b1b2649db534c0d2f03128799", + "electron-v38.2.1-mas-x64.zip": "6a2872c54c57488ec6fc6bb7503c990749e79dd36cd93df3816fd554fd555904", + "electron-v38.2.1-win32-arm64-pdb.zip": "d86eb73f8ee643dc9f78e7ae7b9386ab1dfd95728dc7c55087f8499001302904", + "electron-v38.2.1-win32-arm64-symbols.zip": "15080c33e7efff13c260d077f1e514e2e9e9c9e48be833db89f68f2c4bccc305", + "electron-v38.2.1-win32-arm64-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5", + "electron-v38.2.1-win32-arm64.zip": "ff21bafbb2f64037a1bdf31101ae5395b3aa49e02dc7a52b8cacf0d8c5ac4fb3", + "electron-v38.2.1-win32-ia32-pdb.zip": "17932a5766b748f504b4e35e6e460c8c264ff57435c0cfe4cf7ef6e784fb5df0", + "electron-v38.2.1-win32-ia32-symbols.zip": "acdbc221c64b41ba7a7fc3c2c7d102127cd02082042c21adf07130674e1291e7", + "electron-v38.2.1-win32-ia32-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5", + "electron-v38.2.1-win32-ia32.zip": "86e2b1e76801b4ce0388467189593bcc58a75ad2ed436810c0e604f9ecfb2df6", + "electron-v38.2.1-win32-x64-pdb.zip": "c8d0ee47bdb9f805c35fd6adfc06c85773e808527a81dd2bafccb53185d1a370", + "electron-v38.2.1-win32-x64-symbols.zip": "d3063d90a188b1665b189e9d0974b3ca5604dd48aca1d322226cde9cd24b1cf9", + "electron-v38.2.1-win32-x64-toolchain-profile.zip": "74e88ea46bb62f4d8698b1058963568b8ccd9debbdd5d755dfdf4303874446d5", + "electron-v38.2.1-win32-x64.zip": "e3831387518acc8430fa674e585d24833aabb994dae43bcca0257302c0816967", + "electron.d.ts": "e8db7913668fb6e676b4ba887711cc74da190eff89f4f885fc5295624fd5d750", + "ffmpeg-v38.2.1-darwin-arm64.zip": "04d284c52ec7718c1d325f27ccf14fb7abf638db5e371d04b08eed307d1915e4", + "ffmpeg-v38.2.1-darwin-x64.zip": "1680b9b2eec4868e7ef745997a29716f947551e79ca66dbe013508a943d5f107", + "ffmpeg-v38.2.1-linux-arm64.zip": "c93699ce1c7944f94bbcc761b93367768b6c9e45c9fb48eec3cc5198cb7fc6e4", + "ffmpeg-v38.2.1-linux-armv7l.zip": "41cb057e1b25203202d0b067bce4a9f554f47f85e674c888d890ef2b1c473991", + "ffmpeg-v38.2.1-linux-x64.zip": "bb741cab02f42f0046ab0d38d2f52d5627a980d2e533609c83d451da5ef1d972", + "ffmpeg-v38.2.1-mas-arm64.zip": "04d284c52ec7718c1d325f27ccf14fb7abf638db5e371d04b08eed307d1915e4", + "ffmpeg-v38.2.1-mas-x64.zip": "1680b9b2eec4868e7ef745997a29716f947551e79ca66dbe013508a943d5f107", + "ffmpeg-v38.2.1-win32-arm64.zip": "84a57167a9226e19304bde6728e6b88349c3bc6644bab056b98fb3449d5d928f", + "ffmpeg-v38.2.1-win32-ia32.zip": "da003cce1929a74c6b90591a3a89ef7ef9b53ba8b3aa7752191353b807374410", + "ffmpeg-v38.2.1-win32-x64.zip": "c736ac3c4281b60b8a02587c413ef1f1b83051ce18bfaaa483ac6afb01516285", + "hunspell_dictionaries.zip": "e159462fd2c8c6d245878df9b6a60e5d737fe737c19c39bd0ed15bcdffcb8849", + "libcxx-objects-v38.2.1-linux-arm64.zip": "73e23f2a0d7197a8002ccfa47df5cf12fae9d8de09f7ae8986f161735d5ac97d", + "libcxx-objects-v38.2.1-linux-armv7l.zip": "1d913d9381570551ca379abce68ab8dea10021e27f9ef94cedee8655b0bd9275", + "libcxx-objects-v38.2.1-linux-x64.zip": "dac28dbf41082ae06524dd2d4e5e1431eb13fdf18106494ca0917663d2450d6e", + "libcxx_headers.zip": "fa7b84db331f95f703c83f1e91788bcafb50db4aec882ef0f59227f232ab11b2", + "libcxxabi_headers.zip": "db3018609bce502c307c59074b3d5273080a68fb50ac1e7fc580994a2e80cc25", + "mksnapshot-v38.2.1-darwin-arm64.zip": "0ca89892f1f83a10306fba4cd97bcb8f1f8b7ac8eaff15a3bb69a002a6adc89d", + "mksnapshot-v38.2.1-darwin-x64.zip": "7a40dddf3e4ff9cf0bfdad26ebfaacb3cfa5460207a3fb4d3bbd7d44aaa4b48e", + "mksnapshot-v38.2.1-linux-arm64-x64.zip": "254930fca75d71da47a36cbbb419129ce3b888746fb949811e5d34b45cfdde9c", + "mksnapshot-v38.2.1-linux-armv7l-x64.zip": "a0ca4d1c49841ff4704722d35539225be9cf909284e29f527833c88dea9fdfdb", + "mksnapshot-v38.2.1-linux-x64.zip": "11d10476db26eec1298a717fdba37d4e338440746f95c63cd03c39b5eb25e0fb", + "mksnapshot-v38.2.1-mas-arm64.zip": "c422a6d4ec42b4cdb67a31e8d2fdae5ecca854a6ed50e028368f147f47bfc28a", + "mksnapshot-v38.2.1-mas-x64.zip": "a2f49735e326e6c1f3f9014f7d4c298a3e220fcae7a3a0abe715947e710486bc", + "mksnapshot-v38.2.1-win32-arm64-x64.zip": "234a78c158c11c5972990c97552e16d19c00a86409209a199d516011d24dfa68", + "mksnapshot-v38.2.1-win32-ia32.zip": "061fc432799cd129002b9e0aae1a9d71bf996fd35b6e886f88c9ccac9b8c4acc", + "mksnapshot-v38.2.1-win32-x64.zip": "ee13d6045f25b56e3b28d91cc3c72e37a73e549ba560eb4b9111caacd9b1a588" } \ No newline at end of file diff --git a/desktop-operator/node_modules/electron/dist/electron b/desktop-operator/node_modules/electron/dist/electron index 51446ea..252941d 100755 Binary files a/desktop-operator/node_modules/electron/dist/electron and b/desktop-operator/node_modules/electron/dist/electron differ diff --git a/desktop-operator/node_modules/electron/dist/version b/desktop-operator/node_modules/electron/dist/version index 4e63745..19bada5 100644 --- a/desktop-operator/node_modules/electron/dist/version +++ b/desktop-operator/node_modules/electron/dist/version @@ -1 +1 @@ -38.2.0 \ No newline at end of file +38.2.1 \ No newline at end of file diff --git a/desktop-operator/node_modules/electron/electron.d.ts b/desktop-operator/node_modules/electron/electron.d.ts index 8dd4c49..3b3b0a5 100644 --- a/desktop-operator/node_modules/electron/electron.d.ts +++ b/desktop-operator/node_modules/electron/electron.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Electron 38.2.0 +// Type definitions for Electron 38.2.1 // Project: http://electronjs.org/ // Definitions by: The Electron Team // Definitions: https://github.com/electron/typescript-definitions diff --git a/desktop-operator/node_modules/electron/package.json b/desktop-operator/node_modules/electron/package.json index eb82752..419b118 100644 --- a/desktop-operator/node_modules/electron/package.json +++ b/desktop-operator/node_modules/electron/package.json @@ -23,5 +23,5 @@ "keywords": [ "electron" ], - "version": "38.2.0" + "version": "38.2.1" } \ No newline at end of file diff --git a/desktop-operator/node_modules/typescript/lib/_tsc.js b/desktop-operator/node_modules/typescript/lib/_tsc.js index 11ab5ff..612a1f7 100644 --- a/desktop-operator/node_modules/typescript/lib/_tsc.js +++ b/desktop-operator/node_modules/typescript/lib/_tsc.js @@ -18,7 +18,7 @@ and limitations under the License. // src/compiler/corePublic.ts var versionMajorMinor = "5.9"; -var version = "5.9.2"; +var version = "5.9.3"; // src/compiler/core.ts var emptyArray = []; @@ -20254,10 +20254,22 @@ function createParenthesizerRules(factory2) { } return parenthesizerRule; } + function mixingBinaryOperatorsRequiresParentheses(a, b) { + if (a === 61 /* QuestionQuestionToken */) { + return b === 56 /* AmpersandAmpersandToken */ || b === 57 /* BarBarToken */; + } + if (b === 61 /* QuestionQuestionToken */) { + return a === 56 /* AmpersandAmpersandToken */ || a === 57 /* BarBarToken */; + } + return false; + } function binaryOperandNeedsParentheses(binaryOperator, operand, isLeftSideOfBinary, leftOperand) { + const emittedOperand = skipPartiallyEmittedExpressions(operand); + if (isBinaryExpression(emittedOperand) && mixingBinaryOperatorsRequiresParentheses(binaryOperator, emittedOperand.operatorToken.kind)) { + return true; + } const binaryOperatorPrecedence = getOperatorPrecedence(227 /* BinaryExpression */, binaryOperator); const binaryOperatorAssociativity = getOperatorAssociativity(227 /* BinaryExpression */, binaryOperator); - const emittedOperand = skipPartiallyEmittedExpressions(operand); if (!isLeftSideOfBinary && operand.kind === 220 /* ArrowFunction */ && binaryOperatorPrecedence > 3 /* Assignment */) { return true; } @@ -53296,7 +53308,22 @@ function createTypeChecker(host) { function getPropertyNameNodeForSymbol(symbol, context) { const hashPrivateName = getClonedHashPrivateName(symbol); if (hashPrivateName) { - return hashPrivateName; + const shouldEmitErroneousFieldName = !!context.tracker.reportPrivateInBaseOfClassExpression && context.flags & 2048 /* WriteClassExpressionAsTypeLiteral */; + if (!shouldEmitErroneousFieldName) { + return hashPrivateName; + } else { + let rawName2 = unescapeLeadingUnderscores(symbol.escapedName); + rawName2 = rawName2.replace(/__#\d+@#/g, "__#private@#"); + return createPropertyNameNodeForIdentifierOrLiteral( + rawName2, + getEmitScriptTarget(compilerOptions), + /*singleQuote*/ + false, + /*stringNamed*/ + true, + !!(symbol.flags & 8192 /* Method */) + ); + } } const stringNamed = !!length(symbol.declarations) && every(symbol.declarations, isStringNamed); const singleQuote = !!length(symbol.declarations) && every(symbol.declarations, isSingleQuotedStringNamed); @@ -124188,10 +124215,9 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi } const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames())); commandLine.fileNames.forEach((fileName) => { - if (isDeclarationFileName(fileName)) return; const path = toPath3(fileName); let outputDts; - if (!fileExtensionIs(fileName, ".json" /* Json */)) { + if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) { if (!commandLine.options.outFile) { outputDts = getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3); mapOutputFileToResolvedRef.set(toPath3(outputDts), { resolvedRef, source: fileName }); diff --git a/desktop-operator/node_modules/typescript/lib/lib.esnext.float16.d.ts b/desktop-operator/node_modules/typescript/lib/lib.esnext.float16.d.ts index 7062792..33bb551 100644 --- a/desktop-operator/node_modules/typescript/lib/lib.esnext.float16.d.ts +++ b/desktop-operator/node_modules/typescript/lib/lib.esnext.float16.d.ts @@ -374,6 +374,8 @@ interface Float16ArrayConstructor { new (length?: number): Float16Array; new (array: ArrayLike | Iterable): Float16Array; new (buffer: TArrayBuffer, byteOffset?: number, length?: number): Float16Array; + new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Float16Array; + new (array: ArrayLike | ArrayBuffer): Float16Array; /** * The size in bytes of each element in the array. diff --git a/desktop-operator/node_modules/typescript/lib/typescript.d.ts b/desktop-operator/node_modules/typescript/lib/typescript.d.ts index 8794252..2c56042 100644 --- a/desktop-operator/node_modules/typescript/lib/typescript.d.ts +++ b/desktop-operator/node_modules/typescript/lib/typescript.d.ts @@ -5907,7 +5907,6 @@ declare namespace ts { */ interface SourceFileLike { readonly text: string; - languageVariant?: LanguageVariant; } interface SourceFileLike { getLineAndCharacterOfPosition(pos: number): LineAndCharacter; diff --git a/desktop-operator/node_modules/typescript/lib/typescript.js b/desktop-operator/node_modules/typescript/lib/typescript.js index 2643aa1..0554fc3 100644 --- a/desktop-operator/node_modules/typescript/lib/typescript.js +++ b/desktop-operator/node_modules/typescript/lib/typescript.js @@ -2285,7 +2285,7 @@ module.exports = __toCommonJS(typescript_exports); // src/compiler/corePublic.ts var versionMajorMinor = "5.9"; -var version = "5.9.2"; +var version = "5.9.3"; var Comparison = /* @__PURE__ */ ((Comparison3) => { Comparison3[Comparison3["LessThan"] = -1] = "LessThan"; Comparison3[Comparison3["EqualTo"] = 0] = "EqualTo"; @@ -6790,10 +6790,10 @@ var ScriptTarget = /* @__PURE__ */ ((ScriptTarget12) => { ScriptTarget12[ScriptTarget12["Latest"] = 99 /* ESNext */] = "Latest"; return ScriptTarget12; })(ScriptTarget || {}); -var LanguageVariant = /* @__PURE__ */ ((LanguageVariant3) => { - LanguageVariant3[LanguageVariant3["Standard"] = 0] = "Standard"; - LanguageVariant3[LanguageVariant3["JSX"] = 1] = "JSX"; - return LanguageVariant3; +var LanguageVariant = /* @__PURE__ */ ((LanguageVariant4) => { + LanguageVariant4[LanguageVariant4["Standard"] = 0] = "Standard"; + LanguageVariant4[LanguageVariant4["JSX"] = 1] = "JSX"; + return LanguageVariant4; })(LanguageVariant || {}); var WatchDirectoryFlags = /* @__PURE__ */ ((WatchDirectoryFlags3) => { WatchDirectoryFlags3[WatchDirectoryFlags3["None"] = 0] = "None"; @@ -24351,10 +24351,22 @@ function createParenthesizerRules(factory2) { } return parenthesizerRule; } + function mixingBinaryOperatorsRequiresParentheses(a, b) { + if (a === 61 /* QuestionQuestionToken */) { + return b === 56 /* AmpersandAmpersandToken */ || b === 57 /* BarBarToken */; + } + if (b === 61 /* QuestionQuestionToken */) { + return a === 56 /* AmpersandAmpersandToken */ || a === 57 /* BarBarToken */; + } + return false; + } function binaryOperandNeedsParentheses(binaryOperator, operand, isLeftSideOfBinary, leftOperand) { + const emittedOperand = skipPartiallyEmittedExpressions(operand); + if (isBinaryExpression(emittedOperand) && mixingBinaryOperatorsRequiresParentheses(binaryOperator, emittedOperand.operatorToken.kind)) { + return true; + } const binaryOperatorPrecedence = getOperatorPrecedence(227 /* BinaryExpression */, binaryOperator); const binaryOperatorAssociativity = getOperatorAssociativity(227 /* BinaryExpression */, binaryOperator); - const emittedOperand = skipPartiallyEmittedExpressions(operand); if (!isLeftSideOfBinary && operand.kind === 220 /* ArrowFunction */ && binaryOperatorPrecedence > 3 /* Assignment */) { return true; } @@ -57907,7 +57919,22 @@ function createTypeChecker(host) { function getPropertyNameNodeForSymbol(symbol, context) { const hashPrivateName = getClonedHashPrivateName(symbol); if (hashPrivateName) { - return hashPrivateName; + const shouldEmitErroneousFieldName = !!context.tracker.reportPrivateInBaseOfClassExpression && context.flags & 2048 /* WriteClassExpressionAsTypeLiteral */; + if (!shouldEmitErroneousFieldName) { + return hashPrivateName; + } else { + let rawName2 = unescapeLeadingUnderscores(symbol.escapedName); + rawName2 = rawName2.replace(/__#\d+@#/g, "__#private@#"); + return createPropertyNameNodeForIdentifierOrLiteral( + rawName2, + getEmitScriptTarget(compilerOptions), + /*singleQuote*/ + false, + /*stringNamed*/ + true, + !!(symbol.flags & 8192 /* Method */) + ); + } } const stringNamed = !!length(symbol.declarations) && every(symbol.declarations, isStringNamed); const singleQuote = !!length(symbol.declarations) && every(symbol.declarations, isSingleQuotedStringNamed); @@ -129038,10 +129065,9 @@ function createProgram(_rootNamesOrOptions, _options, _host, _oldProgram, _confi } const getCommonSourceDirectory3 = memoize(() => getCommonSourceDirectoryOfConfig(resolvedRef.commandLine, !host.useCaseSensitiveFileNames())); commandLine.fileNames.forEach((fileName) => { - if (isDeclarationFileName(fileName)) return; const path = toPath3(fileName); let outputDts; - if (!fileExtensionIs(fileName, ".json" /* Json */)) { + if (!isDeclarationFileName(fileName) && !fileExtensionIs(fileName, ".json" /* Json */)) { if (!commandLine.options.outFile) { outputDts = getOutputDeclarationFileName(fileName, resolvedRef.commandLine, !host.useCaseSensitiveFileNames(), getCommonSourceDirectory3); mapOutputFileToResolvedRef.set(toPath3(outputDts), { resolvedRef, source: fileName }); @@ -140403,7 +140429,7 @@ function isInsideJsxElementOrAttribute(sourceFile, position) { if (token && token.kind === 20 /* CloseBraceToken */ && token.parent.kind === 295 /* JsxExpression */) { return true; } - if (token.kind === 31 /* LessThanSlashToken */ && token.parent.kind === 288 /* JsxClosingElement */) { + if (token.kind === 30 /* LessThanToken */ && token.parent.kind === 288 /* JsxClosingElement */) { return true; } return false; @@ -140431,7 +140457,7 @@ function isInJSXText(sourceFile, position) { function isInsideJsxElement(sourceFile, position) { function isInsideJsxElementTraversal(node) { while (node) { - if (node.kind >= 286 /* JsxSelfClosingElement */ && node.kind <= 295 /* JsxExpression */ || node.kind === 12 /* JsxText */ || node.kind === 30 /* LessThanToken */ || node.kind === 32 /* GreaterThanToken */ || node.kind === 80 /* Identifier */ || node.kind === 20 /* CloseBraceToken */ || node.kind === 19 /* OpenBraceToken */ || node.kind === 44 /* SlashToken */ || node.kind === 31 /* LessThanSlashToken */) { + if (node.kind >= 286 /* JsxSelfClosingElement */ && node.kind <= 295 /* JsxExpression */ || node.kind === 12 /* JsxText */ || node.kind === 30 /* LessThanToken */ || node.kind === 32 /* GreaterThanToken */ || node.kind === 80 /* Identifier */ || node.kind === 20 /* CloseBraceToken */ || node.kind === 19 /* OpenBraceToken */ || node.kind === 44 /* SlashToken */) { node = node.parent; } else if (node.kind === 285 /* JsxElement */) { if (position > node.getStart(sourceFile)) return true; @@ -151873,9 +151899,7 @@ function createChildren(node, sourceFile) { }); return children; } - const languageVariant = (sourceFile == null ? void 0 : sourceFile.languageVariant) ?? 0 /* Standard */; scanner.setText((sourceFile || node.getSourceFile()).text); - scanner.setLanguageVariant(languageVariant); let pos = node.pos; const processNode = (child) => { addSyntheticNodes(children, pos, child.pos, node); @@ -151892,7 +151916,6 @@ function createChildren(node, sourceFile) { node.forEachChild(processNode, processNodes); addSyntheticNodes(children, pos, node.end, node); scanner.setText(void 0); - scanner.setLanguageVariant(0 /* Standard */); return children; } function addSyntheticNodes(nodes, pos, end, parent2) { @@ -167606,7 +167629,7 @@ function getJsxClosingTagCompletion(location, sourceFile) { switch (node.kind) { case 288 /* JsxClosingElement */: return true; - case 31 /* LessThanSlashToken */: + case 44 /* SlashToken */: case 32 /* GreaterThanToken */: case 80 /* Identifier */: case 212 /* PropertyAccessExpression */: @@ -168942,7 +168965,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, location = currentToken; } break; - case 31 /* LessThanSlashToken */: + case 44 /* SlashToken */: if (currentToken.parent.kind === 286 /* JsxSelfClosingElement */) { location = currentToken; } @@ -168951,7 +168974,7 @@ function getCompletionData(program, log, sourceFile, compilerOptions, position, } switch (parent2.kind) { case 288 /* JsxClosingElement */: - if (contextToken.kind === 31 /* LessThanSlashToken */) { + if (contextToken.kind === 44 /* SlashToken */) { isStartingCloseTag = true; location = contextToken; } @@ -170572,7 +170595,7 @@ function isValidTrigger(sourceFile, triggerCharacter, contextToken, position) { case "<": return !!contextToken && contextToken.kind === 30 /* LessThanToken */ && (!isBinaryExpression(contextToken.parent) || binaryExpressionMayBeOpenTag(contextToken.parent)); case "/": - return !!contextToken && (isStringLiteralLike(contextToken) ? !!tryGetImportFromModuleSpecifier(contextToken) : contextToken.kind === 31 /* LessThanSlashToken */ && isJsxClosingElement(contextToken.parent)); + return !!contextToken && (isStringLiteralLike(contextToken) ? !!tryGetImportFromModuleSpecifier(contextToken) : contextToken.kind === 44 /* SlashToken */ && isJsxClosingElement(contextToken.parent)); case " ": return !!contextToken && isImportKeyword(contextToken) && contextToken.parent.kind === 308 /* SourceFile */; default: diff --git a/desktop-operator/node_modules/typescript/package.json b/desktop-operator/node_modules/typescript/package.json index 559d62f..cccb75d 100644 --- a/desktop-operator/node_modules/typescript/package.json +++ b/desktop-operator/node_modules/typescript/package.json @@ -2,7 +2,7 @@ "name": "typescript", "author": "Microsoft Corp.", "homepage": "https://www.typescriptlang.org/", - "version": "5.9.2", + "version": "5.9.3", "license": "Apache-2.0", "description": "TypeScript is a language for application scale JavaScript development", "keywords": [ @@ -116,5 +116,5 @@ "node": "20.1.0", "npm": "8.19.4" }, - "gitHead": "5be33469d551655d878876faa9e30aa3b49f8ee9" + "gitHead": "c63de15a992d37f0d6cec03ac7631872838602cb" } diff --git a/desktop-operator/package-lock.json b/desktop-operator/package-lock.json index cf8a123..f20a135 100644 --- a/desktop-operator/package-lock.json +++ b/desktop-operator/package-lock.json @@ -689,9 +689,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.18.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz", - "integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==", + "version": "22.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz", + "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", "dev": true, "dependencies": { "undici-types": "~6.21.0" @@ -2019,9 +2019,9 @@ } }, "node_modules/electron": { - "version": "38.2.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-38.2.0.tgz", - "integrity": "sha512-Cw5Mb+N5NxsG0Hc1qr8I65Kt5APRrbgTtEEn3zTod30UNJRnAE1xbGk/1NOaDn3ODzI/MYn6BzT9T9zreP7xWA==", + "version": "38.2.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-38.2.1.tgz", + "integrity": "sha512-P4pE2RpRg3kM8IeOK+heg6iAxR5wcXnNHrbVchn7M3GBnYAhjfJRkROusdOro5PlKzdtfKjesbbqaG4MqQXccg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -4621,9 +4621,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/desktop-operator/src/config.js b/desktop-operator/src/config.js index 38e986e..eadb3be 100644 --- a/desktop-operator/src/config.js +++ b/desktop-operator/src/config.js @@ -21,7 +21,7 @@ class ConfigManager { // Конфигурация по умолчанию return { server: { - url: 'http://localhost:3001', + url: 'http://localhost:3002', autoConnect: false, reconnectAttempts: 3, reconnectInterval: 5000 diff --git a/desktop-operator/src/renderer/app.js b/desktop-operator/src/renderer/app.js index 54737bd..6e16f6e 100644 --- a/desktop-operator/src/renderer/app.js +++ b/desktop-operator/src/renderer/app.js @@ -8,6 +8,10 @@ class GodEyeOperator { this.operatorId = uuidv4(); this.activeSessions = new Map(); // sessionId -> sessionData this.currentActiveSession = null; // Currently viewing session + this.pendingICECandidates = []; // Буфер для ICE кандидатов до получения offer + this.isRemoteDescriptionSet = false; // Флаг установки remote description + this.isVideoStreamProcessed = false; // Флаг обработки видеопотока + this.isProcessingOffer = false; // Флаг защиты от одновременной обработки offer this.localConnection = null; this.remoteStream = null; this.mediaRecorder = null; @@ -20,25 +24,85 @@ class GodEyeOperator { this.isZoomed = false; this.config = null; this.isConnected = false; + this.connectedDevices = new Map(); // deviceId -> device data для дедупликации + + // Video statistics tracking + this.statsInterval = null; + this.lastStatsTime = 0; + this.lastBytesReceived = 0; + this.statsHistory = []; + + // Session history tracking + this.sessionHistory = []; + this.sessionStats = { + total: 0, + successful: 0, + failed: 0, + totalDuration: 0 + }; // UI Elements this.elements = { - connectBtn: document.getElementById('connect-btn'), - disconnectBtn: document.getElementById('disconnect-btn'), - serverUrl: document.getElementById('server-url'), - autoConnect: document.getElementById('auto-connect'), - connectionIndicator: document.getElementById('connection-indicator'), + // Header controls + connectionToggle: document.getElementById('connection-toggle'), + settingsToggle: document.getElementById('settings-toggle'), + settingsMenu: document.getElementById('settings-menu'), connectionStatusText: document.getElementById('connection-status-text'), + connectionStatusIcon: document.getElementById('connection-status-icon'), + connectionButtonText: document.getElementById('connection-button-text'), pingIndicator: document.getElementById('ping-indicator'), sessionInfo: document.getElementById('session-info'), + + // Connection settings (moved to header dropdown) + serverUrl: document.getElementById('server-url'), + autoConnect: document.getElementById('auto-connect'), + connectionTimeout: document.getElementById('connection-timeout'), + reconnectAttempts: document.getElementById('reconnect-attempts'), + pingInterval: document.getElementById('ping-interval'), + compression: document.getElementById('compression'), + debugMode: document.getElementById('debug-mode'), + + // Video elements remoteVideo: document.getElementById('remoteVideo'), videoContainer: document.querySelector('.video-container'), videoOverlay: document.getElementById('video-overlay'), + + // Sidebar controls + sidebarToggle: document.getElementById('sidebar-toggle'), + sidebarContent: document.getElementById('sidebar-content'), + controlPanel: document.getElementById('control-panel'), + + // Collapsible panels + devicesToggle: document.getElementById('devices-toggle'), + devicesContent: document.getElementById('devices-content'), + sessionsToggle: document.getElementById('sessions-toggle'), + sessionsContent: document.getElementById('sessions-content'), + + // Device and session lists devicesList: document.getElementById('devices-list'), sessionsList: document.getElementById('sessions-list'), + refreshDevices: document.getElementById('refresh-devices'), + + // Logs logsContainer: document.getElementById('logs-container'), clearLogs: document.getElementById('clear-logs'), + // Session history + totalSessions: document.getElementById('total-sessions'), + successfulSessions: document.getElementById('successful-sessions'), + failedSessions: document.getElementById('failed-sessions'), + totalDuration: document.getElementById('total-duration'), + sessionHistory: document.getElementById('session-history'), + exportHistory: document.getElementById('export-history'), + clearHistory: document.getElementById('clear-history'), + + // Video statistics + bytesReceived: document.getElementById('bytes-received'), + bitrate: document.getElementById('bitrate'), + fps: document.getElementById('fps'), + packetsLost: document.getElementById('packets-lost'), + videoResolution: document.getElementById('video-resolution'), + // Camera controls cameraButtons: document.querySelectorAll('.camera-btn'), @@ -61,15 +125,599 @@ class GodEyeOperator { stopRecording: document.getElementById('stop-recording'), playRecording: document.getElementById('play-recording'), recordingStatus: document.getElementById('recording-status'), - recordingDuration: document.getElementById('recording-duration') + recordingDuration: document.getElementById('recording-duration'), + + // Advanced settings + toggleAdvanced: document.getElementById('toggle-advanced'), + advancedSettings: document.getElementById('advanced-settings'), + connectionTimeout: document.getElementById('connection-timeout'), + reconnectAttempts: document.getElementById('reconnect-attempts'), + pingInterval: document.getElementById('ping-interval'), + compression: document.getElementById('compression'), + debugMode: document.getElementById('debug-mode'), + + // Collapsible panels + connectionToggle: document.getElementById('connection-toggle'), + connectionContent: document.getElementById('connection-content'), + logsToggle: document.getElementById('logs-toggle'), + logsContent: document.getElementById('logs-content'), + sidebarToggle: document.getElementById('sidebar-toggle'), + sidebarContent: document.getElementById('sidebar-content'), + + // Session history + historyToggle: document.getElementById('history-toggle'), + historyContent: document.getElementById('history-content'), + totalSessions: document.getElementById('total-sessions'), + successfulSessions: document.getElementById('successful-sessions'), + totalDuration: document.getElementById('total-duration'), + exportHistory: document.getElementById('export-history'), + clearHistory: document.getElementById('clear-history'), + historyList: document.getElementById('history-list') }; + // Отладка видео элемента + this.debugVideoElement(); + this.initialize(); } + + // Debug video element + debugVideoElement() { + console.log('🔍 DEBUG: Инициализация video элемента'); + console.log('🔍 Video element:', this.elements.remoteVideo); + + if (this.elements.remoteVideo) { + console.log('✅ Video element найден'); + console.log('📏 Video размеры:', { + width: this.elements.remoteVideo.videoWidth, + height: this.elements.remoteVideo.videoHeight, + clientWidth: this.elements.remoteVideo.clientWidth, + clientHeight: this.elements.remoteVideo.clientHeight + }); + + // Добавляем обработчики событий для отладки + this.elements.remoteVideo.addEventListener('loadstart', () => { + console.log('🎬 Video: loadstart'); + }); + + this.elements.remoteVideo.addEventListener('loadedmetadata', () => { + console.log('📊 Video: loadedmetadata', { + videoWidth: this.elements.remoteVideo.videoWidth, + videoHeight: this.elements.remoteVideo.videoHeight + }); + }); + + this.elements.remoteVideo.addEventListener('loadeddata', () => { + console.log('📦 Video: loadeddata - video data loaded'); + // Принудительно скрываем overlay когда данные загружены + this.elements.videoOverlay.classList.add('hidden'); + this.elements.videoOverlay.style.display = 'none'; + }); + + this.elements.remoteVideo.addEventListener('canplay', () => { + console.log('▶️ Video: canplay'); + // Принудительно скрываем overlay и пытаемся воспроизвести + this.elements.videoOverlay.classList.add('hidden'); + this.elements.videoOverlay.style.display = 'none'; + if (this.elements.remoteVideo.paused) { + this.elements.remoteVideo.play().catch(e => console.error('Error playing video:', e)); + } + }); + + this.elements.remoteVideo.addEventListener('play', () => { + console.log('🎯 Video: play'); + }); + + this.elements.remoteVideo.addEventListener('playing', () => { + console.log('🎬 Video: playing'); + }); + + this.elements.remoteVideo.addEventListener('error', (e) => { + console.error('❌ Video error:', e); + }); + + this.elements.remoteVideo.addEventListener('loadeddata', () => { + console.log('📊 Video: loadeddata - метаданные и первый кадр загружены'); + console.log(' Video размеры после loadeddata:', { + videoWidth: this.elements.remoteVideo.videoWidth, + videoHeight: this.elements.remoteVideo.videoHeight + }); + + // Принудительно скрываем overlay когда данные готовы + if (this.elements.remoteVideo.videoWidth > 0 && this.elements.remoteVideo.videoHeight > 0) { + this.elements.videoOverlay.classList.add('hidden'); + this.elements.videoOverlay.style.display = 'none'; + console.log('✅ Video готово - overlay скрыт'); + } + }); + + this.elements.remoteVideo.addEventListener('canplay', () => { + console.log('▶️ Video: canplay - можно начинать воспроизведение'); + // Дополнительная попытка воспроизведения + this.elements.remoteVideo.play().catch(e => { + console.warn('Ошибка автовоспроизведения в canplay:', e); + }); + }); + + // Устанавливаем тестовый цвет фона для проверки + this.elements.remoteVideo.style.backgroundColor = '#ff0000'; + + } else { + console.error('❌ Video element НЕ найден!'); + } + } + + // Toast notification system + showToast(title, message, type = 'info', duration = 4000) { + const toastContainer = document.getElementById('toast-container'); + const toast = document.createElement('div'); + toast.className = `toast ${type}`; + + const icons = { + success: '✓', + error: '✕', + warning: '⚠', + info: 'ℹ' + }; + + toast.innerHTML = ` +
${icons[type] || icons.info}
+
+
${title}
+
${message}
+
+ + `; + + toastContainer.appendChild(toast); + + // Анимация появления + setTimeout(() => { + toast.classList.add('show'); + }, 100); + + // Автоматическое удаление + setTimeout(() => { + toast.style.transform = 'translateX(100%)'; + setTimeout(() => { + if (toast.parentElement) { + toast.remove(); + } + }, 400); + }, duration); + + return toast; + } + + // Video monitoring and diagnostics + startVideoMonitoring() { + // Мониторинг состояния видео каждую секунду + if (this.videoMonitorInterval) { + clearInterval(this.videoMonitorInterval); + } + + this.videoMonitorInterval = setInterval(() => { + if (this.elements.remoteVideo && this.elements.remoteVideo.srcObject) { + const video = this.elements.remoteVideo; + const hasVideo = video.videoWidth > 0 && video.videoHeight > 0; + + console.log('📺 Video monitor check:', { + hasVideo, + dimensions: `${video.videoWidth}x${video.videoHeight}`, + readyState: video.readyState, + paused: video.paused, + currentTime: video.currentTime.toFixed(2), + ended: video.ended + }); + + // Если видео должно быть, но его нет - принудительно показываем + if (video.srcObject && !hasVideo && video.readyState >= 2) { + console.log('🔧 Video data missing but stream exists - forcing visibility'); + this.elements.videoOverlay.classList.add('hidden'); + this.elements.videoOverlay.style.display = 'none'; + + // Проверяем треки + const videoTracks = video.srcObject.getVideoTracks(); + if (videoTracks.length > 0) { + const track = videoTracks[0]; + console.log('📺 Track status:', { + enabled: track.enabled, + muted: track.muted, + readyState: track.readyState + }); + } + } + + // Если есть видео - скрываем overlay + if (hasVideo) { + this.elements.videoOverlay.classList.add('hidden'); + this.elements.videoOverlay.style.display = 'none'; + console.log('✅ Video is visible, hiding overlay'); + } + } + }, 1000); + } + + stopVideoMonitoring() { + if (this.videoMonitorInterval) { + clearInterval(this.videoMonitorInterval); + this.videoMonitorInterval = null; + } + } + + // Session history management + addSessionToHistory(sessionData) { + const session = { + id: sessionData.sessionId || Date.now(), + deviceId: sessionData.deviceId, + startTime: new Date(), + endTime: null, + duration: 0, + status: 'active', + camera: sessionData.camera || 'back' + }; + + this.sessionHistory.unshift(session); + this.sessionStats.total++; + this.updateSessionStats(); + this.updateSessionHistoryDisplay(); + this.saveSessionHistory(); + } + + endSession(sessionId, successful = true) { + const session = this.sessionHistory.find(s => s.id === sessionId); + if (session && session.status === 'active') { + session.endTime = new Date(); + session.duration = session.endTime - session.startTime; + session.status = successful ? 'completed' : 'failed'; + + if (successful) { + this.sessionStats.successful++; + } else { + this.sessionStats.failed++; + } + + this.sessionStats.totalDuration += session.duration; + this.updateSessionStats(); + this.updateSessionHistoryDisplay(); + this.saveSessionHistory(); + } + } + + updateSessionStats() { + this.elements.totalSessions.textContent = this.sessionStats.total; + this.elements.successfulSessions.textContent = this.sessionStats.successful; + this.elements.failedSessions.textContent = this.sessionStats.failed; + + const totalDurationMs = this.sessionStats.totalDuration; + const hours = Math.floor(totalDurationMs / (1000 * 60 * 60)); + const minutes = Math.floor((totalDurationMs % (1000 * 60 * 60)) / (1000 * 60)); + const seconds = Math.floor((totalDurationMs % (1000 * 60)) / 1000); + + this.elements.totalDuration.textContent = + `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; + } + + updateSessionHistoryDisplay() { + const container = this.elements.sessionHistory; + container.innerHTML = ''; + + this.sessionHistory.slice(0, 10).forEach(session => { + const div = document.createElement('div'); + div.className = 'history-item'; + + const duration = session.duration ? this.formatDuration(session.duration) : 'Активна'; + const statusClass = session.status === 'completed' ? 'success' : + session.status === 'failed' ? 'error' : 'info'; + const statusText = session.status === 'completed' ? 'Завершена' : + session.status === 'failed' ? 'Прервана' : 'Активна'; + + div.innerHTML = ` +
+
${session.deviceId}
+
${duration} • ${session.camera}
+
+
${statusText}
+ `; + + container.appendChild(div); + }); + } + + formatDuration(ms) { + const totalSeconds = Math.floor(ms / 1000); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes}:${seconds.toString().padStart(2, '0')}`; + } + + saveSessionHistory() { + try { + localStorage.setItem('godEyeSessionHistory', JSON.stringify({ + history: this.sessionHistory, + stats: this.sessionStats + })); + } catch (error) { + this.log('Ошибка сохранения истории сессий', 'error'); + } + } + + loadSessionHistory() { + try { + const data = localStorage.getItem('godEyeSessionHistory'); + if (data) { + const parsed = JSON.parse(data); + this.sessionHistory = parsed.history || []; + this.sessionStats = parsed.stats || { + total: 0, + successful: 0, + failed: 0, + totalDuration: 0 + }; + this.updateSessionStats(); + this.updateSessionHistoryDisplay(); + } + } catch (error) { + this.log('Ошибка загрузки истории сессий', 'error'); + } + } + + exportSessionHistory() { + const exportData = { + exported: new Date().toISOString(), + stats: this.sessionStats, + sessions: this.sessionHistory + }; + + const dataStr = JSON.stringify(exportData, null, 2); + const dataBlob = new Blob([dataStr], { type: 'application/json' }); + + const link = document.createElement('a'); + link.href = URL.createObjectURL(dataBlob); + link.download = `godeye-history-${new Date().toISOString().split('T')[0]}.json`; + link.click(); + + this.showToast('Экспорт завершен', 'История сессий экспортирована в файл', 'success'); + } + + clearSessionHistory() { + this.sessionHistory = []; + this.sessionStats = { + total: 0, + successful: 0, + failed: 0, + totalDuration: 0 + }; + this.updateSessionStats(); + this.updateSessionHistoryDisplay(); + this.saveSessionHistory(); + this.showToast('История очищена', 'Вся история сессий была удалена', 'info'); + } + + // Запуск мониторинга статистики + startStatsMonitoring() { + // Обновляем статистику каждую секунду + this.statsInterval = setInterval(() => { + this.updateVideoStats(); + }, 1000); + } + + // Остановка мониторинга статистики + stopStatsMonitoring() { + if (this.statsInterval) { + clearInterval(this.statsInterval); + this.statsInterval = null; + } + } + + // Функция принудительной диагностики и исправления видео + forceVideoPlayback() { + const videoElement = this.elements.remoteVideo; + if (!videoElement || !videoElement.srcObject) { + console.log('🚫 No video element or srcObject available'); + return false; + } + + console.log('🔧 FORCE VIDEO PLAYBACK DIAGNOSTIC:'); + console.log(' Video element:', !!videoElement); + console.log(' SrcObject:', !!videoElement.srcObject); + console.log(' Video dimensions:', videoElement.videoWidth, 'x', videoElement.videoHeight); + console.log(' Video paused:', videoElement.paused); + console.log(' Video ended:', videoElement.ended); + console.log(' Ready state:', videoElement.readyState); + console.log(' Network state:', videoElement.networkState); + console.log(' Current time:', videoElement.currentTime); + console.log(' Duration:', videoElement.duration); + console.log(' Autoplay:', videoElement.autoplay); + console.log(' Muted:', videoElement.muted); + console.log(' Controls:', videoElement.controls); + + // Проверяем видео треки + const videoTracks = videoElement.srcObject.getVideoTracks(); + console.log(' Video tracks count:', videoTracks.length); + + if (videoTracks.length > 0) { + const track = videoTracks[0]; + console.log(' Track enabled:', track.enabled); + console.log(' Track muted:', track.muted); + console.log(' Track ready state:', track.readyState); + console.log(' Track settings:', track.getSettings()); + + // Принудительно включаем трек + if (!track.enabled) { + console.log('🔧 Enabling disabled video track'); + track.enabled = true; + } + + // Дополнительная диагностика для muted треков + if (track.muted) { + console.log('🔧 Track is muted - this is normal for remote tracks'); + console.log('🔧 Muted tracks can still provide video data'); + } + } + + // Принудительно устанавливаем атрибуты для воспроизведения + videoElement.autoplay = true; + videoElement.muted = true; + videoElement.controls = true; + videoElement.playsInline = true; + + // Скрываем overlay + this.elements.videoOverlay.classList.add('hidden'); + + // Останавливаем любые предыдущие попытки воспроизведения + videoElement.pause(); + + // Ждем немного перед новой попыткой + return new Promise((resolve) => { + setTimeout(() => { + console.log('🔧 Attempting forced video playback...'); + videoElement.play().then(() => { + console.log('✅ Forced video playback successful'); + resolve(true); + }).catch(error => { + console.error('❌ Forced video playback failed:', error); + + // Если проблема с ready state, ждем загрузки + if (videoElement.readyState < 2) { + console.log('🔧 Video not ready, waiting for loadeddata event...'); + const onLoadedData = () => { + videoElement.removeEventListener('loadeddata', onLoadedData); + videoElement.play().catch(e => { + console.error('❌ Video play after loadeddata failed:', e); + }); + }; + videoElement.addEventListener('loadeddata', onLoadedData); + + // Timeout fallback + setTimeout(() => { + videoElement.removeEventListener('loadeddata', onLoadedData); + console.log('⏰ Loadeddata timeout, giving up'); + }, 10000); + } + + resolve(false); + }); + }, 100); + }); + } + + // Обновление статистики видео + async updateVideoStats() { + if (!this.localConnection || !this.remoteStream) { + this.resetVideoStats(); + return; + } + + try { + const stats = await this.localConnection.getStats(); + let bytesReceived = 0; + let packetsReceived = 0; + let packetsLost = 0; + let framesPerSecond = 0; + let frameWidth = 0; + let frameHeight = 0; + + stats.forEach((report) => { + if (report.type === 'inbound-rtp' && report.mediaType === 'video') { + bytesReceived += report.bytesReceived || 0; + packetsReceived += report.packetsReceived || 0; + packetsLost += report.packetsLost || 0; + framesPerSecond = report.framesPerSecond || 0; + frameWidth = report.frameWidth || 0; + frameHeight = report.frameHeight || 0; + } + }); + + // Расчет битрейта + const currentTime = Date.now(); + let bitrate = 0; + if (this.lastStatsTime > 0) { + const timeDiff = (currentTime - this.lastStatsTime) / 1000; // в секундах + const bytesDiff = bytesReceived - this.lastBytesReceived; + bitrate = Math.round((bytesDiff * 8) / timeDiff / 1024); // kbps + } + + // Сохраняем для следующего расчета + this.lastStatsTime = currentTime; + this.lastBytesReceived = bytesReceived; + + // Получаем размеры из video элемента если статистика не содержит их + const videoElement = this.elements.remoteVideo; + if (frameWidth === 0 && frameHeight === 0 && videoElement) { + frameWidth = videoElement.videoWidth || 0; + frameHeight = videoElement.videoHeight || 0; + } + + // Обновляем UI + this.displayVideoStats({ + bytesReceived, + packetsReceived, + packetsLost, + bitrate, + fps: Math.round(framesPerSecond), + resolution: `${frameWidth}x${frameHeight}` + }); + + } catch (error) { + console.error('Failed to get WebRTC stats:', error); + this.resetVideoStats(); + } + } + + // Отображение статистики в UI + displayVideoStats(stats) { + if (this.elements.bytesReceived) { + this.elements.bytesReceived.textContent = this.formatBytes(stats.bytesReceived); + } + if (this.elements.bitrate) { + this.elements.bitrate.textContent = `${stats.bitrate} kbps`; + } + if (this.elements.fps) { + this.elements.fps.textContent = stats.fps; + } + if (this.elements.packetsLost) { + this.elements.packetsLost.textContent = stats.packetsLost; + } + if (this.elements.videoResolution) { + this.elements.videoResolution.textContent = stats.resolution; + } + } + + // Сброс статистики + resetVideoStats() { + this.displayVideoStats({ + bytesReceived: 0, + bitrate: 0, + fps: 0, + packetsLost: 0, + resolution: '0x0' + }); + } + + // Форматирование байтов в читаемый вид + formatBytes(bytes) { + if (bytes === 0) return '0 bytes'; + const k = 1024; + const sizes = ['bytes', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; + } async initialize() { this.setupEventListeners(); this.updateImageFilters(); + this.loadSessionHistory(); // Загружаем историю сессий + + // Принудительно скрываем overlay при старте для тестирования + setTimeout(() => { + console.log('🔧 DEBUG: Принудительно скрываем overlay для тестирования'); + if (this.elements.videoOverlay) { + this.elements.videoOverlay.classList.add('hidden'); + this.elements.videoOverlay.style.display = 'none'; + } + }, 2000); + this.log('Приложение инициализировано', 'info'); // Загружаем конфигурацию @@ -150,10 +798,61 @@ class GodEyeOperator { } setupEventListeners() { - // Connection controls - this.elements.connectBtn.addEventListener('click', () => this.connect()); - this.elements.disconnectBtn.addEventListener('click', () => this.disconnect()); - this.elements.clearLogs.addEventListener('click', () => this.clearLogs()); + // Header connection toggle + if (this.elements.connectionToggle) { + this.elements.connectionToggle.addEventListener('click', () => { + if (this.isConnected) { + this.disconnect(); + } else { + this.connect(); + } + }); + } + + // Settings dropdown toggle + if (this.elements.settingsToggle) { + this.elements.settingsToggle.addEventListener('click', (e) => { + e.stopPropagation(); + this.elements.settingsMenu.classList.toggle('show'); + }); + + // Close settings menu when clicking outside + document.addEventListener('click', (e) => { + if (!this.elements.settingsMenu.contains(e.target) && !this.elements.settingsToggle.contains(e.target)) { + this.elements.settingsMenu.classList.remove('show'); + } + }); + } + + // Sidebar toggle + if (this.elements.sidebarToggle) { + this.elements.sidebarToggle.addEventListener('click', () => { + const isCollapsed = this.elements.controlPanel.classList.contains('collapsed'); + const icon = this.elements.sidebarToggle.querySelector('.collapse-icon'); + + if (isCollapsed) { + this.elements.controlPanel.classList.remove('collapsed'); + icon.textContent = '◄'; + } else { + this.elements.controlPanel.classList.add('collapsed'); + icon.textContent = '►'; + } + }); + } + + // Collapsible panels + this.setupCollapsiblePanel('devicesToggle', 'devicesContent'); + this.setupCollapsiblePanel('sessionsToggle', 'sessionsContent'); + + // Device refresh + if (this.elements.refreshDevices) { + this.elements.refreshDevices.addEventListener('click', () => this.refreshDevicesList()); + } + + // Clear logs + if (this.elements.clearLogs) { + this.elements.clearLogs.addEventListener('click', () => this.clearLogs()); + } // Logs panel toggle const logsToggle = document.getElementById('logs-toggle'); @@ -227,7 +926,12 @@ class GodEyeOperator { this.elements.cameraButtons.forEach(btn => { btn.addEventListener('click', () => { const cameraType = btn.dataset.camera; - this.switchCamera(cameraType); + if (this.currentActiveSession) { + this.switchCamera(this.currentActiveSession, cameraType); + } else { + this.log('Нет активной сессии для переключения камеры', 'warning'); + this.showToast('Переключение камеры', 'Нет активной сессии для переключения камеры', 'warning'); + } }); }); @@ -268,6 +972,24 @@ class GodEyeOperator { this.elements.monochrome.addEventListener('change', () => this.saveVideoFilters()); this.elements.edgeDetection.addEventListener('change', () => this.saveVideoFilters()); + // Sidebar collapse toggle + const sidebarCollapseBtn = document.getElementById('sidebar-collapse-btn'); + const sidebarPanel = document.getElementById('control-panel'); + + if (sidebarCollapseBtn && sidebarPanel) { + sidebarCollapseBtn.addEventListener('click', () => { + const isCollapsed = sidebarPanel.classList.contains('collapsed'); + + if (isCollapsed) { + sidebarPanel.classList.remove('collapsed'); + sidebarCollapseBtn.setAttribute('title', 'Свернуть панель'); + } else { + sidebarPanel.classList.add('collapsed'); + sidebarCollapseBtn.setAttribute('title', 'Развернуть панель'); + } + }); + } + // Keyboard shortcuts document.addEventListener('keydown', (e) => { if (e.ctrlKey || e.metaKey) { @@ -326,6 +1048,135 @@ class GodEyeOperator { } } }); + + // History panel toggle + const historyToggle = document.getElementById('history-toggle'); + const historyContent = document.getElementById('history-content'); + const historyCollapseIcon = historyToggle?.querySelector('.collapse-icon'); + + if (historyToggle) { + historyToggle.addEventListener('click', () => { + const isCollapsed = historyContent.classList.contains('collapsed'); + + if (isCollapsed) { + // Разворачиваем + historyContent.classList.remove('collapsed'); + historyCollapseIcon.classList.remove('collapsed'); + historyCollapseIcon.textContent = '▲'; + } else { + // Сворачиваем + historyContent.classList.add('collapsed'); + historyCollapseIcon.classList.add('collapsed'); + historyCollapseIcon.textContent = '▼'; + } + }); + } + + // Session history controls + if (this.elements.exportHistory) { + this.elements.exportHistory.addEventListener('click', () => this.exportSessionHistory()); + } + + if (this.elements.clearHistory) { + this.elements.clearHistory.addEventListener('click', () => { + if (confirm('Вы уверены, что хотите очистить всю историю сессий?')) { + this.clearSessionHistory(); + } + }); + } + + // Advanced settings toggle + if (this.elements.toggleAdvanced) { + this.elements.toggleAdvanced.addEventListener('click', () => { + const panel = this.elements.advancedSettings; + const isVisible = panel.style.display !== 'none'; + + if (isVisible) { + panel.style.display = 'none'; + this.elements.toggleAdvanced.textContent = '⚙️ Расширенные настройки'; + } else { + panel.style.display = 'block'; + this.elements.toggleAdvanced.textContent = '⚙️ Скрыть настройки'; + } + }); + } + + // Collapsible panels + this.setupCollapsiblePanel('connectionToggle', 'connectionContent'); + this.setupCollapsiblePanel('logsToggle', 'logsContent'); + this.setupCollapsiblePanel('historyToggle', 'historyContent'); + + // Sidebar toggle + if (this.elements.sidebarToggle) { + this.elements.sidebarToggle.addEventListener('click', () => { + const controlPanel = document.querySelector('.control-panel'); + const icon = this.elements.sidebarToggle.querySelector('.collapse-icon'); + + controlPanel.classList.toggle('collapsed'); + + if (controlPanel.classList.contains('collapsed')) { + icon.textContent = '▶'; + } else { + icon.textContent = '◀'; + } + }); + } + + // Advanced connection settings + if (this.elements.connectionTimeout) { + this.elements.connectionTimeout.addEventListener('change', (e) => { + this.saveConfig('connection.timeout', parseInt(e.target.value)); + }); + } + + if (this.elements.reconnectAttempts) { + this.elements.reconnectAttempts.addEventListener('change', (e) => { + this.saveConfig('connection.reconnectAttempts', parseInt(e.target.value)); + }); + } + + if (this.elements.pingInterval) { + this.elements.pingInterval.addEventListener('change', (e) => { + this.saveConfig('connection.pingInterval', parseInt(e.target.value)); + }); + } + + if (this.elements.compression) { + this.elements.compression.addEventListener('change', (e) => { + this.saveConfig('connection.compression', e.target.checked); + }); + } + + if (this.elements.debugMode) { + this.elements.debugMode.addEventListener('change', (e) => { + this.saveConfig('connection.debug', e.target.checked); + }); + } + } + + // Helper method for collapsible panels + setupCollapsiblePanel(toggleId, contentId) { + const toggle = this.elements[toggleId]; + const content = this.elements[contentId]; + + if (toggle && content) { + toggle.addEventListener('click', () => { + const icon = toggle.querySelector('.collapse-icon'); + const isCollapsed = content.classList.contains('collapsed'); + + if (isCollapsed) { + // Expand + content.classList.remove('collapsed'); + icon.classList.remove('collapsed'); + icon.textContent = '▲'; + } else { + // Collapse + content.classList.add('collapsed'); + icon.classList.add('collapsed'); + icon.textContent = '▼'; + } + }); + } } saveVideoFilters() { @@ -348,10 +1199,12 @@ class GodEyeOperator { const serverUrl = this.elements.serverUrl.value.trim(); if (!serverUrl) { this.log('Введите URL сервера', 'error'); + this.showToast('Ошибка подключения', 'Введите URL сервера', 'error'); return; } this.log(`Подключение к серверу: ${serverUrl}`, 'info'); + this.showToast('Подключение...', `Устанавливаем соединение с ${serverUrl}`, 'info'); try { this.socket = io(serverUrl, { @@ -369,27 +1222,29 @@ class GodEyeOperator { // Connection events this.socket.on('connect', () => { this.log('Подключен к серверу', 'success'); + this.showToast('Подключение установлено', 'Успешно подключен к серверу сигналинга', 'success'); this.updateConnectionStatus(true); this.registerOperator(); - this.startPingMonitoring(); }); this.socket.on('disconnect', () => { this.log('Отключен от сервера', 'warning'); + this.showToast('Соединение потеряно', 'Подключение к серверу разорвано', 'warning'); this.updateConnectionStatus(false); this.clearDevicesList(); this.updateSessionsList(); - this.stopPingMonitoring(); }); this.socket.on('connect_error', (error) => { this.log(`Ошибка соединения: ${error.message}`, 'error'); + this.showToast('Ошибка подключения', `Не удалось подключиться к серверу: ${error.message}`, 'error'); this.updateConnectionStatus(false); }); // Registration events this.socket.on('register:success', (data) => { this.log(`Регистрация успешна: ${data.operatorId}`, 'success'); + this.showToast('Регистрация завершена', 'Оператор успешно зарегистрирован в системе', 'success'); if (data.availableDevices) { this.updateDevicesList(data.availableDevices); } else { @@ -399,10 +1254,18 @@ class GodEyeOperator { this.socket.on('register:error', (error) => { this.log(`Ошибка регистрации: ${error.message}`, 'error'); + this.showToast('Ошибка регистрации', `Не удалось зарегистрировать оператора: ${error.message}`, 'error'); }); // Devices events this.socket.on('devices:list', (data) => { + // Обновляем кэш устройств при получении полного списка + this.connectedDevices.clear(); + if (data.devices) { + data.devices.forEach(device => { + this.connectedDevices.set(device.deviceId, device); + }); + } this.updateDevicesList(data.devices); }); @@ -411,8 +1274,73 @@ class GodEyeOperator { this.handleCameraResponse(data); }); + this.socket.on('camera:request-sent', (data) => { + this.log(`Запрос камеры отправлен: сессия ${data.sessionId}`, 'info'); + this.showToast('Запрос отправлен', `Ожидание ответа от устройства ${data.deviceId}`, 'info'); + + // Создаем ожидающую сессию + this.activeSessions.set(data.sessionId, { + sessionId: data.sessionId, + deviceId: data.deviceId, + status: 'pending', + createdAt: new Date() + }); + this.updateSessionsList(); + }); + + this.socket.on('camera:stream-ready', (data) => { + this.log(`Поток камеры готов: сессия ${data.sessionId}`, 'success'); + this.showToast('Камера подключена', 'Видеопоток готов к отображению', 'success'); + + const session = this.activeSessions.get(data.sessionId); + if (session) { + session.status = 'active'; + session.streamUrl = data.streamUrl; + + // Если нет активной сессии, делаем эту активной + if (!this.currentActiveSession) { + this.currentActiveSession = data.sessionId; + this.currentSession = { + id: data.sessionId, + deviceId: session.deviceId, + cameraType: session.cameraType || 'back' + }; + this.elements.sessionInfo.textContent = `Активная сессия: ${session.deviceId}`; + this.initWebRTC(); + } + this.updateSessionsList(); + } + }); + + this.socket.on('camera:denied', (data) => { + this.log(`Доступ к камере отклонен: сессия ${data.sessionId}`, 'error'); + this.showToast('Доступ отклонен', `Устройство отклонило запрос: ${data.error || 'Неизвестная ошибка'}`, 'error'); + + // Удаляем отклоненную сессию + this.activeSessions.delete(data.sessionId); + this.updateSessionsList(); + }); + + this.socket.on('camera:disconnected', (data) => { + this.log(`Камера отключена: сессия ${data.sessionId}`, 'warning'); + this.showToast('Камера отключена', 'Соединение с камерой разорвано', 'warning'); + + // Удаляем сессию + this.activeSessions.delete(data.sessionId); + + // Если это была активная сессия, очищаем + if (this.currentActiveSession === data.sessionId) { + this.currentActiveSession = null; + this.currentSession = null; + this.elements.sessionInfo.textContent = ''; + this.cleanupWebRTC(); + } + this.updateSessionsList(); + }); + this.socket.on('camera:error', (error) => { - this.log(`Ошибка камеры: ${error.message}`, 'error'); + this.log(`Ошибка камеры: ${error.error || error.message}`, 'error'); + this.showToast('Ошибка камеры', error.error || error.message || 'Неизвестная ошибка', 'error'); }); // WebRTC events @@ -432,13 +1360,6 @@ class GodEyeOperator { this.log(`Ошибка WebRTC: ${error.message}`, 'error'); }); - // Ping events - this.socket.on('pong', (startTime) => { - const ping = Date.now() - startTime; - this.elements.pingIndicator.textContent = `Ping: ${ping}ms`; - this.elements.pingIndicator.style.color = ping < 100 ? '#4CAF50' : ping < 300 ? '#FF9800' : '#f44336'; - }); - // Session events this.socket.on('session:created', (data) => { this.log(`Сессия создана: ${data.sessionId}`, 'info'); @@ -479,6 +1400,13 @@ class GodEyeOperator { this.elements.sessionInfo.textContent = `Активная сессия: ${session.deviceId} (${session.cameraType})`; this.updateCameraButtons(session.cameraType); this.initWebRTC(); + + // Добавляем сессию в историю + this.addSessionToHistory({ + sessionId: data.sessionId, + deviceId: data.deviceId, + camera: data.cameraType + }); } this.updateSessionsList(); } @@ -537,6 +1465,10 @@ class GodEyeOperator { this.socket.on('session:ended', (data) => { this.log(`Сессия завершена: ${data.sessionId}`, 'info'); + + // Завершаем сессию в истории + this.endSession(data.sessionId, true); + this.activeSessions.delete(data.sessionId); if (this.currentActiveSession === data.sessionId) { this.currentActiveSession = null; @@ -548,6 +1480,10 @@ class GodEyeOperator { // Дополнительный обработчик для совместимости this.socket.on('camera:disconnected', (data) => { this.log(`Камера отключена: ${data.sessionId}`, 'warning'); + + // Завершаем сессию в истории как прерванную + this.endSession(data.sessionId, false); + const session = this.activeSessions.get(data.sessionId); if (session) { session.status = 'ended'; @@ -557,12 +1493,19 @@ class GodEyeOperator { // Обработчик обновления списка устройств this.socket.on('device:connected', (data) => { - this.log(`Новое устройство подключено: ${data.deviceId}`, 'info'); - this.requestDevicesList(); // Обновляем список устройств + // Дедупликация: проверяем, не было ли уже это устройство + if (!this.connectedDevices.has(data.deviceId)) { + this.connectedDevices.set(data.deviceId, data); + this.log(`Новое устройство подключено: ${data.deviceId}`, 'info'); + this.showToast('Новое устройство', `Подключено устройство: ${data.deviceId}`, 'info'); + this.requestDevicesList(); // Обновляем список устройств + } }); this.socket.on('device:disconnected', (data) => { + this.connectedDevices.delete(data.deviceId); this.log(`Устройство отключено: ${data.deviceId}`, 'warning'); + this.showToast('Устройство отключено', `Устройство ${data.deviceId} покинуло сеть`, 'warning'); this.requestDevicesList(); // Обновляем список устройств }); } @@ -583,6 +1526,12 @@ class GodEyeOperator { this.socket.disconnect(); this.socket = null; } + + // Останавливаем мониторинг статистики + this.stopStatsMonitoring(); + this.stopVideoMonitoring(); // Останавливаем мониторинг видео + this.resetVideoStats(); + this.updateConnectionStatus(false); this.log('Отключен от сервера', 'info'); } @@ -590,47 +1539,67 @@ class GodEyeOperator { updateConnectionStatus(connected) { this.isConnected = connected; - // Обновляем заголовок панели подключения - const connectionToggle = document.getElementById('connection-toggle'); - const connectionTitle = connectionToggle?.querySelector('h3'); + const statusIcon = this.elements.connectionStatusIcon; + const buttonText = this.elements.connectionButtonText; + const statusText = this.elements.connectionStatusText; + const toggleButton = this.elements.connectionToggle; if (connected) { - this.elements.connectBtn.textContent = 'Отключиться'; - this.elements.connectBtn.className = 'btn-danger'; - this.elements.connectBtn.disabled = false; - this.elements.disconnectBtn.disabled = false; - this.elements.connectionIndicator.textContent = '● Подключен'; - this.elements.connectionIndicator.className = 'status connected'; - this.elements.connectionStatusText.textContent = 'Подключен к серверу'; + toggleButton.classList.remove('disconnected'); + toggleButton.classList.add('connected'); + statusIcon.classList.remove('disconnected'); + statusIcon.classList.add('connected'); + buttonText.textContent = 'Подключен'; + statusText.textContent = 'Подключен к серверу'; - // Обновляем заголовок с индикатором подключения - if (connectionTitle) { - connectionTitle.innerHTML = '🔗 Подключение к серверу '; - } + // Start ping monitoring + this.startPingMonitoring(); } else { - this.elements.connectBtn.textContent = 'Подключиться'; - this.elements.connectBtn.className = 'btn-primary'; - this.elements.connectBtn.disabled = false; - this.elements.disconnectBtn.disabled = true; - this.elements.connectionIndicator.textContent = '● Отключен'; - this.elements.connectionIndicator.className = 'status disconnected'; - this.elements.connectionStatusText.textContent = 'Не подключен'; - this.elements.sessionInfo.textContent = ''; + toggleButton.classList.remove('connected'); + toggleButton.classList.add('disconnected'); + statusIcon.classList.remove('connected'); + statusIcon.classList.add('disconnected'); + buttonText.textContent = 'Отключен'; + statusText.textContent = 'Не подключен'; + this.elements.pingIndicator.textContent = 'Ping: --'; - // Обновляем заголовок с индикатором отключения - if (connectionTitle) { - connectionTitle.innerHTML = '🔗 Подключение к серверу '; - } - - // Очищаем сессии при отключении - if (this.activeSessions) { - this.activeSessions.clear(); - this.currentActiveSession = null; - this.updateSessionsList(); + // Stop ping monitoring + if (this.pingInterval) { + clearInterval(this.pingInterval); + this.pingInterval = null; } } } + startPingMonitoring() { + if (this.pingInterval) { + clearInterval(this.pingInterval); + } + + this.pingInterval = setInterval(() => { + if (this.socket && this.socket.connected) { + const startTime = Date.now(); + this.socket.emit('ping', startTime); + + // Set timeout for ping response + setTimeout(() => { + if (this.elements.pingIndicator.textContent === 'Ping: --') { + this.elements.pingIndicator.textContent = 'Ping: timeout'; + } + }, 5000); + } + }, 10000); + } + + refreshDevicesList() { + if (this.socket && this.socket.connected) { + this.socket.emit('get:devices'); + this.log('Запрос обновления списка устройств', 'info'); + } else { + this.log('Нет подключения к серверу', 'error'); + } + } + updateDevicesList(devices) { const container = this.elements.devicesList; this.log('Обновление списка устройств в UI...', 'debug'); @@ -717,8 +1686,8 @@ class GodEyeOperator { title="${this.currentActiveSession === sessionId ? 'Активная сессия' : 'Переключиться на эту сессию'}"> ${this.currentActiveSession === sessionId ? '✓ Активна' : '🔄 Переключить'} - ${session.connectionId ? ` @@ -780,84 +1749,6 @@ class GodEyeOperator { // В будущем здесь будет логика переключения WebRTC потоков } - switchCamera(sessionId, cameraType) { - const session = this.activeSessions.get(sessionId); - if (!session || session.status !== 'active') { - this.log(`Нельзя переключить камеру в сессии ${sessionId}`, 'error'); - return; - } - - this.log(`Переключение камеры в сессии ${sessionId} на ${cameraType}`, 'info'); - - if (this.socket) { - this.socket.emit('camera:switch', { - sessionId: sessionId, - cameraType: cameraType - }); - } - - // Обновляем информацию о сессии - session.cameraType = cameraType; - this.updateSessionsList(); - - if (this.currentActiveSession === sessionId) { - this.elements.sessionInfo.textContent = `Активная сессия: ${session.deviceId} (${session.cameraType})`; - } - } - - requestCamera(deviceId, cameraType = 'back') { - if (!this.socket || !this.socket.connected) { - this.log('Нет подключения к серверу', 'error'); - return; - } - - this.log(`Запрос доступа к камере ${cameraType} устройства ${deviceId}`, 'info'); - - // Используем новое событие для подключения через ConnectionManager - this.socket.emit('camera:request', { - deviceId: deviceId, - operatorId: this.operatorId, - cameraType: cameraType - }); - } - - handleCameraResponse(data) { - if (data.success) { - // Обновляем сессию в коллекции - const sessionData = { - sessionId: data.sessionId || data.session.id, - deviceId: data.session.deviceId, - cameraType: data.session.cameraType, - status: 'active' - }; - - this.activeSessions.set(sessionData.sessionId, sessionData); - - // Если нет текущей активной сессии, сделаем эту активной - if (!this.currentActiveSession) { - this.currentActiveSession = sessionData.sessionId; - this.currentSession = data.session; // Сохраняем для обратной совместимости - this.elements.sessionInfo.textContent = `Активная сессия: ${sessionData.deviceId} (${sessionData.cameraType})`; - this.updateCameraButtons(sessionData.cameraType); - this.initWebRTC(); - } - - this.log(`Доступ к камере получен. Сессия: ${sessionData.sessionId}`, 'success'); - this.updateSessionsList(); - } else { - this.log(`Отказ в доступе к камере: ${data.message}`, 'error'); - } - } - - updateCameraButtons(activeCameraType) { - this.elements.cameraButtons.forEach(btn => { - btn.classList.remove('active'); - if (btn.dataset.camera === activeCameraType) { - btn.classList.add('active'); - } - }); - } - switchCamera(sessionIdOrType, cameraType) { // Определяем, передан sessionId или это старый вызов let sessionId, targetCameraType; @@ -879,28 +1770,119 @@ class GodEyeOperator { if (!sessionId) { this.log('Нет активной сессии для переключения камеры', 'warning'); + this.showToast('Переключение камеры', 'Нет активной сессии для переключения камеры', 'warning'); return; } const session = this.activeSessions.get(sessionId); if (!session || session.status !== 'active') { this.log(`Нельзя переключить камеру в сессии ${sessionId}`, 'error'); + this.showToast('Ошибка переключения', `Нельзя переключить камеру в сессии ${sessionId}`, 'error'); return; } this.log(`Переключение на камеру: ${targetCameraType} в сессии ${sessionId}`, 'info'); + this.showToast('Переключение камеры', `Переключение на камеру: ${targetCameraType}`, 'info'); - this.socket.emit('camera:switch', { - sessionId: sessionId, - cameraType: targetCameraType - }); - - // Обновляем состояние кнопок только для активной сессии - if (sessionId === this.currentActiveSession) { + if (this.socket && this.socket.connected) { + this.socket.emit('camera:switch', { + sessionId: sessionId, + cameraType: targetCameraType + }); + + // Обновляем информацию о сессии локально + session.cameraType = targetCameraType; + this.updateSessionsList(); this.updateCameraButtons(targetCameraType); + + if (this.currentActiveSession === sessionId) { + this.elements.sessionInfo.textContent = `Активная сессия: ${session.deviceId} (${targetCameraType})`; + } + } else { + this.log('Нет подключения к серверу для переключения камеры', 'error'); + this.showToast('Ошибка подключения', 'Нет подключения к серверу', 'error'); } } + toggleCamera(sessionId) { + const session = this.activeSessions.get(sessionId); + if (!session || session.status !== 'active') { + this.log(`Нельзя переключить камеру в сессии ${sessionId}`, 'error'); + return; + } + + // Переключаем между back и front + const newCameraType = session.cameraType === 'back' ? 'front' : 'back'; + this.switchCamera(sessionId, newCameraType); + } + + + + requestCamera(deviceId, cameraType = 'back') { + if (!this.socket || !this.socket.connected) { + this.log('Нет подключения к серверу', 'error'); + return; + } + + this.log(`Запрос доступа к камере ${cameraType} устройства ${deviceId}`, 'info'); + + // Используем новое событие для подключения через ConnectionManager + this.socket.emit('camera:request', { + deviceId: deviceId, + operatorId: this.operatorId, + cameraType: cameraType + }); + } + + handleCameraResponse(data) { + this.log(`Получен ответ camera:response: ${JSON.stringify(data)}`, 'info'); + + if (data.success) { + this.log('Доступ к камере получен успешно', 'success'); + + // Проверяем структуру данных + if (!data.session) { + this.log('Ошибка: отсутствует data.session в ответе', 'error'); + return; + } + + // Обновляем сессию в коллекции + const sessionData = { + sessionId: data.sessionId || data.session.id, + deviceId: data.session.deviceId, + cameraType: data.session.cameraType, + status: 'active' + }; + + this.log(`Создаем сессию: ${JSON.stringify(sessionData)}`, 'info'); + this.activeSessions.set(sessionData.sessionId, sessionData); + + // Если нет текущей активной сессии, сделаем эту активной + if (!this.currentActiveSession) { + this.log(`Устанавливаем активную сессию: ${sessionData.sessionId}`, 'info'); + this.currentActiveSession = sessionData.sessionId; + this.currentSession = data.session; // Сохраняем для обратной совместимости + this.elements.sessionInfo.textContent = `Активная сессия: ${sessionData.deviceId} (${sessionData.cameraType})`; + this.updateCameraButtons(sessionData.cameraType); + this.initWebRTC(); + } + + this.log(`Доступ к камере получен. Сессия: ${sessionData.sessionId}`, 'success'); + this.updateSessionsList(); + } else { + this.log(`Отказ в доступе к камере: ${data.message}`, 'error'); + } + } + + updateCameraButtons(activeCameraType) { + this.elements.cameraButtons.forEach(btn => { + btn.classList.remove('active'); + if (btn.dataset.camera === activeCameraType) { + btn.classList.add('active'); + } + }); + } + // Новые методы для управления подключениями через ConnectionManager terminateConnection(connectionId, sessionId) { @@ -962,19 +1944,398 @@ class GodEyeOperator { async initWebRTC() { try { + // Сбрасываем состояние WebRTC для новой сессии + this.pendingICECandidates = []; + this.isRemoteDescriptionSet = false; + this.isVideoStreamProcessed = false; // Сброс флага обработки видео + this.isProcessingOffer = false; // Сброс флага обработки offer + + // Запускаем мониторинг статистики + this.startStatsMonitoring(); + this.localConnection = new RTCPeerConnection({ iceServers: [ { urls: 'stun:stun.l.google.com:19302' } ] }); + // Handle connection state changes + this.localConnection.onconnectionstatechange = () => { + const state = this.localConnection.connectionState; + this.log(`WebRTC connection state: ${state}`, state === 'connected' ? 'success' : 'info'); + console.log('WebRTC connection state changed:', state); + }; + + this.localConnection.oniceconnectionstatechange = () => { + const state = this.localConnection.iceConnectionState; + this.log(`ICE connection state: ${state}`, state === 'connected' || state === 'completed' ? 'success' : 'info'); + console.log('ICE connection state changed:', state); + + // Принудительно скрываем overlay при успешном соединении + if (state === 'connected' || state === 'completed') { + console.log('🔥 ICE connected - forcing video overlay to hide'); + this.elements.videoOverlay.classList.add('hidden'); + + // Дополнительная проверка video элемента + const videoElement = this.elements.remoteVideo; + console.log('📺 Video element check on ICE connected:'); + console.log(' Video element exists:', !!videoElement); + console.log(' SrcObject exists:', !!videoElement.srcObject); + console.log(' Video dimensions:', videoElement.videoWidth, 'x', videoElement.videoHeight); + console.log(' Video paused:', videoElement.paused); + console.log(' Video ready state:', videoElement.readyState); + + // Проверяем статус video track + const videoTrack = videoElement.srcObject?.getVideoTracks()?.[0]; + if (videoTrack) { + console.log(' Video track muted:', videoTrack.muted); + console.log(' Video track readyState:', videoTrack.readyState); + } + + // Попытка принудительно запустить видео, если оно не играет + if (videoElement.paused && videoElement.srcObject) { + console.log('🔥 Forcing video play on ICE connected'); + videoElement.play().catch(error => { + console.error('Failed to play video on ICE connected:', error); + }); + } + + // Через 3 секунды принудительно скрываем overlay даже если видео не готово + setTimeout(() => { + console.log('⏰ Forcing overlay hide after 3 seconds timeout'); + this.elements.videoOverlay.classList.add('hidden'); + // Дополнительная попытка запуска видео + this.forceVideoPlayback(); + }, 3000); + } + }; + + this.localConnection.onicegatheringstatechange = () => { + const state = this.localConnection.iceGatheringState; + this.log(`ICE gathering state: ${state}`, 'info'); + console.log('ICE gathering state changed:', state); + }; + + this.localConnection.onsignalingstatechange = () => { + const state = this.localConnection.signalingState; + this.log(`Signaling state: ${state}`, 'info'); + console.log('Signaling state changed:', state); + }; + // Handle incoming stream this.localConnection.ontrack = (event) => { + console.log('🎯 ontrack event triggered!'); + console.log(' Event object:', event); + console.log(' Streams length:', event.streams?.length); + this.log('Получен видеопоток', 'success'); + console.log('ontrack event:', event); + console.log('streams:', event.streams); + console.log('tracks:', event.streams[0]?.getTracks()); + this.remoteStream = event.streams[0]; - this.elements.remoteVideo.srcObject = this.remoteStream; + const videoElement = this.elements.remoteVideo; + + // Принудительно скрываем overlay сразу при получении потока this.elements.videoOverlay.classList.add('hidden'); + // Детальная диагностика потока + console.log('📺 Video stream analysis:'); + console.log(' Stream object:', this.remoteStream); + console.log(' Stream ID:', this.remoteStream.id); + console.log(' Stream active:', this.remoteStream.active); + console.log(' Video tracks:', this.remoteStream.getVideoTracks()); + console.log(' Audio tracks:', this.remoteStream.getAudioTracks()); + + const videoTracks = this.remoteStream.getVideoTracks(); + if (videoTracks.length > 0) { + const track = videoTracks[0]; + console.log(' Video track details:'); + console.log(' ID:', track.id); + console.log(' Kind:', track.kind); + console.log(' Enabled:', track.enabled); + console.log(' Muted:', track.muted); + console.log(' ReadyState:', track.readyState); + console.log(' Settings:', track.getSettings()); + + // Принудительно размьючиваем трек если он заглушен + if (track.muted) { + console.log('🔧 FORCING track unmute - trying to enable video data'); + // Попытка принудительного размьютинга (может не работать для удаленных треков) + try { + track.enabled = true; + console.log('✅ Track enabled set to true'); + } catch (e) { + console.log('⚠️ Cannot control remote track enabled state:', e.message); + } + } + + // Принудительно включаем заглушенный трек + if (track.muted) { + console.log('🔧 Принудительно пытаемся разблокировать muted video track'); + // Попробуем клонировать трек для обхода muted состояния + try { + const clonedTrack = track.clone(); + if (clonedTrack && !clonedTrack.muted) { + console.log('✅ Создан клон трека без mute'); + const newStream = new MediaStream([clonedTrack]); + this.remoteStream.getAudioTracks().forEach(audioTrack => { + newStream.addTrack(audioTrack); + }); + this.remoteStream = newStream; + videoElement.srcObject = newStream; + } + } catch (error) { + console.warn('Не удалось клонировать трек:', error); + } + } + + // Слушаем события unmute на треке + track.addEventListener('unmute', () => { + console.log('🔊 Video track unmuted - video data should be available now!'); + this.elements.videoOverlay.classList.add('hidden'); + + // Принудительно пытаемся запустить видео при unmute + if (videoElement.paused) { + console.log('🎬 Starting video playback after unmute'); + videoElement.play().catch(error => { + console.error('Failed to play video after unmute:', error); + }); + } + }); + + track.addEventListener('mute', () => { + console.log('🔇 Video track muted'); + }); + + // Скрываем overlay независимо от состояния mute + console.log('� Hiding overlay regardless of track mute state'); + this.elements.videoOverlay.classList.add('hidden'); + + // Добавляем более агрессивный timeout для unmute + setTimeout(() => { + console.log('⏰ Aggressive unmute attempt after 2 seconds'); + if (track.muted) { + console.log('🔧 Track still muted, forcing playback anyway'); + } + this.forceVideoPlayback(); + }, 2000); + } else { + console.error('❌ No video tracks found in stream!'); + this.log('Нет видеотреков в потоке!', 'error'); + // Даже без видеотреков скрываем overlay через 3 секунды и пытаемся запустить + setTimeout(() => { + this.elements.videoOverlay.classList.add('hidden'); + this.forceVideoPlayback(); + }, 3000); + } + + // Устанавливаем поток + videoElement.srcObject = this.remoteStream; + console.log('📺 Video element updated with stream'); + + // Запускаем мониторинг видео + this.startVideoMonitoring(); + + // Принудительно запускаем видео сразу + setTimeout(() => { + console.log('🚀 Force starting video playback'); + this.forceVideoPlayback(); + + // Дополнительная попытка через 1 секунду + setTimeout(() => { + if (videoElement.paused || videoElement.videoWidth === 0) { + console.log('🔄 Second attempt to start video'); + this.forceVideoPlayback(); + } + }, 1000); + }, 100); + + // Защита от прерывания - ждем готовности элемента + const waitForVideoReady = () => { + return new Promise((resolve) => { + // Проверяем наличие видеоданных - не просто загрузку + const checkVideoData = () => { + console.log('📺 Checking video data readiness:'); + console.log(' Ready state:', videoElement.readyState); + console.log(' Video dimensions:', videoElement.videoWidth, 'x', videoElement.videoHeight); + console.log(' Network state:', videoElement.networkState); + + // Видео готово, если есть размеры И данные загружены + if (videoElement.readyState >= 2 && videoElement.videoWidth > 0 && videoElement.videoHeight > 0) { + console.log('✅ Video data is ready!'); + resolve(); + } else if (videoElement.readyState >= 2) { + console.log('⏳ Video metadata loaded but no dimensions yet, waiting...'); + // Если метаданные загружены но размеров нет, ждем еще + setTimeout(checkVideoData, 200); + } else { + console.log('⏳ Video not ready yet, waiting for loadeddata...'); + // Также проверяем unmute статус трека + const videoTrack = videoElement.srcObject?.getVideoTracks()?.[0]; + if (videoTrack && !videoTrack.muted) { + console.log('🔊 Video track is unmuted, but element not ready yet'); + setTimeout(checkVideoData, 500); + } else { + // Ждем события loadeddata + videoElement.addEventListener('loadeddata', checkVideoData, { once: true }); + } + } + }; + + checkVideoData(); + }); + }; + + // Добавляем обработчики событий видео + videoElement.onloadedmetadata = () => { + this.log('Видео метаданные загружены', 'success'); + console.log('📺 Video metadata loaded:'); + console.log(' Dimensions:', videoElement.videoWidth, 'x', videoElement.videoHeight); + console.log(' Duration:', videoElement.duration); + console.log(' ReadyState:', videoElement.readyState); + console.log(' NetworkState:', videoElement.networkState); + console.log(' Paused:', videoElement.paused); + console.log(' Ended:', videoElement.ended); + }; + + videoElement.onplay = () => { + this.log('Видео началось', 'success'); + console.log('📺 Video started playing'); + console.log(' Current time:', videoElement.currentTime); + console.log(' Video dimensions:', videoElement.videoWidth, 'x', videoElement.videoHeight); + }; + + videoElement.onplaying = () => { + console.log('📺 Video is playing (after buffering)'); + }; + + videoElement.oncanplay = () => { + console.log('📺 Video can start playing'); + // Когда видео готово к воспроизведению, скрываем overlay + this.elements.videoOverlay.classList.add('hidden'); + // Принудительно запускаем видео + if (videoElement.paused) { + videoElement.play().catch(error => { + console.error('Failed to auto-play video on canplay:', error); + }); + } + }; + + videoElement.oncanplaythrough = () => { + console.log('📺 Video can play through without interruption'); + }; + + videoElement.onloadstart = () => { + console.log('📺 Video load started'); + }; + + videoElement.onloadeddata = () => { + console.log('📺 Video data loaded'); + // При загрузке данных проверяем, можно ли скрыть overlay + if (videoElement.videoWidth > 0 && videoElement.videoHeight > 0) { + console.log('📺 Video has dimensions, hiding overlay'); + this.elements.videoOverlay.classList.add('hidden'); + } + }; + + videoElement.onerror = (error) => { + this.log(`Ошибка видео: ${error}`, 'error'); + console.error('❌ Video error:', error); + console.error(' Error code:', videoElement.error?.code); + console.error(' Error message:', videoElement.error?.message); + }; + + videoElement.onstalled = () => { + console.warn('⚠️ Video stalled'); + }; + + videoElement.onsuspend = () => { + console.warn('⚠️ Video suspended'); + }; + + videoElement.onwaiting = () => { + console.warn('⚠️ Video waiting for data'); + }; + + // Отслеживаем изменение размеров видео + videoElement.onresize = () => { + console.log('📺 Video dimensions changed:', videoElement.videoWidth, 'x', videoElement.videoHeight); + if (videoElement.videoWidth > 0 && videoElement.videoHeight > 0) { + console.log('📺 Video has valid dimensions, ensuring overlay is hidden'); + this.elements.videoOverlay.classList.add('hidden'); + } + }; + + // Принудительно запускаем воспроизведение + console.log('📺 Attempting to play video...'); + console.log(' Autoplay:', videoElement.autoplay); + console.log(' Muted:', videoElement.muted); + console.log(' Controls:', videoElement.controls); + console.log(' SrcObject exists:', !!videoElement.srcObject); + + // Устанавливаем атрибуты для автоплея + videoElement.autoplay = true; + videoElement.muted = true; + videoElement.controls = true; + videoElement.playsInline = true; + + // Асинхронно запускаем воспроизведение после готовности + waitForVideoReady().then(() => { + console.log('📺 Video ready, starting playback...'); + return videoElement.play(); + }).then(() => { + this.log('Видео запущено принудительно', 'success'); + console.log('✅ Video play() succeeded'); + this.elements.videoOverlay.classList.add('hidden'); + + // Проверяем статус через 2 секунды + setTimeout(() => { + console.log('📺 Video status check after 2 seconds:'); + console.log(' Playing:', !videoElement.paused && !videoElement.ended); + console.log(' Paused:', videoElement.paused); + console.log(' Ended:', videoElement.ended); + console.log(' Current time:', videoElement.currentTime); + console.log(' Ready state:', videoElement.readyState); + console.log(' Network state:', videoElement.networkState); + console.log(' Video dimensions:', videoElement.videoWidth, 'x', videoElement.videoHeight); + + // Дополнительная диагностика стилей и DOM + console.log('📺 Video element DOM info:'); + console.log(' Element exists:', !!videoElement); + console.log(' Display style:', window.getComputedStyle(videoElement).display); + console.log(' Visibility style:', window.getComputedStyle(videoElement).visibility); + console.log(' Opacity style:', window.getComputedStyle(videoElement).opacity); + console.log(' Width style:', window.getComputedStyle(videoElement).width); + console.log(' Height style:', window.getComputedStyle(videoElement).height); + console.log(' Position style:', window.getComputedStyle(videoElement).position); + console.log(' Overlay hidden:', this.elements.videoOverlay.classList.contains('hidden')); + + if (videoElement.videoWidth === 0 || videoElement.videoHeight === 0) { + console.error('❌ Video has no dimensions - likely no video data'); + this.log('Видео не имеет размеров - возможно нет видеоданных', 'error'); + } + + if (videoElement.paused) { + console.warn('⚠️ Video is still paused, trying to play again'); + videoElement.play(); + } + }, 2000); + }).catch(error => { + this.log(`Ошибка запуска видео: ${error.message}`, 'error'); + console.error('❌ Play error:', error); + console.error(' Error name:', error.name); + console.error(' Error message:', error.message); + + // Попробуем еще раз через секунду + setTimeout(() => { + console.log('🔄 Retrying video play...'); + videoElement.play().catch(retryError => { + console.error('❌ Retry failed:', retryError); + }); + }, 1000); + }); + // Enable recording controls when stream is available this.elements.startRecording.disabled = false; }; @@ -989,38 +2350,190 @@ class GodEyeOperator { } }; - // Create and send offer - const offer = await this.localConnection.createOffer(); - await this.localConnection.setLocalDescription(offer); - - this.socket.emit('webrtc:offer', { - sessionId: this.currentSession.id, - offer: offer - }); + // Desktop-operator НЕ создает offer! + // Он только отвечает на offer'ы от Android устройств + this.log('WebRTC инициализирован, ожидаем offer от Android устройства', 'info'); } catch (error) { this.log(`Ошибка инициализации WebRTC: ${error.message}`, 'error'); } } + cleanupWebRTC() { + try { + this.log('Очистка WebRTC соединения', 'info'); + + // Останавливаем мониторинг + this.stopVideoMonitoring(); + if (this.statsInterval) { + clearInterval(this.statsInterval); + this.statsInterval = null; + } + + // Очищаем video element + if (this.elements.remoteVideo) { + this.elements.remoteVideo.srcObject = null; + this.elements.remoteVideo.load(); // Сброс состояния video element + + // Показываем overlay обратно + if (this.elements.videoOverlay) { + this.elements.videoOverlay.classList.remove('hidden'); + this.elements.videoOverlay.style.display = 'flex'; + } + } + + // Закрываем RTCPeerConnection + if (this.localConnection) { + this.localConnection.close(); + this.localConnection = null; + } + + // Очищаем remote stream + if (this.remoteStream) { + this.remoteStream.getTracks().forEach(track => { + track.stop(); + }); + this.remoteStream = null; + } + + // Сбрасываем флаги состояния + this.isRemoteDescriptionSet = false; + this.isVideoStreamProcessed = false; + this.isProcessingOffer = false; + this.pendingICECandidates = []; + + // Отключаем запись если активна + if (this.isRecording) { + this.stopRecording(); + } + + // Очищаем UI + this.elements.sessionInfo.textContent = ''; + this.updateVideoStats({ bitrate: 0, fps: 0, packetsLost: 0, resolution: '0x0' }); + + this.log('WebRTC соединение очищено', 'success'); + + } catch (error) { + this.log(`Ошибка очистки WebRTC: ${error.message}`, 'error'); + } + } + async handleWebRTCOffer(data) { try { - await this.localConnection.setRemoteDescription(data.offer); - const answer = await this.localConnection.createAnswer(); - await this.localConnection.setLocalDescription(answer); + console.log('Received WebRTC offer:', data); - this.socket.emit('webrtc:answer', { - sessionId: data.sessionId, - answer: answer - }); + // Проверяем существование localConnection + if (!this.localConnection) { + this.log('WebRTC соединение не инициализировано, создаем новое', 'warning'); + await this.initWebRTC(); + + if (!this.localConnection) { + this.log('Ошибка: не удалось создать WebRTC соединение', 'error'); + return; + } + } + + // Проверяем, не обрабатывается ли уже offer + if (this.isProcessingOffer) { + this.log('Offer уже обрабатывается, пропускаем дубликат', 'warning'); + return; + } + + // Проверяем состояние соединения для избежания ошибки "wrong state" + if (this.localConnection.signalingState !== 'stable' && this.localConnection.signalingState !== 'have-local-offer') { + this.log(`Пропускаем offer, неподходящее состояние: ${this.localConnection.signalingState}`, 'warning'); + return; + } + + // Устанавливаем флаг обработки + this.isProcessingOffer = true; + + // Валидация и нормализация offer + let offer = data.offer; + + // Проверяем, что offer имеет правильную структуру + if (!offer || typeof offer !== 'object') { + throw new Error('Invalid offer: not an object'); + } + + if (!offer.type || !offer.sdp) { + throw new Error('Invalid offer: missing type or sdp'); + } + + // Убеждаемся, что offer имеет правильный формат RTCSessionDescriptionInit + const normalizedOffer = { + type: offer.type, + sdp: offer.sdp + }; + + console.log('Normalized offer:', normalizedOffer); + console.log('Offer SDP содержит видео:', normalizedOffer.sdp.includes('m=video')); + console.log('Offer SDP содержит аудио:', normalizedOffer.sdp.includes('m=audio')); + + await this.localConnection.setRemoteDescription(normalizedOffer); + this.isRemoteDescriptionSet = true; + + // Обрабатываем буферизованные ICE кандидаты + this.log(`Обрабатываем ${this.pendingICECandidates.length} буферизованных ICE кандидатов`, 'info'); + for (const candidateData of this.pendingICECandidates) { + try { + await this.localConnection.addIceCandidate(candidateData); + this.log('Буферизованный ICE candidate добавлен', 'success'); + } catch (error) { + this.log(`Ошибка добавления буферизованного ICE candidate: ${error.message}`, 'error'); + } + } + this.pendingICECandidates = []; // Очищаем буфер + + // Проверяем, что мы еще можем создать answer + if (this.localConnection.signalingState === 'have-remote-offer') { + const answer = await this.localConnection.createAnswer(); + await this.localConnection.setLocalDescription(answer); + + this.socket.emit('webrtc:answer', { + sessionId: data.sessionId, + answer: answer + }); + + this.log('WebRTC offer обработан успешно', 'success'); + } else { + this.log(`Не можем создать answer, состояние: ${this.localConnection.signalingState}`, 'warning'); + } } catch (error) { this.log(`Ошибка обработки WebRTC offer: ${error.message}`, 'error'); + console.error('WebRTC offer error details:', error, 'Received data:', data); + } finally { + // Сбрасываем флаг обработки + this.isProcessingOffer = false; } } async handleWebRTCAnswer(data) { try { - await this.localConnection.setRemoteDescription(data.answer); + console.log('Received WebRTC answer:', data); + + // Валидация и нормализация answer + let answer = data.answer; + + // Проверяем, что answer имеет правильную структуру + if (!answer || typeof answer !== 'object') { + throw new Error('Invalid answer: not an object'); + } + + if (!answer.type || !answer.sdp) { + throw new Error('Invalid answer: missing type or sdp'); + } + + // Убеждаемся, что answer имеет правильный формат RTCSessionDescriptionInit + const normalizedAnswer = { + type: answer.type, + sdp: answer.sdp + }; + + console.log('Normalized answer:', normalizedAnswer); + + await this.localConnection.setRemoteDescription(normalizedAnswer); + this.log('WebRTC answer обработан успешно', 'success'); } catch (error) { this.log(`Ошибка обработки WebRTC answer: ${error.message}`, 'error'); } @@ -1028,9 +2541,54 @@ class GodEyeOperator { async handleICECandidate(data) { try { - await this.localConnection.addIceCandidate(data.candidate); + console.log('Received ICE candidate:', data); + + // Валидация и нормализация ICE candidate + let candidate = data.candidate; + + // Проверяем, что candidate имеет правильную структуру + if (!candidate) { + // Null candidate означает конец ICE gathering + if (this.isRemoteDescriptionSet) { + await this.localConnection.addIceCandidate(null); + this.log('ICE gathering завершен', 'info'); + } else { + this.log('ICE gathering завершен (буферизован)', 'info'); + this.pendingICECandidates.push(null); + } + return; + } + + if (typeof candidate !== 'object') { + throw new Error('Invalid candidate: not an object'); + } + + if (!candidate.candidate || candidate.sdpMLineIndex === undefined) { + throw new Error('Invalid candidate: missing candidate or sdpMLineIndex'); + } + + // Убеждаемся, что candidate имеет правильный формат RTCIceCandidateInit + const normalizedCandidate = { + candidate: candidate.candidate, + sdpMLineIndex: candidate.sdpMLineIndex, + sdpMid: candidate.sdpMid || null + }; + + console.log('Normalized ICE candidate:', normalizedCandidate); + + // Если remote description еще не установлен, буферизуем candidate + if (!this.isRemoteDescriptionSet) { + this.pendingICECandidates.push(normalizedCandidate); + this.log(`ICE candidate буферизован (всего: ${this.pendingICECandidates.length})`, 'info'); + return; + } + + // Иначе добавляем candidate немедленно + await this.localConnection.addIceCandidate(normalizedCandidate); + this.log('ICE candidate добавлен успешно', 'success'); } catch (error) { this.log(`Ошибка добавления ICE candidate: ${error.message}`, 'error'); + console.error('ICE candidate error details:', error, 'Received data:', data); } } @@ -1312,35 +2870,6 @@ class GodEyeOperator { } } - startPingMonitoring() { - if (this.pingInterval) { - clearInterval(this.pingInterval); - } - - this.pingInterval = setInterval(() => { - if (this.socket && this.socket.connected) { - const startTime = Date.now(); - this.socket.emit('ping', startTime); - - // Timeout после 5 секунд - setTimeout(() => { - if (this.elements.pingIndicator.textContent === 'Ping: ...') { - this.elements.pingIndicator.textContent = 'Ping: Timeout'; - this.elements.pingIndicator.style.color = '#f44336'; - } - }, 5000); - } - }, 10000); // Каждые 10 секунд - } - - stopPingMonitoring() { - if (this.pingInterval) { - clearInterval(this.pingInterval); - this.pingInterval = null; - } - this.elements.pingIndicator.textContent = 'Ping: --'; - this.elements.pingIndicator.style.color = '#ccc'; - } } // Initialize application when DOM is loaded diff --git a/desktop-operator/src/renderer/index.html b/desktop-operator/src/renderer/index.html index 2aa9d76..dc277ed 100644 --- a/desktop-operator/src/renderer/index.html +++ b/desktop-operator/src/renderer/index.html @@ -11,11 +11,101 @@
-
- ● Отключен - + +
+ +
+ Не подключен + Ping: -- +
+ + + + + +
+ + +
+ +
+ + +
+ + +
+ +
+ + +
+
Расширенные настройки
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +
+ + +
+ +
+
+
+ + +
@@ -99,69 +189,104 @@
- -
-
-

🔌 Подключение к серверу

- -
- + - +