diff --git a/packages/core/src/scrapers/ebay.ts b/packages/core/src/scrapers/ebay.ts index ca8b5af..06e365b 100644 --- a/packages/core/src/scrapers/ebay.ts +++ b/packages/core/src/scrapers/ebay.ts @@ -9,7 +9,7 @@ import { ensureCookies, formatCookiesForHeader, } from "../utils/cookies"; -import { fetchHtml, HttpError } from "../utils/http"; +import { fetchHtml, HttpError, RateLimitError } from "../utils/http"; import { logger } from "../utils/logger"; import { classifyUnstableListings } from "../utils/unstable"; @@ -511,9 +511,9 @@ export default async function fetchEbayItems( logger.log(`Parsed ${filteredListings.length} eBay listings.`); return finalizeResults(filteredListings); } catch (err) { - if (err instanceof HttpError) { + if (err instanceof HttpError || err instanceof RateLimitError) { logger.warn( - `Failed to fetch eBay search (${err.statusCode}): ${err.message}`, + `Failed to fetch eBay search (${err instanceof HttpError ? err.statusCode : 429}): ${err.message}`, ); return finalizeResults([]); } diff --git a/packages/core/test/ebay-core.test.ts b/packages/core/test/ebay-core.test.ts index 69c8de1..f82f56f 100644 --- a/packages/core/test/ebay-core.test.ts +++ b/packages/core/test/ebay-core.test.ts @@ -86,6 +86,21 @@ describe("eBay Scraper Cookie Handling", () => { ]); }); + test("returns empty results when eBay rate-limits the request", async () => { + global.fetch = mock(() => + Promise.resolve({ + ok: false, + status: 429, + headers: { get: () => "0" }, + text: () => Promise.resolve(""), + }), + ) as unknown as typeof fetch; + + const results = await fetchEbayItems("laptop", 1000); + + expect(results).toEqual([]); + }); + test("deduplicates repeated item links from the same card", async () => { global.fetch = mock(() => Promise.resolve({