notion-page-tree
Version:
Recursively fetch nested Notion pages from the root page/database/block node.
49 lines (48 loc) • 2.26 kB
TypeScript
/// <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;
}>;