import { Insertable, Selectable } from 'kysely';
import { AtpAgent } from '@atproto/api';
import { Database } from '../db';
import { BlobPushEvent } from '../db/schema/blob_push_event';
import { RepoPushEventType } from '../db/schema/repo_push_event';
type PollState = {
    timer?: NodeJS.Timeout;
    promise: Promise<void>;
};
type AuthHeaders = {
    headers: {
        authorization: string;
    };
};
type Service = {
    agent: AtpAgent;
    did: string;
};
export declare class EventPusher {
    db: Database;
    createAuthHeaders: (aud: string, method: string) => Promise<AuthHeaders>;
    destroyed: boolean;
    repoPollState: PollState;
    recordPollState: PollState;
    blobPollState: PollState;
    appview: Service | undefined;
    pds: Service | undefined;
    constructor(db: Database, createAuthHeaders: (aud: string, method: string) => Promise<AuthHeaders>, services: {
        appview?: {
            url: string;
            did: string;
        };
        pds?: {
            url: string;
            did: string;
        };
    });
    start(): void;
    getTakedownServices(targetServices: Set<string>): RepoPushEventType[];
    poll(state: PollState, fn: () => Promise<void>): void;
    processAll(): Promise<void>;
    destroy(): Promise<void>;
    pushRepoEvents(): Promise<void>;
    pushRecordEvents(): Promise<void>;
    pushBlobEvents(): Promise<void>;
    private updateSubjectOnService;
    attemptRepoEvent(id: number): Promise<void>;
    attemptRecordEvent(id: number): Promise<void>;
    attemptBlobEvent(id: number): Promise<void>;
    markBlobEventAttempt(dbTxn: Database, event: Selectable<BlobPushEvent>, succeeded: boolean): Promise<void>;
    logBlobPushEvent(blobValues: Insertable<BlobPushEvent>[], takedownRef?: string | null): Promise<import("kysely").Selection<import("../db/schema").DatabaseSchemaType, "blob_push_event", "id" | "subjectDid" | "subjectUri" | "eventType" | "subjectBlobCid">[]>;
}
export {};
//# sourceMappingURL=event-pusher.d.ts.map