export interface QueuedUrl { url: string; depth: number; addedAt?: number; } export interface QueueStats { queueSize: number; visitedCount: number; queuedCount: number; totalAttempts: number; rejectedDuplicate: number; rejectedMaxAttempts: number; rejectedQueueFull: number; } /** * 线程安全的 URL 队列管理器 * 防止循环和重复抓取 */ export declare class URLQueue { private queue; private visited; private queued; private urlAttempts; private stats; private readonly MAX_ATTEMPTS_PER_URL; private readonly MAX_QUEUE_SIZE; /** * 添加 URL 到队列(线程安全) * @returns true 如果添加成功,false 如果被拒绝 */ add(url: string, depth: number): boolean; /** * 批量添加 URL * @returns 成功添加的数量 */ addMany(urls: Array<{ url: string; depth: number; }>): number; /** * 取出下一个 URL * @param strategy 'bfs' (breadth-first) 或 'dfs' (depth-first) */ next(strategy?: 'bfs' | 'dfs'): QueuedUrl | null; /** * 标记 URL 为已访问 */ markVisited(url: string): void; /** * 标记 URL 访问失败(用于重试) */ markFailed(url: string): void; /** * 检查 URL 状态 */ getStatus(url: string): 'visited' | 'queued' | 'new'; /** * 检查 URL 是否已访问 */ hasVisited(url: string): boolean; /** * 检查 URL 是否在队列中 */ isQueued(url: string): boolean; /** * 获取 URL 的尝试次数 */ getAttempts(url: string): number; /** * 获取统计信息 */ getStats(): QueueStats; /** * 清空队列(保留 visited 记录) */ clear(): void; /** * 重置所有状态 */ reset(): void; /** * 检查队列是否为空 */ isEmpty(): boolean; /** * 获取队列大小 */ size(): number; /** * 获取已访问的 URL 数量 */ visitedSize(): number; /** * 导出状态(用于 checkpoint) */ exportState(): { visited: string[]; queued: QueuedUrl[]; attempts: Record; }; /** * 导入状态(用于 resume) */ importState(state: { visited: string[]; queued: QueuedUrl[]; attempts: Record; }): void; } //# sourceMappingURL=url-queue.d.ts.map