Files
god_eye/docs/CONNECTION_MANAGER.md
2025-10-04 11:55:55 +09:00

9.5 KiB
Raw Blame History

ConnectionManager API Документация

Обзор

ConnectionManager - это центральный компонент системы GodEye Signal Center, который управляет полным жизненным циклом подключений между операторами и Android устройствами. Он обеспечивает надежное создание, управление и завершение подключений с таймаутами и валидацией.

Архитектура

Desktop Operator ←→ ConnectionManager ←→ Android Device
                         ↕
                  SessionManager
                  DeviceManager

Основные компоненты:

  • ConnectionManager: Управление подключениями и их жизненным циклом
  • DeviceManager: Управление устройствами и операторами
  • SessionManager: Управление WebRTC сессиями
  • Socket.IO: Транспорт для событий подключения

События WebSocket

Новые события ConnectionManager

connection:initiated

Подключение инициировано ConnectionManager

{
  connectionId: "conn_uuid",
  sessionId: "session_uuid", 
  deviceId: "device_id",
  cameraType: "back",
  status: "pending",
  createdAt: "2023-..."
}

connection:accepted

Устройство приняло запрос подключения

{
  connectionId: "conn_uuid",
  sessionId: "session_uuid",
  deviceId: "device_id", 
  cameraType: "back",
  streamUrl: "webrtc_stream_url",
  status: "active"
}

connection:rejected

Устройство отклонило запрос подключения

{
  sessionId: "session_uuid",
  deviceId: "device_id",
  cameraType: "back", 
  error: "Device camera is busy"
}

connection:terminated

Подключение завершено

{
  connectionId: "conn_uuid",
  timestamp: "2023-..."
}

connection:error

Ошибка подключения

{
  error: "Error message"
}

Команды от клиента

connection:terminate

Завершить подключение

{
  connectionId: "conn_uuid"
}

connection:status

Запросить статистику подключений

{} // Ответ в callback или connection:status_response

connection:list

Список подключений оператора

{} // Ответ в callback или connection:list_response

Desktop Operator API

Новые методы

terminateConnection(connectionId, sessionId)

Завершает подключение через ConnectionManager

operator.terminateConnection('conn_123', 'session_456');

getConnectionStatus()

Получает статистику всех подключений системы

operator.getConnectionStatus();

listMyConnections()

Получает список подключений текущего оператора

operator.listMyConnections();

Обновленные методы

requestCamera(deviceId, cameraType)

Теперь использует ConnectionManager для создания подключений

operator.requestCamera('device_123', 'back');

Backend ConnectionManager API

Основные методы

async initiateConnection(operatorId, deviceId, cameraType)

Инициирует новое подключение между оператором и устройством

const connection = await connectionManager.initiateConnection(
  'operator_123', 
  'device_456', 
  'back'
);

async acceptConnection(sessionId, metadata)

Принимает подключение со стороны устройства

const connection = await connectionManager.acceptConnection(
  'session_123',
  { streamUrl: 'webrtc://...' }
);

async rejectConnection(sessionId, reason)

Отклоняет подключение

await connectionManager.rejectConnection(
  'session_123',
  'Camera is busy'
);

async terminateConnection(connectionId)

Завершает активное подключение

await connectionManager.terminateConnection('conn_123');

Утилиты

getConnection(sessionId)

Получает подключение по ID сессии

const connection = connectionManager.getConnection('session_123');

getConnectionStats()

Получает статистику всех подключений

const stats = connectionManager.getConnectionStats();
// { total: 5, active: 2, pending: 1, completed: 2 }

getOperatorConnections(operatorId)

Получает все подключения оператора

const connections = connectionManager.getOperatorConnections('operator_123');

cleanup*()

Методы очистки подключений при отключении участников

connectionManager.cleanupDeviceConnections('device_123');
connectionManager.cleanupOperatorConnections('operator_456');

Жизненный цикл подключения

1. Инициирование подключения

Desktop Operator → camera:request → ConnectionManager.initiateConnection()
                                 ↓
                              Создание Connection объекта
                                 ↓  
                              Отправка camera:request → Android Device
                                 ↓
Desktop Operator ← connection:initiated ← ConnectionManager

2. Ответ устройства

Android Device → camera:response → ConnectionManager.acceptConnection()
                                 ↓
                              Обновление Connection статуса
                                 ↓
Desktop Operator ← connection:accepted ← ConnectionManager
                                 ↓
                              Инициирование WebRTC

3. Завершение подключения

Desktop Operator → connection:terminate → ConnectionManager.terminateConnection()
                                        ↓
                                     Очистка ресурсов
                                        ↓  
                  connection:terminated ← ConnectionManager

Конфигурация таймаутов

// В ConnectionManager.js
CONNECTION_TIMEOUT: 30000,  // 30 секунд на установку подключения
CLEANUP_INTERVAL: 60000     // Очистка каждую минуту

Обратная совместимость

Система поддерживает старые события для совместимости:

  • session:createdconnection:initiated
  • session:acceptedconnection:accepted
  • session:rejectedconnection:rejected
  • camera:response (продолжает работать)

Логирование

ConnectionManager использует Winston logger для отслеживания:

  • Успешные подключения
  • Ошибки и отклонения
  • 🔄 Переходы состояний
  • Таймауты подключений
  • 🧹 Операции очистки

Примеры использования

Полный цикл подключения от Desktop Operator

// 1. Инициирование подключения
operator.requestCamera('device_123', 'back');

// 2. Обработка ответа
operator.socket.on('connection:accepted', (data) => {
  console.log('Подключение установлено:', data.connectionId);
  // Запускаем WebRTC...
});

// 3. Завершение подключения
operator.terminateConnection(connectionId, sessionId);

Мониторинг подключений

// Получение статистики
operator.getConnectionStatus();

// Список моих подключений  
operator.listMyConnections();

// Обработка ошибок
operator.socket.on('connection:error', (data) => {
  console.error('Ошибка подключения:', data.error);
});

Миграция с старой системы

Старые методы продолжают работать, но рекомендуется переход на новые:

Было:

operator.socket.on('session:created', ...);
operator.socket.on('session:accepted', ...);

Стало:

operator.socket.on('connection:initiated', ...);
operator.socket.on('connection:accepted', ...);

UI обновления

  • Кнопки завершения сессий теперь используют terminateConnection()
  • Статус подключений отображается с connectionId
  • Добавлены индикаторы состояния подключений

Для дополнительной информации см. исходный код:

  • /backend/src/managers/ConnectionManager.js
  • /backend/src/server.js (обработчики событий)
  • /desktop-operator/src/renderer/app.js (клиентские методы)