UNPKG

@observertc/client-monitor-js

Version:

ObserveRTC Client Integration Javascript Library

329 lines (328 loc) 13.9 kB
import { ClientMonitor } from "./ClientMonitor"; import { CertificateMonitor } from "./monitors/CertificateMonitor"; import { CodecMonitor } from "./monitors/CodecMonitor"; import { DataChannelMonitor } from "./monitors/DataChannelMonitor"; import { IceCandidateMonitor } from "./monitors/IceCandidateMonitor"; import { IceCandidatePairMonitor } from "./monitors/IceCandidatePairMonitor"; import { IceTransportMonitor } from "./monitors/IceTransportMonitor"; import { InboundRtpMonitor } from "./monitors/InboundRtpMonitor"; import { InboundTrackMonitor } from "./monitors/InboundTrackMonitor"; import { MediaPlayoutMonitor } from "./monitors/MediaPlayoutMonitor"; import { MediaSourceMonitor } from "./monitors/MediaSourceMonitor"; import { OutboundRtpMonitor } from "./monitors/OutboundRtpMonitor"; import { OutboundTrackMonitor } from "./monitors/OutboundTrackMonitor"; import { PeerConnectionMonitor } from "./monitors/PeerConnectionMonitor"; import { PeerConnectionTransportMonitor } from "./monitors/PeerConnectionTransportMonitor"; import { RemoteInboundRtpMonitor } from "./monitors/RemoteInboundRtpMonitor"; import { RemoteOutboundRtpMonitor } from "./monitors/RemoteOutboundRtpMonitor"; import { ClientSample } from "./schema/ClientSample"; import { RtcStats } from "./schema/W3cStatsIdentifiers"; import { IcePathEvidence, IcePathTransition, SelectedIcePath } from "./monitors/SelectedIcePath"; import { IceRestartOutcome, IceRestartRecommendedEventPayload as IceRestartRecommendationPayload } from "./detectors/IceConnectivityDetector"; import { SimulcastLayerState } from "./detectors/SimulcastLayerDetector"; import { VideoResolutionChangeDirection } from "./detectors/VideoResolutionChangeDetector"; import { StuckDecoderVariant } from "./detectors/StuckDecoderDetector"; export type ClientIssuePayload = Record<string, unknown> | boolean | string | number; export type AddedClientIssue<T extends ClientIssuePayload = ClientIssuePayload> = { type: string; payload?: T; timestamp: number; }; export type RaisedClientIssue<T extends ClientIssuePayload = ClientIssuePayload> = { key: string; type: string; payload?: T; raisedAt: number; updatedAt: number; }; export type ClientIssue<T extends ClientIssuePayload = ClientIssuePayload> = { [K in keyof (AddedClientIssue<T> & { resolvable: false; })]: (AddedClientIssue<T> & { resolvable: false; })[K]; } | { [K in keyof (RaisedClientIssue<T> & { resolvable: true; })]: (RaisedClientIssue<T> & { resolvable: true; })[K]; }; export type ResolvedClientIssue<T extends ClientIssuePayload = ClientIssuePayload> = RaisedClientIssue<T> & { resolvedAt: number; comment?: string; }; export type UpdatedClientIssue<T extends ClientIssuePayload = ClientIssuePayload> = RaisedClientIssue<T>; export type ClientEvent = { type: string; payload?: Record<string, unknown> | boolean | string | number; timestamp: number; }; export type ClientMetaData = { type: string; payload?: Record<string, unknown> | boolean | string | number; timestamp: number; }; export type ExtensionStat = { type: string; payload?: Record<string, unknown> | boolean | string | number; }; export type ClientMonitorBaseEvent = { clientMonitor: ClientMonitor; }; export type SampleCreatedEventPayload = ClientMonitorBaseEvent & { sample: ClientSample; }; export type StatsCollectedEventPayload = ClientMonitorBaseEvent & { startedAt: number; durationOfCollectingStatsInMs: number; collectedStats: [string, RtcStats[]][]; }; export type CongestionEventPayload = ClientMonitorBaseEvent & { peerConnectionMonitor: PeerConnectionMonitor; availableIncomingBitrate: number; availableOutgoingBitrate: number; maxAvailableIncomingBitrate: number; maxAvailableOutgoingBitrate: number; maxReceivingBitrate: number; maxSendingBitrate: number; }; export type AudioDesyncTrackEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; }; export type SynthesizedAudioEventPayload = ClientMonitorBaseEvent & { mediaPlayoutMonitor: MediaPlayoutMonitor; }; export type FreezedVideoTrackEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; }; export type DryInboundTrackEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; }; export type DryOutboundTrackEventPayload = ClientMonitorBaseEvent & { trackMonitor: OutboundTrackMonitor; }; export type TooLongPcConnectionEstablishmentEventPayload = ClientMonitorBaseEvent & { peerConnectionMonitor: PeerConnectionMonitor; }; export type IceTupleChangedEventPayload = ClientMonitorBaseEvent & { peerConnectionMonitor: PeerConnectionMonitor; }; export type IcePathChangedEventPayload = ClientMonitorBaseEvent & { peerConnectionMonitor: PeerConnectionMonitor; selectedIcePath: SelectedIcePath; transition: IcePathTransition; from?: IcePathEvidence; to: IcePathEvidence; }; export type NewSelectedIcePathEventPayload = ClientMonitorBaseEvent & { peerConnectionMonitor: PeerConnectionMonitor; selectedIcePath: SelectedIcePath; }; export type IceRestartRecommendedEventPayload = ClientMonitorBaseEvent & { peerConnectionMonitor: PeerConnectionMonitor; } & IceRestartRecommendationPayload; export type IceRestartEventPayload = ClientMonitorBaseEvent & { peerConnectionMonitor: PeerConnectionMonitor; transportId: string; iceGeneration: number; outcome: IceRestartOutcome; }; export type InboundVideoPlayoutDiscrepancyEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; }; export type AudioConcealmentEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; concealmentRate: number; concealmentEventRate: number; }; export type AudioJitterBufferStressEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; targetDelayInMs: number; timeStretchRate: number; }; export type VideoDecoderOverloadedEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; decodeTimePerFrameInMs?: number; frameBudgetInMs?: number; }; export type KeyframeStormEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; pliRate: number; }; export type VideoRecoveryFailedEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; pliCountSinceStalled: number; stalledForInMs: number; }; export type CaptureBottleneckEventPayload = ClientMonitorBaseEvent & { trackMonitor: OutboundTrackMonitor; sourceFps?: number; expectedFps?: number; }; export type EncoderBottleneckEventPayload = ClientMonitorBaseEvent & { trackMonitor: OutboundTrackMonitor; sourceFps?: number; encodedFps?: number; }; export type CaptureTrackEndedEventPayload = ClientMonitorBaseEvent & { trackMonitor: OutboundTrackMonitor; }; export type CaptureTrackMutedEventPayload = ClientMonitorBaseEvent & { trackMonitor: OutboundTrackMonitor; }; export type SilentAudioSourceEventPayload = ClientMonitorBaseEvent & { trackMonitor: OutboundTrackMonitor; silentForInMs: number; }; export type SimulcastLayerChangedEventPayload = ClientMonitorBaseEvent & { trackMonitor: OutboundTrackMonitor; activeLayerIds: string[]; previousActiveLayerIds: string[]; layers: SimulcastLayerState[]; }; export type CodecChangedEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor | OutboundTrackMonitor; from: { mimeType: string; sdpFmtpLine?: string; }; to: { mimeType: string; sdpFmtpLine?: string; }; }; export type VideoResolutionChangedEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor | OutboundTrackMonitor; direction: VideoResolutionChangeDirection; from: { width: number; height: number; }; to: { width: number; height: number; }; qualityLimitationReason?: string; }; export type StuckDecoderEventPayload = ClientMonitorBaseEvent & { trackMonitor: InboundTrackMonitor; variant: StuckDecoderVariant; stuckForInMs: number; deadBytesReceived: number; pliCountSinceStuck: number; }; export type StatsCollectionGapEventPayload = ClientMonitorBaseEvent & { expectedPeriodInMs: number; actualPeriodInMs: number; gapInMs: number; }; export type ScoreEventPayload = ClientMonitorBaseEvent & { clientScore: number; currentReasons: Record<string, number>; }; export type NewCodecMonitorEventPayload = ClientMonitorBaseEvent & { codecMonitor: CodecMonitor; }; export type NewPeerConnectionMonitorEventPayload = ClientMonitorBaseEvent & { peerConnectionMonitor: PeerConnectionMonitor; }; export type NewInboundRtpMonitorEventPayload = ClientMonitorBaseEvent & { inboundRtpMonitor: InboundRtpMonitor; }; export type NewInboundTrackMonitorEventPayload = ClientMonitorBaseEvent & { inboundTrackMonitor: InboundTrackMonitor; }; export type NewOutboundTrackMonitorEventPayload = ClientMonitorBaseEvent & { outboundTrackMonitor: OutboundTrackMonitor; }; export type NewOutboundRtpMonitorEventPayload = ClientMonitorBaseEvent & { outboundRtpMonitor: OutboundRtpMonitor; }; export type NewDataChannelMonitorEventPayload = ClientMonitorBaseEvent & { dataChannelMonitor: DataChannelMonitor; }; export type NewIceCandidateMonitorPayload = ClientMonitorBaseEvent & { iceCandidateMonitor: IceCandidateMonitor; }; export type NewIceCandidatePairMonitorEventPayload = ClientMonitorBaseEvent & { iceCandidatePairMonitor: IceCandidatePairMonitor; }; export type NewIceTransportMonitorEventPayload = ClientMonitorBaseEvent & { iceTransportMonitor: IceTransportMonitor; }; export type NewMediaPlayoutMonitorEventPayload = ClientMonitorBaseEvent & { mediaPlayoutMonitor: MediaPlayoutMonitor; }; export type NewMediaSourceMonitorEventPayload = ClientMonitorBaseEvent & { mediaSourceMonitor: MediaSourceMonitor; }; export type NewPeerConnectionTransportMonitorEventPayload = ClientMonitorBaseEvent & { peerConnectionTransportMonitor: PeerConnectionTransportMonitor; }; export type NewRemoteInboundRtpMonitorEventPayload = ClientMonitorBaseEvent & { remoteInboundRtpMonitor: RemoteInboundRtpMonitor; }; export type NewRemoteOutboundRtpMonitorEventPayload = ClientMonitorBaseEvent & { remoteOutboundRtpMonitor: RemoteOutboundRtpMonitor; }; export type NewCertificateMonitorEventPayload = ClientMonitorBaseEvent & { certificateMonitor: CertificateMonitor; }; export type ClientMonitorEvents = { 'sample-created': [SampleCreatedEventPayload]; "stats-collected": [StatsCollectedEventPayload]; 'close': []; 'issue': [ClientIssue]; 'issue-updated': [UpdatedClientIssue]; 'issue-resolved': [ResolvedClientIssue]; 'client-event': [ClientEvent]; 'meta': [ClientMetaData]; 'extension-stats': [ExtensionStat]; 'congestion': [CongestionEventPayload]; 'cpulimitation': [ClientMonitorBaseEvent]; 'audio-desync-track': [AudioDesyncTrackEventPayload]; 'synthesized-audio': [SynthesizedAudioEventPayload]; 'freezed-video-track': [FreezedVideoTrackEventPayload]; 'dry-inbound-track': [DryInboundTrackEventPayload]; 'dry-outbound-track': [DryOutboundTrackEventPayload]; 'ice-tuple-changed': [IceTupleChangedEventPayload]; 'ice-path-changed': [IcePathChangedEventPayload]; 'too-long-pc-connection-establishment': [TooLongPcConnectionEstablishmentEventPayload]; 'inbound-video-playout-discrepancy': [InboundVideoPlayoutDiscrepancyEventPayload]; 'ice-restart': [IceRestartEventPayload]; 'ice-restart-recommended': [IceRestartRecommendedEventPayload]; 'audio-concealment': [AudioConcealmentEventPayload]; 'audio-jitter-buffer-stress': [AudioJitterBufferStressEventPayload]; 'video-decoder-overloaded': [VideoDecoderOverloadedEventPayload]; 'keyframe-storm': [KeyframeStormEventPayload]; 'video-recovery-failed': [VideoRecoveryFailedEventPayload]; 'stuck-decoder': [StuckDecoderEventPayload]; 'capture-bottleneck': [CaptureBottleneckEventPayload]; 'encoder-bottleneck': [EncoderBottleneckEventPayload]; 'capture-track-ended': [CaptureTrackEndedEventPayload]; 'capture-track-muted': [CaptureTrackMutedEventPayload]; 'silent-audio-source': [SilentAudioSourceEventPayload]; 'simulcast-layer-changed': [SimulcastLayerChangedEventPayload]; 'codec-changed': [CodecChangedEventPayload]; 'video-resolution-changed': [VideoResolutionChangedEventPayload]; 'stats-collection-gap': [StatsCollectionGapEventPayload]; 'score': [ScoreEventPayload]; 'new-codec-monitor': [NewCodecMonitorEventPayload]; 'new-peerconnnection-monitor': [NewPeerConnectionMonitorEventPayload]; 'new-inbound-rtp-monitor': [NewInboundRtpMonitorEventPayload]; 'new-inbound-track-monitor': [NewInboundTrackMonitorEventPayload]; 'new-outbound-track-monitor': [NewOutboundTrackMonitorEventPayload]; 'new-outbound-rtp-monitor': [NewOutboundRtpMonitorEventPayload]; 'new-data-channel-monitor': [NewDataChannelMonitorEventPayload]; 'new-ice-transport-monitor': [NewIceTransportMonitorEventPayload]; 'new-ice-candidate-monitor': [NewIceCandidateMonitorPayload]; 'new-ice-candidate-pair-monitor': [NewIceCandidatePairMonitorEventPayload]; 'new-media-playout-monitor': [NewMediaPlayoutMonitorEventPayload]; 'new-media-source-monitor': [NewMediaSourceMonitorEventPayload]; 'new-peer-connection-transport-monitor': [NewPeerConnectionTransportMonitorEventPayload]; 'new-remote-inbound-rtp-monitor': [NewRemoteInboundRtpMonitorEventPayload]; 'new-remote-outbound-rtp-monitor': [NewRemoteOutboundRtpMonitorEventPayload]; 'new-certificate-monitor': [NewCertificateMonitorEventPayload]; 'new-selected-ice-path': [NewSelectedIcePathEventPayload]; };