import type { IssueDetectorResult, NetworkScores, StatsReportItem } from 'webrtc-issue-detector'; import type { CLIENT_EVENTS, INTERNAL_CLIENT_EVENTS } from '../constants/events'; import type { InconsistencyType } from '../engine/handlers/ChannelStateSyncEventHandler/types'; import type Peer from '../engine/Peer'; import type { ActivityConfirmationRequiredPayload, AvailableMediaDevices, ChannelEvent, LogLevel, LogMessageHandler, PeerGroup, Role, TrackLabel } from './common'; import type { BaseTrack, InitEffectsSDKParams, Track } from './media'; /** * Обработчик диагностических проблем, найденных в WebRTC-статистике. * * Подходит для логирования и собственной аналитики качества звонка. */ export type IssuesHandler = (issues: IssueDetectorResult) => void; export type StatsHandler = (stats: StatsReportItem[]) => void; /** * Обработчик обновления агрегированных сетевых оценок качества. */ export type NetworkScoresUpdatedHandler = (networkScores: NetworkScores) => void; export interface CreateIssueDetectorParams { disableWid: boolean; onIssues?: IssuesHandler; onNetworkScoresUpdated?: NetworkScoresUpdatedHandler; ignoreSSRCList?: number[]; } export interface CreateMediaParams { effectsSDKParams?: InitEffectsSDKParams; } export interface CreateMediaStreamTrackManagerParams { logLevel?: LogLevel; onLogMessage?: LogMessageHandler; sendAnalytics: boolean; } export interface ConnectParams { channelId: string; role: Role; token: string; isP2pCall?: boolean; } /** * Payload события о рассинхронизации локального состояния клиента с состоянием канала. */ export interface ChannelStateInconsistentPayload { /** Категория найденной рассинхронизации. */ type: InconsistencyType; /** Идентификатор участника, если проблема относится к конкретному peer. */ peerId?: string; /** Идентификатор producer'а, если проблема связана с опубликованным медиа. */ producerId?: string; /** Идентификатор consumer'а, если проблема относится к подписке на удалённый трек. */ consumerId?: string; } /** * Payload события об изменении набора треков, которые участнику разрешено публиковать. */ export interface ProducePermissionsChangedPayload { /** Обновлённый список разрешённых меток треков. */ labels: TrackLabel[]; } export interface GroupsChangedPayload { groups: PeerGroup[]; } /** * Event map emitted by `client.observer`. */ export interface ClientObserverEvents { /** Пользовательское событие канала, пришедшее с серверной стороны. */ [CLIENT_EVENTS.channelEvent]: [ChannelEvent]; /** Новый участник появился в канале и доступен в списке `client.peers`. */ [CLIENT_EVENTS.peerJoined]: [Peer]; /** Участник покинул канал. */ [CLIENT_EVENTS.peerLeft]: [peerId: string]; /** Сервер просит подтвердить, что участник всё ещё активен в звонке. */ [CLIENT_EVENTS.activityConfirmationRequired]: [ActivityConfirmationRequiredPayload]; [CLIENT_EVENTS.activityConfirmationAcquired]: [ChannelEvent]; [CLIENT_EVENTS.activityConfirmationExpired]: [ChannelEvent]; /** Клиенту требуется переподключиться к каналу, чтобы восстановить рабочее состояние. */ [CLIENT_EVENTS.channelRejoinRequired]: []; [CLIENT_EVENTS.devicesListUpdated]: [AvailableMediaDevices]; /** Один из transport'ов не смог установить соединение в ожидаемое время. */ [CLIENT_EVENTS.transportConnectionTimeout]: [{ reason: 'ice' | 'dtls'; direction: 'receive' | 'send'; }]; /** Локальный трек был принудительно остановлен и больше недоступен для публикации. */ [CLIENT_EVENTS.trackForceClosed]: [{ label: TrackLabel; }]; /** Операция с локальным треком завершилась ошибкой. */ [CLIENT_EVENTS.trackFailed]: [{ label: TrackLabel; }]; [CLIENT_EVENTS.activeSpeakerChanged]: [{ peer?: Peer; }]; /** Клиент временно потерял соединение с инфраструктурой звонка. */ [CLIENT_EVENTS.connectionLost]: []; /** Соединение с инфраструктурой звонка было восстановлено. */ [CLIENT_EVENTS.connectionRestored]: []; [CLIENT_EVENTS.forcedDisconnect]: []; /** Сервер отклонил подключение из-за невалидной или неподходящей авторизации. */ [CLIENT_EVENTS.rejectUnauthorized]: []; /** SDK обнаружил несогласованность состояния канала и локального клиента. */ [CLIENT_EVENTS.channelStateInconsistent]: [ChannelStateInconsistentPayload]; /** Встроенное шумоподавление начало инициализацию. */ [CLIENT_EVENTS.denoiserInitializing]: [boolean]; /** Шумоподавление успешно включено. */ [CLIENT_EVENTS.denoiserEnabled]: [{ type: string; }]; /** Шумоподавление отключено. */ [CLIENT_EVENTS.denoiserDisabled]: [{ type: string; }]; /** SDK переключился на резервный сценарий шумоподавления. */ [CLIENT_EVENTS.denoiserFallback]: []; /** Шумоподавление не удалось включить или поддерживать в рабочем состоянии. */ [CLIENT_EVENTS.denoiserFailed]: [{ cause: string; error?: unknown; }]; /** Видеоэффекты успешно включены для активного видеотрека. */ [CLIENT_EVENTS.effectsEnabled]: []; /** Видеоэффекты отключены. */ [CLIENT_EVENTS.effectsDisabled]: []; /** Операция с видеоэффектами завершилась ошибкой. */ [CLIENT_EVENTS.effectsFailed]: [ { cause: string; operation: 'enable' | 'disable' | 'apply' | 'runtime'; error?: unknown; } ]; [CLIENT_EVENTS.channelStateSynced]: []; } export interface InternalObserverEvents { [INTERNAL_CLIENT_EVENTS.trackProduced]: [Track | BaseTrack]; [INTERNAL_CLIENT_EVENTS.trackUnproduced]: [Track | BaseTrack]; [INTERNAL_CLIENT_EVENTS.trackPaused]: [Track | BaseTrack]; [INTERNAL_CLIENT_EVENTS.trackResumed]: [Track | BaseTrack]; [INTERNAL_CLIENT_EVENTS.trackClosed]: [Track | BaseTrack]; [INTERNAL_CLIENT_EVENTS.trackReopened]: [Track | BaseTrack]; [INTERNAL_CLIENT_EVENTS.trackFailed]: [Track | BaseTrack]; }