import type { AppData, MediaKind, ProducerCodecOptions, RtpCapabilities, RtpEncodingParameters, RtpParameters, RtpCodecCapability } from 'mediasoup-client/lib/types'; import type { Consumer, ConsumerOptions } from 'mediasoup-client/lib/Consumer'; import type { ConnectionState, DtlsRole } from 'mediasoup-client/lib/Transport'; import type { types } from 'mediasoup-client'; export interface ProduceParams { kind: MediaKind; rtpParameters: RtpParameters; appData: Record; } export interface TrackProduceParams { encodings?: RtpEncodingParameters[]; codecOptions?: ProducerCodecOptions; preferredCodec?: string; transformParams?: TrackTransformParams; keyFrameRequestDelay?: number; } export interface PrepareProducerEncodingsParams { encodings: RtpEncodingParameters[]; codec?: RtpCodecCapability; maxSpatialLayer: number; } export interface TrackTransformParams { width?: number; height?: number; } export interface ProducerData { id: string; kind: MediaKind; peerId: string; label: TrackLabel; paused: boolean; encodings: RtpEncodingParameters[]; maxSpatialLayer: number; trackTransformParams?: TrackTransformParams; } export interface ConsumerData { producerData: ProducerData; peerId: string; appId: string; channelId: string; } /** * Роль участника в канале. * * `host` — может публиковать медиатреки (камера, микрофон, экран). * `audience` — только потребляет медиа, публикация недоступна по умолчанию. * Роль определяется сервером на основе переданного signaling-токена. */ export type Role = 'audience' | 'host'; export interface PeerResponse { id: string; channelIds: string[]; groups: PeerGroup[]; producePermissions: TrackLabel[]; appId: string; producers: ProducerData[]; uid?: string; appData: Record; role: Role; loginDate: Date; } /** * Список доступных на устройстве камер и микрофонов. * * Обычно возвращается после `client.detectDevices()` и используется для построения UI выбора устройств. */ export interface AvailableMediaDevices { /** Найденные видеоустройства, доступные браузеру или приложению. */ video: MediaDeviceInfo[]; /** Найденные аудиоустройства, доступные браузеру или приложению. */ audio: MediaDeviceInfo[]; } /** * Параметры подключения к каналу. * * Это основной payload для входа в звонок: он связывает канал, токен доступа, * роль участника и пользовательские метаданные сессии. */ export interface JoinChannelParams { /** * Signaling-токен участника, выпущенный Moodhood API. * Кодирует идентификатор канала, роль и срок действия сессии. * Срок действия токена — 24 часа. */ token: string; /** Пользовательские данные участника, которые будут доступны другим клиентам канала. Максимум 1 КБ. */ appData?: Record; /** * Включает P2P-режим для звонков один-на-один. * Используйте, если в канале заведомо будет не более двух участников — * это позволяет серверу оптимально распределить ресурсы. */ isP2pCall?: boolean; preferredDC?: string; } /** * Произвольное серверное событие канала, которое приложение может обработать в своей бизнес-логике. */ export interface ChannelEvent { /** Имя события, отправленное серверной стороной. */ eventName: string; /** Payload события в свободной JSON-подобной форме. */ data: Record; } export interface PreferredLayersParams { spatialLayer: number; temporalLayer?: number; } export interface ChangePreferredLayersParams { consumerId: string; peerId: string; spatialLayer: number; temporalLayer: number; } /** * Базовый набор настроек энкодера для локального трека. */ export type EncoderConfig = object; export type VideoCodec = 'h264' | 'vp8' | 'vp9'; export type AudioCodec = 'opus'; /** * Настройки кодирования для локального видеотрека. */ export type VideoEncoderConfig = EncoderConfig & { /** Предпочтительный видеокодек, если приложение хочет сузить выбор браузера. */ preferredCodec?: VideoCodec; /** Явная конфигурация simulcast/SVC-слоёв и bitrate-параметров. */ encodings?: RtpEncodingParameters[]; /** Стартовый bitrate для Google-энкодеров, если нужно ускорить выход на целевое качество. */ videoGoogleStartBitrate?: number; }; /** * Настройки кодирования для локального аудиотрека. */ export type AudioEncoderConfig = EncoderConfig & { /** Предпочтительный аудиокодек. */ preferredCodec?: AudioCodec; /** Явная конфигурация encodings, если приложение хочет управлять параметрами транспорта. */ encodings?: RtpEncodingParameters[]; /** Включает FEC для лучшей устойчивости аудио к потерям пакетов. */ enableFec?: boolean; /** Включает DTX, чтобы экономить полосу в моменты тишины. */ enableDtx?: boolean; }; export interface CreateTrackOptions { /** Если `true`, исходный `MediaStreamTrack` будет остановлен при паузе или закрытии публикации. */ stopTrackOnPause?: boolean; } export type BaseVideoTrackOptions = CreateTrackOptions & { video?: boolean | MediaTrackConstraints; }; export type BaseAudioTrackOptions = CreateTrackOptions & { audio?: boolean | MediaTrackConstraints; }; /** * Параметры создания локального видеотрека с камеры. */ export type CreateCameraVideoTrackOptions = BaseVideoTrackOptions & { encoderConfig?: VideoEncoderConfig; /** Включает поддержку видеоэффектов для создаваемого трека. */ effects?: boolean; /** Создаёт preview-вариант трека, если приложению нужно локальное превью без основной публикации. */ isPreview?: boolean; }; /** * Параметры создания локального аудиотрека с микрофона. */ export type CreateMicrophoneAudioTrackOptions = BaseAudioTrackOptions & { encoderConfig?: AudioEncoderConfig; /** Включает шумоподавление для создаваемого микрофонного трека. */ noiseSuppression?: boolean; /** Создаёт preview-вариант трека для локального мониторинга. */ isPreview?: boolean; }; /** * Параметры создания треков для демонстрации экрана. */ export type CreateScreenMediaOptions = BaseVideoTrackOptions & BaseAudioTrackOptions & { /** Настройки кодирования видеопотока экрана. */ videoEncoderConfig?: VideoEncoderConfig; /** Настройки кодирования системного или захваченного аудио. */ audioEncoderConfig?: AudioEncoderConfig; }; /** * Параметры регистрации уже существующего видеотрека в SDK. */ export type CreateCustomVideoOptions = BaseVideoTrackOptions & { videoEncoderConfig?: VideoEncoderConfig; /** Видеотрек, созданный приложением вне SDK. */ videoTrack: MediaStreamTrack; }; /** * Параметры регистрации уже существующего аудиотрека в SDK. */ export type CreateCustomAudioOptions = BaseAudioTrackOptions & { audioEncoderConfig?: AudioEncoderConfig; /** Аудиотрек, созданный приложением вне SDK. */ audioTrack: MediaStreamTrack; }; /** * Логические метки треков, которыми SDK помечает разные источники медиа. */ export declare enum TrackLabel { /** Основной видеотрек с камеры. */ Camera = "camera", /** Локальный preview-трек камеры. */ CameraPreview = "camera-preview", /** Основной аудиотрек с микрофона. */ Microphone = "microphone", /** Локальный preview-трек микрофона. */ MicrophonePreview = "microphone-preview", /** Видеотрек демонстрации экрана. */ ScreenVideo = "screen-video", /** Аудиотрек демонстрации экрана или системного звука. */ ScreenAudio = "screen-audio", /** Пользовательский видеотрек, переданный в SDK приложением. */ CustomVideo = "custom-video", /** Пользовательский аудиотрек, переданный в SDK приложением. */ CustomAudio = "custom-audio", /** Резервная метка для нераспознанного типа трека. */ Unknown = "unknown" } /** * Событие о публикации медиа участником. */ export interface PayloadOfPublishedMedia { producerId: string; kind: MediaKind; /** Логическая метка трека, по которой удобно различать камеру, микрофон или screen share. */ label: TrackLabel; /** Показывает, опубликован ли трек в paused-состоянии. */ paused: boolean; } /** * Payload события о принудительном закрытии локального трека. */ export interface TrackForceClosedPayload { /** Метка трека, который сервер или SDK принудительно остановил. */ label: TrackLabel; } /** * Параметры подписки на удалённый producer участника. */ export interface SubscribeOptions { producerId: string; /** Если `true`, трек будет создан в muted-состоянии и его можно будет размьютить позже. */ muted?: boolean; } /** * Событие о прекращении публикации ранее опубликованного медиа. */ export type PayloadOfUnpublishedMedia = PayloadOfPublishedMedia; export type ChangePreferredLayersPayload = PreferredLayersParams & { consumerId: string; spatialLayer: number; temporalLayer: number; }; export interface CreateVideoTrackParams { videoTrackOptions: boolean | MediaTrackConstraints; encoderConfig: VideoEncoderConfig; } export type SpatialLayerParams = RtpEncodingParameters & TransformParams; export interface ProducerRequestMaxSpatialLayer { producerId: string; spatialLayer: number; } export type ProducerSetMaxSpatialLayer = ProducerRequestMaxSpatialLayer & { peerId: string; }; export interface TransformParams { width?: number; height?: number; } export type RemoteConsumerOptions = ConsumerOptions & { producerPaused: boolean; }; export type LogMessageHandler = (msg: string, ...meta: any) => void; export type LogLevel = 3 | 4 | 6 | 7; export type LogLevelStr = 'error' | 'warn' | 'info' | 'debug'; export interface Logger { debug: (msg: string, ...meta: Record[]) => void; info: (msg: string, ...meta: Record[]) => void; warn: (msg: string, ...meta: Record[]) => void; error: (msg: string, ...meta: Record[]) => void; } export interface TransportConnectionTimeoutPayload { reason: 'ice' | 'dtls'; transportId: string; direction: 'receive' | 'send'; timeout: number; } export type ExtendedRTCInboundRtpStreamStats = RTCInboundRtpStreamStats & { decoderImplementation?: string; }; /** * Состояние send и receive transport'ов клиента в удобной для диагностики форме. */ export interface TransportsStateInfo { /** Состояние входящего transport'а, через который клиент получает медиа. */ receive?: TransportStateInfo; /** Состояние исходящего transport'а, через который клиент публикует медиа. */ send?: TransportStateInfo; } export interface TransportStateInfo { dtlsState: ConnectionState; iceState: ConnectionState; dtlsRole: DtlsRole; iceRole: string; selectedCandidatePairChanges: number; tlsVersion: string; localCandidateState: ICECandidateState; remoteCandidateState: ICECandidateState; } export interface ICECandidateState { ip: string; address: string; port: number; protocol: RTCIceProtocol; candidateType: RTCIceCandidateType; } export interface CreateConsumerPayload { producerId: string; rtpCapabilities: RtpCapabilities; producerPeerId: string; } export interface CreateDataConsumerPayload { producerId: string; appId?: string; channelId?: string; ordered?: boolean; transport: types.Transport; } export interface CreateConsumerResponse { consumer: Consumer; isProducerPaused: boolean; } /** * Типовые ошибки доступа к медиаустройствам. */ export declare enum DeviceErrors { /** Браузер не нашёл запрошенное устройство. */ NotFoundError = "NotFoundError", /** На устройстве не найдено ни одной подходящей камеры или микрофона. */ NoDevices = "NoDevices", /** Устройство занято другим приложением или вкладкой. */ DeviceIsBusy = "DeviceIsBusy", /** Пользователь или браузер запретил доступ к устройству. */ NotAllowedError = "NotAllowedError", /** Неизвестная ошибка при запросе списка устройств. */ RequestDevicesUnknownError = "RequestDevicesUnknownError" } /** * Статистика входящего удалённого трека, полезная для диагностики подписки и качества приёма. */ export interface TrackInboundStats { consumerId: string; codec?: RTCRtpCodecParameters; /** Текущий spatial layer, который реально получает клиент. */ currentSpatialLayerParams?: SpatialLayerParams; /** Слои, которые доступны для данного видеотрека на стороне отправителя. */ availableSpatialLayers?: SpatialLayerParams[]; /** Слой, который приложение или SDK запрашивает у сервера в данный момент. */ requestedSpatialLayer?: number; dtlsState?: RTCDtlsTransportState; /** Нативная WebRTC-статистика входящего RTP-потока. */ rtcStats?: ExtendedRTCInboundRtpStreamStats; } /** * Статистика исходящего локального трека, полезная для диагностики публикации. */ export interface TrackOutboundStats { producerId?: string; codec?: RTCRtpCodecParameters; dtlsState?: RTCDtlsTransportState; /** Нативная WebRTC-статистика исходящего RTP-потока. */ rtcStats?: RTCOutboundRtpStreamStats; } export interface PeerTrackInfo { trackId: string; readyState: MediaStreamTrackState; isRemote: boolean; kind: MediaKind; label: TrackLabel; paused: boolean; width?: number; height?: number; frameRate?: number; aspectRatio?: number; trackInboundStats?: TrackInboundStats; trackOutboundStats?: TrackOutboundStats; } /** * Краткая информация о локальном треке в удобном для UI и диагностики виде. */ export interface BaseTrackInfo { trackId: string; readyState: MediaStreamTrackState; kind: MediaKind; label: TrackLabel; paused: boolean; width?: number; height?: number; frameRate?: number; aspectRatio?: number; /** При наличии содержит техническую статистику опубликованного трека. */ trackOutboundStats?: TrackOutboundStats; } /** * Сводная информация об участнике канала и его активных треках. */ export interface PeerInfo { id: string; /** Пользовательские данные участника, которые приложение сохранило в `appData`. */ appData: Record; role: Role; channelIds: string[]; appId: string; uid?: string; loginDate: Date; /** Текущие удалённые треки участника со статикой по каждому из них. */ tracks: PeerTrackInfo[]; } export interface UpdatePeerAppDataPayload { peerId: string; appData: Record; } export interface CreateTracksPayload { mediaStreamTracks: MediaStreamTrack[]; constraints: MediaStreamConstraints; } export interface ChangeProducerStatePayload { peerId: string; producerId: string; } export interface ForceCloseProducerPayload { peerId: string; label: TrackLabel; } /** * Payload события, которым сервер просит подтвердить активность участника в канале. */ export interface ActivityConfirmationRequiredPayload { channelId: string; /** Временное значение из серверного события, которое можно использовать для UI таймера или дедлайна подтверждения. */ time: number; } export interface PeerShortData { id: string; producers: Array<{ id: string; paused: boolean; }>; appData?: Record; } export type PeerSyncData = Omit & { appData?: string; }; export type TransportAppData = AppData; /** * Группа участника, которую приложение может использовать для прав и UI-ролей. */ export type PeerGroup = 'moderator' | 'user'; /** * Строковое представление пользовательских меток треков, применяемое в правах и сетевых payload'ах. */ export type TrackLabelString = 'camera' | 'microphone' | 'screen-video' | 'screen-audio' | 'custom-video' | 'custom-audio';