import IDisposable from '../../lang/IDisposable';
import { Millisecond, BitsPerSecond } from '../../units/Units';
import ReadOnlySubject from '../../rx/ReadOnlySubject';
import Dimension from '../../video/Dimension';
import IPeerConnection from '../../rtc/IPeerConnection';
import { IRtcMonitorStatistic } from '../../rtc/RtcConnectionMonitor';
import { EncodedEdgeToken } from '../../edgeAuth/EncodedEdgeToken';
import EndPoint, { IStream } from '../discovery/EndPoint';
import { DecodedFrameTimingInformation, RenderedFrameTimingInformation } from '../frameTiming/FrameTimingInformation';
import ChannelState from './ChannelState';
export interface IChannel extends IDisposable {
    videoElement: HTMLVideoElement | null;
    token: EncodedEdgeToken;
    readonly exists: ReadOnlySubject<boolean | null>;
    readonly tokenExpiring: ReadOnlySubject<boolean>;
    readonly state: ReadOnlySubject<ChannelState>;
    readonly authorized: ReadOnlySubject<boolean>;
    readonly online: ReadOnlySubject<boolean>;
    readonly loading: ReadOnlySubject<boolean>;
    readonly playing: ReadOnlySubject<boolean>;
    readonly standby: ReadOnlySubject<boolean>;
    readonly stopped: ReadOnlySubject<boolean>;
    readonly autoMuted: ReadOnlySubject<boolean>;
    readonly autoPaused: ReadOnlySubject<boolean>;
    readonly endPoint: ReadOnlySubject<EndPoint | null>;
    readonly targetLag: ReadOnlySubject<Millisecond>;
    readonly lag: ReadOnlySubject<Millisecond | undefined>;
    readonly resolution: ReadOnlySubject<Dimension>;
    readonly failureCount: ReadOnlySubject<number>;
    readonly streamId: string;
    readonly stream: ReadOnlySubject<IStream | null>;
    readonly bitrateLimit: BitsPerSecond;
    readonly peerConnection: ReadOnlySubject<IPeerConnection | null>;
    readonly mediaStream: ReadOnlySubject<MediaStream | null>;
    readonly rtcStatistics: ReadOnlySubject<IRtcMonitorStatistic | null>;
    readonly isFrameTimingInformationEnabled: ReadOnlySubject<boolean>;
    readonly decodedFrameTimingInformation: ReadOnlySubject<DecodedFrameTimingInformation | null>;
    readonly renderedFrameTimingInformation: ReadOnlySubject<RenderedFrameTimingInformation | null>;
    play(): Promise<void>;
    resume(): Promise<void>;
    stop(reason: string): Promise<void>;
    mute(): void;
    unmute(): void;
    setBitrateLimit(bitrateLimit: BitsPerSecond): void;
    clearBitrateLimit(): void;
    updateTargetLag(lag: Millisecond): void;
    getUri(token: EncodedEdgeToken): URL;
}
