31313c69ac
Vendor Bird's Twitter GraphQL search client directly into /last30days, eliminating the dependency on `npm install -g @steipete/bird`. X search now works out of the box with just Node.js 22+ and browser cookies. - Add vendored bird-search.mjs wrapper (search-only subset of Bird v0.8.0) - Vendor @steipete/sweet-cookie for browser cookie extraction - Update bird_x.py to call vendored Node.js module instead of `bird` binary - Update README.md and SKILL.md for v2.1 (remove Bird CLI install steps) - Include Bird's MIT LICENSE in vendor directory The fallback chain is: vendored search -> xAI API key -> web-only mode. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
37 lines
1.2 KiB
JavaScript
37 lines
1.2 KiB
JavaScript
export async function paginateCursor(opts) {
|
|
const { maxPages, pageDelayMs = 1000 } = opts;
|
|
const seen = new Set();
|
|
const items = [];
|
|
let cursor = opts.cursor;
|
|
let pagesFetched = 0;
|
|
while (true) {
|
|
if (pagesFetched > 0 && pageDelayMs > 0) {
|
|
await opts.sleep(pageDelayMs);
|
|
}
|
|
const page = await opts.fetchPage(cursor);
|
|
if (!page.success) {
|
|
if (items.length > 0) {
|
|
return { success: false, error: page.error, items, nextCursor: cursor };
|
|
}
|
|
return page;
|
|
}
|
|
pagesFetched += 1;
|
|
for (const item of page.items) {
|
|
const key = opts.getKey(item);
|
|
if (seen.has(key)) {
|
|
continue;
|
|
}
|
|
seen.add(key);
|
|
items.push(item);
|
|
}
|
|
const pageCursor = page.cursor;
|
|
if (!pageCursor || pageCursor === cursor) {
|
|
return { success: true, items, nextCursor: undefined };
|
|
}
|
|
if (maxPages !== undefined && pagesFetched >= maxPages) {
|
|
return { success: true, items, nextCursor: pageCursor };
|
|
}
|
|
cursor = pageCursor;
|
|
}
|
|
}
|
|
//# sourceMappingURL=paginate-cursor.js.map
|