import { Options as RecorderOptions, ProgressiveUploaderOptionsWithAccessToken, ProgressiveUploaderOptionsWithUploadToken, VideoUploadResponse } from "@api.video/media-recorder";
import { DrawingSettings } from "./drawing-layer";
import { Resolution } from "./stream-position";
import { StreamDetails, StreamUserOptions } from "./stream/stream";
export { StreamDetails };
export interface Options {
    resolution: Resolution;
}
export interface AudioSourceDetails {
    id: string;
    stream: MediaStream;
}
declare type EventType = "error" | "recordingStopped" | "videoPlayable";
declare global {
    interface Window {
        AudioContext: AudioContext;
        webkitAudioContext: any;
    }
    interface AudioContext {
        createGainNode: any;
    }
    interface HTMLCanvasElement {
        captureStream(frameRate?: number): MediaStream;
    }
    interface HTMLMediaElement {
        _mediaElementSource: any;
    }
    interface HTMLVideoElement {
        playsInline: boolean;
    }
}
export type MouseTool = "draw" | "move-resize";
type RecordingOptions = RecorderOptions & (ProgressiveUploaderOptionsWithUploadToken | ProgressiveUploaderOptionsWithAccessToken) & {
    timeslice?: number;
};
export declare class MediaStreamComposer {
    private result;
    private recorder?;
    private streams;
    private eventTarget;
    private fps;
    private resolution;
    private audioContext?;
    private audioDestinationNode?;
    private audioDelayNode?;
    private canvas?;
    private canvasRenderingContext;
    private frameCount;
    private started;
    private mouseTool;
    private drawingLayer;
    constructor(options: Partial<Options>);
    private init;
    private _backgroundAudioHack;
    getResultStream(): MediaStream | null;
    static getSupportedMimeTypes(): string[];
    startRecording(options: RecordingOptions): void;
    destroy(): void;
    addEventListener(type: EventType, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions | undefined): void;
    stopRecording(): Promise<VideoUploadResponse>;
    updateStream(streamId: string, userOptions: StreamUserOptions): void;
    appendCanvasTo(containerQuerySelector: string): void;
    removeStream(streamId: string): void;
    addAudioSource(mediaStream: MediaStream): string;
    removeAudioSource(id: string): void;
    addStream(mediaStream: MediaStream | HTMLImageElement, userOptions: StreamUserOptions): Promise<string>;
    getCanvas(): HTMLCanvasElement | undefined;
    getAudioSources(): AudioSourceDetails[];
    getAudioSource(id: string): AudioSourceDetails | undefined;
    getStreams(): StreamDetails[];
    getStream(id: string): StreamDetails | undefined;
    moveUp(streamId: string): void;
    moveDown(streamId: string): void;
    setMouseTool(tool: MouseTool): void;
    setDrawingSettings(settings: Partial<DrawingSettings>): void;
    clearDrawing(): void;
    private dispatch;
    private _draw;
    private _requestAnimationFrame;
    private _updateAudioDelay;
    private onMouseMove;
    private onMouseDragEnd;
    private onMouseDrag;
}
