import { blockClass } from '@sentry-internal/rrweb-types';
import { canvasMutationCallback } from '@sentry-internal/rrweb-types';
import { DataURLOptions } from '@sentry-internal/rrweb-snapshot';
import { IWindow } from '@sentry-internal/rrweb-types';
import { Mirror } from '@sentry-internal/rrweb-snapshot';

export declare class CanvasManager implements CanvasManagerInterface {
    private pendingCanvasMutations;
    private rafStamps;
    private options;
    private mirror;
    private shadowDoms;
    private windowsSet;
    private windows;
    private mutationCb;
    private restoreHandlers;
    private frozen;
    private locked;
    private snapshotInProgressMap;
    private worker;
    private lastSnapshotTime;
    reset(): void;
    freeze(): void;
    unfreeze(): void;
    lock(): void;
    unlock(): void;
    constructor(options: CanvasManagerConstructorOptions);
    addWindow(win: IWindow): void;
    addShadowRoot(shadowRoot: ShadowRoot): void;
    resetShadowRoots(): void;
    snapshot(canvasElement?: HTMLCanvasElement, options?: SnapshotOptions): void;
    private initFPSWorker;
    private processMutation;
    private initCanvasFPSObserver;
    private initCanvasMutationObserver;
    private getCanvasElements;
    private takeSnapshot;
    private startPendingCanvasMutationFlusher;
    private startRAFTimestamping;
    flushPendingCanvasMutations(): void;
    flushPendingCanvasMutationFor(canvas: HTMLCanvasElement, id: number): void;
}

export declare interface CanvasManagerConstructorOptions {
    recordCanvas: boolean;
    enableManualSnapshot?: boolean;
    mutationCb: canvasMutationCallback;
    win: IWindow;
    blockClass: blockClass;
    blockSelector: string | null;
    unblockSelector: string | null;
    maxCanvasSize?: MaxCanvasSize | null;
    mirror: Mirror;
    dataURLOptions: DataURLOptions;
    errorHandler?: ErrorHandler;
    sampling?: 'all' | number;
}

declare interface CanvasManagerInterface {
    reset(): void;
    freeze(): void;
    unfreeze(): void;
    lock(): void;
    unlock(): void;
    snapshot(canvasElement?: HTMLCanvasElement, options?: SnapshotOptions): void;
    addWindow(win: IWindow): void;
    addShadowRoot(shadowRoot: ShadowRoot): void;
    resetShadowRoots(): void;
}

declare type ErrorHandler = (error: unknown) => void | boolean;

declare type MaxCanvasSize = [number, number];

declare type SnapshotOptions = {
    skipRequestAnimationFrame?: boolean;
};

export { }
