import TypedEmitter from "typed-emitter";
import { AuthErrorReason, BandwidthLimit, Component, ConnectConfig, CreateConfig, MessageEvents, Peer, SimulcastConfig, TrackBandwidthLimit, TrackContext, TrackEncoding } from "@jellyfish-dev/ts-client-sdk";
import { PeerId, PeerState, PeerStatus, TrackId, TrackWithOrigin } from "./state.types";
import { DeviceManager, DeviceManagerEvents } from "./DeviceManager";
import { MediaDeviceType, ScreenShareManager, ScreenShareManagerConfig } from "./ScreenShareManager";
import { DeviceManagerConfig, DeviceState, UseCameraAndMicrophoneResult, UseUserMediaState } from "./types";
export type ClientApi<PeerMetadata, TrackMetadata> = {
    local: PeerState<PeerMetadata, TrackMetadata> | null;
    peers: Record<PeerId, PeerState<PeerMetadata, TrackMetadata>>;
    peersTracks: Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
    components: Record<PeerId, PeerState<PeerMetadata, TrackMetadata>>;
    componentsTracks: Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
    bandwidthEstimation: bigint;
    status: PeerStatus;
    media: UseUserMediaState | null;
    devices: UseCameraAndMicrophoneResult<TrackMetadata>;
    deviceManager: DeviceManager;
    screenShareManager: ScreenShareManager;
};
export interface ClientEvents<PeerMetadata, TrackMetadata> {
    /**
     * Emitted when the websocket connection is closed
     *
     * @param {CloseEvent} event - Close event object from the websocket
     */
    socketClose: (event: CloseEvent, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Emitted when occurs an error in the websocket connection
     *
     * @param {Event} event - Event object from the websocket
     */
    socketError: (event: Event, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Emitted when the websocket connection is opened
     *
     * @param {Event} event - Event object from the websocket
     */
    socketOpen: (event: Event, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /** Emitted when authentication is successful */
    authSuccess: (client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /** Emitted when authentication fails */
    authError: (reason: AuthErrorReason, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /** Emitted when the connection is closed */
    disconnected: (client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called when peer was accepted.
     */
    joined: (event: {
        peerId: string;
        peers: Peer<PeerMetadata, TrackMetadata>[];
        components: Component<PeerMetadata, TrackMetadata>[];
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called when peer was not accepted
     * @param metadata - Pass through for client application to communicate further actions to frontend
     */
    joinError: (metadata: any, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called when data in a new track arrives.
     *
     * This callback is always called after {@link MessageEvents.trackAdded}.
     * It informs user that data related to the given track arrives and can be played or displayed.
     */
    trackReady: (ctx: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called each time the peer which was already in the room, adds new track. Fields track and stream will be set to null.
     * These fields will be set to non-null value in {@link MessageEvents.trackReady}
     */
    trackAdded: (ctx: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called when some track will no longer be sent.
     *
     * It will also be called before {@link MessageEvents.peerLeft} for each track of this peer.
     */
    trackRemoved: (ctx: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called each time peer has its track metadata updated.
     */
    trackUpdated: (ctx: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called each time new peer joins the room.
     */
    peerJoined: (peer: Peer<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called each time peer leaves the room.
     */
    peerLeft: (peer: Peer<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called each time peer has its metadata updated.
     */
    peerUpdated: (peer: Peer<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called each time new Component is added to the room.
     */
    componentAdded: (peer: Component<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called each time Component is removed from the room.
     */
    componentRemoved: (peer: Component<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called each time Component has its metadata updated.
     */
    componentUpdated: (peer: Component<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called in case of errors related to multimedia session e.g. ICE connection.
     */
    connectionError: (message: string, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Called every time the server estimates client's bandiwdth.
     *
     * @param {bigint} estimation - client's available incoming bitrate estimated
     * by the server. It's measured in bits per second.
     */
    bandwidthEstimationChanged: (estimation: bigint, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    encodingChanged: (context: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    /**
     * Emitted every time an update about voice activity is received from the server.
     */
    voiceActivityChanged: (context: TrackContext<PeerMetadata, TrackMetadata>, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    managerStarted: (event: Parameters<DeviceManagerEvents["managerInitialized"]>[0] & {
        mediaDeviceType: MediaDeviceType;
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    managerInitialized: (event: {
        audio?: DeviceState;
        video?: DeviceState;
        mediaDeviceType: MediaDeviceType;
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    deviceReady: (event: Parameters<DeviceManagerEvents["deviceReady"]>[0] & {
        mediaDeviceType: MediaDeviceType;
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    devicesStarted: (event: Parameters<DeviceManagerEvents["devicesStarted"]>[0] & {
        mediaDeviceType: MediaDeviceType;
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    devicesReady: (event: Parameters<DeviceManagerEvents["devicesReady"]>[0] & {
        mediaDeviceType: MediaDeviceType;
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    deviceStopped: (event: Parameters<DeviceManagerEvents["deviceStopped"]>[0] & {
        mediaDeviceType: MediaDeviceType;
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    deviceEnabled: (event: Parameters<DeviceManagerEvents["deviceEnabled"]>[0] & {
        mediaDeviceType: MediaDeviceType;
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    deviceDisabled: (event: Parameters<DeviceManagerEvents["deviceDisabled"]>[0] & {
        mediaDeviceType: MediaDeviceType;
    }, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    error: (arg: any, client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    targetTrackEncodingRequested: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["targetTrackEncodingRequested"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localTrackAdded: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackAdded"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localTrackRemoved: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackRemoved"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localTrackReplaced: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackReplaced"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localTrackBandwidthSet: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackBandwidthSet"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localTrackEncodingBandwidthSet: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackEncodingBandwidthSet"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localTrackEncodingEnabled: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackEncodingEnabled"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localTrackEncodingDisabled: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackEncodingDisabled"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localEndpointMetadataChanged: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localEndpointMetadataChanged"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    localTrackMetadataChanged: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["localTrackMetadataChanged"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
    disconnectRequested: (event: Parameters<MessageEvents<PeerMetadata, TrackMetadata>["disconnectRequested"]>[0], client: ClientApi<PeerMetadata, TrackMetadata>) => void;
}
export type ReactClientCreteConfig<PeerMetadata, TrackMetadata> = {
    clientConfig?: CreateConfig<PeerMetadata, TrackMetadata>;
    deviceManagerDefaultConfig?: DeviceManagerConfig;
    screenShareManagerDefaultConfig?: ScreenShareManagerConfig;
};
declare const Client_base: new <PeerMetadata_1, TrackMetadata_1>() => TypedEmitter<Required<ClientEvents<PeerMetadata_1, TrackMetadata_1>>>;
export declare class Client<PeerMetadata, TrackMetadata> extends Client_base<PeerMetadata, TrackMetadata> {
    private readonly tsClient;
    readonly deviceManager: DeviceManager;
    readonly screenShareManager: ScreenShareManager;
    local: PeerState<PeerMetadata, TrackMetadata> | null;
    peers: Record<PeerId, PeerState<PeerMetadata, TrackMetadata>>;
    components: Record<PeerId, PeerState<PeerMetadata, TrackMetadata>>;
    peersTracks: Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
    componentsTracks: Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
    bandwidthEstimation: bigint;
    status: PeerStatus;
    media: UseUserMediaState | null;
    devices: UseCameraAndMicrophoneResult<TrackMetadata>;
    private currentMicrophoneTrackId;
    private currentCameraTrackId;
    private currentScreenShareTrackId;
    constructor(config?: ReactClientCreteConfig<PeerMetadata, TrackMetadata>);
    setScreenManagerConfig(config: ScreenShareManagerConfig): void;
    setDeviceManagerConfig(config: DeviceManagerConfig): void;
    private trackContextToTrack;
    connect(config: ConnectConfig<PeerMetadata>): void;
    disconnect(): void;
    addTrack(track: MediaStreamTrack, stream: MediaStream, trackMetadata?: TrackMetadata, simulcastConfig?: SimulcastConfig, maxBandwidth?: TrackBandwidthLimit): Promise<string>;
    removeTrack(trackId: string): Promise<void>;
    replaceTrack(trackId: string, newTrack: MediaStreamTrack, newTrackMetadata?: TrackMetadata): Promise<void>;
    getStatistics(selector?: MediaStreamTrack | null): Promise<RTCStatsReport>;
    getBandwidthEstimation(): bigint;
    setTrackBandwidth(trackId: string, bandwidth: BandwidthLimit): Promise<boolean>;
    setEncodingBandwidth(trackId: string, rid: string, bandwidth: BandwidthLimit): Promise<boolean>;
    setTargetTrackEncoding(trackId: string, encoding: TrackEncoding): void;
    enableTrackEncoding(trackId: string, encoding: TrackEncoding): void;
    disableTrackEncoding(trackId: string, encoding: TrackEncoding): void;
    updatePeerMetadata: (peerMetadata: PeerMetadata) => void;
    updateTrackMetadata: (trackId: string, trackMetadata: TrackMetadata) => void;
    private stateToSnapshot;
}
export {};
//# sourceMappingURL=Client.d.ts.map