/// <reference types="node" />
import { NotionClientError } from '@notionhq/client';
import { Entity, FlatEntity, RequestParameters } from '../types';
import { QueryablePromise } from '../utils';
import { QueryDatabaseParameters } from '@notionhq/client/build/src/api-endpoints';
export interface CreateFetchQueueOptions {
    maxConcurrency?: number;
    maxRequestDepth?: number;
    maxBlockDepth?: number;
    maxRetry?: number;
    databaseQueryFilter?: QueryDatabaseParameters['filter'];
}
export interface CreateFetchQueueParameters extends CreateFetchQueueOptions {
    requestParameters: RequestParameters;
}
/**
 * @param maxBlockDepth
 * Try to keep this variable to 1.
 *
 * This is a relative depth between parent page and a block inside it.
 * Increasing this value will result in better search indexing and nested child page discovery,
 * but it will also increase request count (more than) EXPONENTIALLY.
 * Notion API may throw error as it has broader request rate limits.
 * So if you want to discover nested pages, don't put them under plain blocks, rather put them on the plain level of the parent page.
 * And if you want better search indexing, put search keywords on the root level of the page or put them on the page property.
 */
export declare const createFetchQueue: ({ requestParameters, maxConcurrency, maxRequestDepth, maxBlockDepth, maxRetry, databaseQueryFilter }: CreateFetchQueueParameters) => {
    requestReadyRoutine: NodeJS.Timer;
    requestPromiseRoutine: NodeJS.Timer;
    request_ready_queue: {
        parentToAssign: Entity;
        parentToRequest: Entity;
        retry: number;
    }[];
    request_promise_queue: {
        parentToAssign: Entity;
        parentToRequest: Entity;
        children: QueryablePromise<Entity[], NotionClientError>;
        retry: number;
    }[];
    page_collection: Record<string, FlatEntity>;
    rootEntity: Entity;
};
export declare type createFetchQueueReturnType = ReturnType<typeof createFetchQueue>;
export declare function createFetchQueueWatcher({ requestReadyRoutine, requestPromiseRoutine, request_ready_queue, request_promise_queue, page_collection, rootEntity }: createFetchQueueReturnType): Promise<{
    page_collection: typeof page_collection;
    root: Entity;
}>;
