Skip to content

Commit 4122497

Browse files
committed
fix(feishu): add cursor dedup to prevent duplicate page requests
Guard against API returning repeated cursors: track seen page tokens and break on duplicates. Prevents duplicate file entries and wasteful repeated requests even before MAX_LIST_PAGES is reached. Closes: #93928
1 parent 934e825 commit 4122497

1 file changed

Lines changed: 11 additions & 0 deletions

File tree

extensions/feishu/src/drive.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,8 @@ async function listFolder(
349349
let lastHasMore = false;
350350
let pageCount = 0;
351351
const MAX_LIST_PAGES = 100;
352+
const seenTokens = new Set<string>();
353+
if (pageToken) seenTokens.add(pageToken);
352354
while (hasMore && pageCount < MAX_LIST_PAGES) {
353355
const params: Record<string, string | number> = {};
354356
if (validFolderToken) {
@@ -378,6 +380,10 @@ async function listFolder(
378380
lastHasMore = res.data?.has_more === true;
379381
hasMore = lastHasMore && opts?.all === true;
380382
pageToken = res.data?.next_page_token ?? undefined;
383+
if (pageToken && seenTokens.has(pageToken)) {
384+
break; // Repeated cursor: avoid duplicate pages
385+
}
386+
if (pageToken) seenTokens.add(pageToken);
381387
}
382388
return { files: allFiles, has_more: lastHasMore, next_page_token: pageToken };
383389
}
@@ -386,6 +392,7 @@ async function getFileInfo(client: Lark.Client, fileToken: string, folderToken?:
386392
// Search across all pages to find the file
387393
const validFolderToken = folderToken && folderToken !== "0" ? folderToken : undefined;
388394
let pageToken: string | undefined;
395+
const seenTokens = new Set<string>();
389396
for (let page = 0; page < 100; page += 1) {
390397
const params: Record<string, string | number> = {};
391398
if (validFolderToken) {
@@ -414,6 +421,10 @@ async function getFileInfo(client: Lark.Client, fileToken: string, folderToken?:
414421
break;
415422
}
416423
pageToken = res.data.next_page_token;
424+
if (seenTokens.has(pageToken)) {
425+
break; // Repeated cursor: avoid infinite loop on stale token
426+
}
427+
seenTokens.add(pageToken);
417428
}
418429
throw new Error(`File not found: ${fileToken}`);
419430
}

0 commit comments

Comments
 (0)