import 'reflect-metadata'; import type { ClientMetaPayload } from './ClientMetaProvider'; import type Peer from './engine/Peer'; import type { TransportsWebRTCStats } from './engine/WebRTCStats/types'; import EnhancedEventEmitter from './EnhancedEventEmitter'; import type { ClientParams } from './types/client'; import type { AvailableMediaDevices, CreateCameraVideoTrackOptions, CreateCustomAudioOptions, CreateCustomVideoOptions, CreateMicrophoneAudioTrackOptions, CreateScreenMediaOptions, JoinChannelParams, Role, TransportsStateInfo } from './types/common'; import type { ClientObserverEvents } from './types/engine'; import type { AudioTrack, Track, VideoTrack } from './types/media'; import type { IceTransportPolicy } from './types/network'; import type { ScoresCalculator } from './qoe/ScoresCalculator'; /** * Основная точка входа в SDK LiveDigital. * * Экземпляр `Client` отвечает за подключение к каналу, управление локальными * треками, получение удалённых участников и подписку на пользовательские события. * * @example * ```ts * import Client from '@livedigital/client'; * * const client = new Client({ * signalingServerUrl: 'https://signaling.livedigital.space', * }); * * // Подписки — до join(), чтобы не пропустить события * client.observer.on('peer-joined', (peer) => { * peer.observer.on('media-published', async ({ producerId }) => { * await peer.subscribe({ producerId }); * }); * }); * * client.observer.on('channel-state-synced', async () => { * // Состояние канала синхронизировано — можно работать с участниками * }); * * await client.join({ token: 'signaling-token' }); * client.requestChannelStateSync(); * * const cameraTrack = await client.createCameraVideoTrack(); * await cameraTrack.publish(); * ``` */ declare class Client { #private; private readonly clientEventEmitter; readonly canUseNoiseSuppression = true; constructor(params: ClientParams); /** * Метаданные текущей сессии, полезные для аналитики, логирования и диагностики. * @group Метаданные */ get meta(): ClientMetaPayload; /** * Набор пользовательских событий SDK, на которые приложение может подписываться. * @group События */ get observer(): EnhancedEventEmitter; /** * Идентификатор текущего участника после успешного подключения к каналу. * @group Подключение */ get id(): string | undefined; /** * Список участников, известных клиенту в текущем канале. * * @remarks Список актуален только после получения события `channel-state-synced`. * До этого момента массив может быть неполным или пустым. * @group Подключение */ get peers(): Peer[]; /** * Список видеоустройств, обнаруженных после последнего вызова `detectDevices()`. * @group Устройства */ get availableVideoDevices(): MediaDeviceInfo[]; /** * Список аудиоустройств, обнаруженных после последнего вызова `detectDevices()`. * @group Устройства */ get availableAudioDevices(): MediaDeviceInfo[]; /** * Показывает, был ли успешно подготовлен движок видеоэффектов. * @group Медиа */ get effectsSDKInitialized(): boolean; /** * Экземпляр калькулятора качества, который можно использовать в собственных метриках UI. * @group Диагностика */ get scoresCalculator(): ScoresCalculator; /** * Обнаруживает доступные устройства ввода и обновляет внутренний список камер и микрофонов. * * @param force Принудительно запрашивает повторное определение устройств, даже если список уже известен. * @group Устройства * @example * ```ts * const { video, audio } = await client.detectDevices(); * // video и audio — массивы MediaDeviceInfo * const camera = video[0]; * const mic = audio.find(d => d.label.includes('встроенный')); * ``` */ detectDevices(force?: boolean): Promise; /** * Предварительно инициализирует SDK видеоэффектов. * * Полезно вызывать заранее, если приложение хочет уменьшить задержку перед * первым включением background blur или виртуального фона. * @group Медиа */ initEffectsSDK(): Promise; /** * Подключает клиента к каналу. * * Канал и роль участника определяются сервером на основе переданного `token`. * После успешного завершения необходимо вызвать `requestChannelStateSync()`, * чтобы получить актуальное состояние канала через событие `channel-state-synced`. * @group Подключение * @example * ```ts * client.observer.on('channel-state-synced', () => { * // Только здесь client.peers содержит актуальный список участников * console.log('Участников в канале:', client.peers.length); * }); * * await client.join({ token: signalingToken }); * client.requestChannelStateSync(); // обязательно после join * ``` */ join(params: JoinChannelParams): Promise; /** * Выходит из канала. * * @param keepTracks Если `true`, локальные треки не будут автоматически уничтожены после выхода. * @group Подключение */ leave(keepTracks?: boolean): Promise; /** * Подтверждает активность в ответ на событие `channel-activity-confirmation-required`. * * Событие рассылается **всем участникам канала** одновременно. Если хотя бы один из них * вызовет `confirmActivity()` до истечения таймаута, канал продолжит работу и все участники * получат `channel-activity-confirmation-acquired`. * Если никто не ответит — канал закрывается целиком и все участники получают * `channel-activity-confirmation-expired`. * @group Подключение */ confirmActivity(): Promise; /** * Создаёт локальный видеотрек с камеры, готовый к публикации в канале. * @group Медиа * @example * ```ts * const track = await client.createCameraVideoTrack({ deviceId: camera.deviceId }); * await track.publish(); * * // Включить background blur после публикации * await track.enableEffects(); * await track.applyEffects({ blur: 0.7 }); * ``` */ createCameraVideoTrack(options?: CreateCameraVideoTrackOptions): Promise; /** * Создаёт локальный аудиотрек с микрофона, при необходимости сразу с шумоподавлением. * @group Медиа * @example * ```ts * const track = await client.createMicrophoneAudioTrack({ * deviceId: mic.deviceId, * noiseSuppression: true, // включить шумоподавление сразу * }); * await track.publish(); * ``` */ createMicrophoneAudioTrack(options?: CreateMicrophoneAudioTrackOptions): Promise; /** * Создаёт набор треков для демонстрации экрана и, при наличии, системного аудио. * @group Медиа */ createScreenMediaTracks(options?: CreateScreenMediaOptions): Promise; /** * Регистрирует в SDK уже созданный приложением аудиотрек, чтобы им можно было управлять и публиковать его. * @group Медиа */ createCustomAudioTrack(options: CreateCustomAudioOptions): Track; /** * Регистрирует в SDK уже созданный приложением видеотрек, чтобы им можно было управлять и публиковать его. * @group Медиа */ createCustomVideoTrack(options: CreateCustomVideoOptions): Track; /** * Удаляет локальный трек из жизненного цикла SDK и освобождает связанные ресурсы. * @group Медиа */ deleteTrack(track: Track): Promise; /** * @deprecated Используйте `requestChannelStateSync()` вместо этого метода. * @group Подключение * `loadPeers` не является потокобезопасным и допускает состояние гонки между * двумя последовательными вызовами. `requestChannelStateSync()` гарантирует * атомарное получение состояния канала через событие `channel-state-synced`. */ loadPeers(role?: Role): Promise; /** * Запрашивает синхронизацию состояния канала с сервером. * * Должен быть вызван сразу после `join()`. Когда синхронизация завершится, * придёт событие `channel-state-synced` — только после него `client.peers` * содержит актуальный список участников и их медиапотоков. * @group Подключение */ requestChannelStateSync(): void; /** * Обновляет пользовательские `appData` текущего участника, чтобы другие клиенты получили новый payload. * Максимальный размер `appData` — 1 KB. Заменяет объект целиком, не мерджит с предыдущим. * @group Метаданные * @example * ```ts * await client.updateAppData({ role: 'presenter', handRaised: true }); * // Другие участники получат это через peer.appData * ``` */ updateAppData(appData: Record): Promise; /** * Возвращает текущее состояние receive/send transport'ов для отладки сетевых проблем. * @group Диагностика */ getTransportsInfo(): Promise; /** * Включает или отключает предпочтение relay-маршрутов для WebRTC-транспортов. * @group Диагностика */ setPreferRelay(value: boolean): void; /** * Показывает, включено ли сейчас предпочтение relay-маршрутов. * @group Диагностика */ getPreferRelay(): boolean; /** * Меняет ICE transport policy для активных транспортов клиента. * * Это полезно для диагностики сетевых сценариев, например когда нужно * принудительно использовать relay-соединение. * @group Диагностика */ changeIceTransportPolicy(policy: IceTransportPolicy): Promise; /** * Принудительно перезапускает ICE на активных транспортных соединениях клиента. * @group Диагностика */ restartIce(): Promise; /** * Возвращает агрегированную транспортную статистику WebRTC для мониторинга качества соединения. * @group Диагностика */ transportsStats(): TransportsWebRTCStats | undefined; /** * Переопределяет адрес signaling-сервера для последующих подключений или переподключения. * @group Диагностика */ setSignalingServerUrl(url: string): void; /** * Добавляет пользовательские метаданные, которые будут включаться в diagnostics и аналитику SDK. * @group Метаданные */ setMeta(meta: Record): void; } export default Client; export { Client };