import { DragEvent } from "../mouse-event-listener";
import { Position, Resolution, StreamMask, StreamPosition, StreamPositionType } from "../stream-position";
interface StreamAudio {
    audioSource?: MediaStreamAudioSourceNode;
    audioOutput?: GainNode;
}
interface StreamDisplaySettings {
    displayResolution: Resolution;
    streamResolution: Resolution;
    position: Position;
    radius?: number;
}
type StreamType = "AUDIO" | "VIDEO";
export interface StreamOptions {
    name?: string;
    position: StreamPosition;
    draggable: boolean;
    resizable: boolean;
    mask: StreamMask;
    mute: boolean;
    hidden: boolean;
    opacity: number;
    index: number;
    onClick?: (streamId: string, event: {
        x: number;
        y: number;
    }) => void;
}
export interface StreamDetails {
    type: StreamType;
    id: string;
    options: StreamOptions;
    displaySettings?: StreamDisplaySettings;
    stream?: MediaStream;
    streamVideo?: CanvasImageSource;
    streamAudio?: StreamAudio;
}
interface BanubaEffect {
    clientToken: string;
    moduleUrls?: string[];
    effectUrl?: string;
}
export interface StreamUserOptions {
    name?: string;
    position?: StreamPositionType;
    x?: number;
    y?: number;
    width?: number;
    height?: number;
    draggable?: boolean;
    resizable?: boolean;
    mask?: StreamMask;
    index?: number;
    mute?: boolean;
    hidden?: boolean;
    opacity?: number;
    onClick?: (streamId: string, event: {
        x: number;
        y: number;
    }) => void;
    banubaEffect?: BanubaEffect;
}
export declare class Stream {
    private static lastStreamId;
    private id;
    private name?;
    private position;
    private draggable;
    private resizable;
    private mask;
    private mute;
    private hidden;
    private opacity;
    private onClick?;
    private mediaStream?;
    private videoElement?;
    private streamAudio?;
    private type;
    private displaySettings?;
    private containerResolution;
    private audioDelayNode;
    constructor(type: StreamType, audioDelayNode: DelayNode, containerResolution: Resolution);
    load(mediaStream: MediaStream | CanvasImageSource, audioContext: AudioContext, options: StreamUserOptions): Promise<void>;
    private createBanubaEffect;
    getId(): string;
    updateOptions(userOptions: StreamUserOptions): {
        streamResolution: {
            width: number;
            height: number;
        };
        displayResolution: Resolution;
        position: Position;
        radius?: number | undefined;
    } | undefined;
    destroy(): void;
    getDisplaySettings(): StreamDisplaySettings | undefined;
    getStreamDetails(): StreamDetails;
    updatePosition(position: StreamPosition): void;
    draw(canvasRenderingContext: CanvasRenderingContext2D): void;
    hasDisplay(): boolean;
    onMouseDrag(e: DragEvent): void;
    private onMouseResize;
    private updateDisplaySettings;
    private createStreamVideoElement;
    private createStreamAudioElement;
}
export {};
