@observertc/client-monitor-js
Version:
ObserveRTC Client Integration Javascript Library
329 lines (328 loc) • 13.9 kB
TypeScript
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];
};