@purepageio/fetch-engines 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/dist/FetchEngine.d.ts +46 -0
  4. package/dist/FetchEngine.d.ts.map +1 -0
  5. package/dist/FetchEngine.js +137 -0
  6. package/dist/FetchEngine.js.map +1 -0
  7. package/dist/FetchEngine.test.d.ts +2 -0
  8. package/dist/FetchEngine.test.d.ts.map +1 -0
  9. package/dist/FetchEngine.test.js +44 -0
  10. package/dist/FetchEngine.test.js.map +1 -0
  11. package/dist/HybridEngine.d.ts +15 -0
  12. package/dist/HybridEngine.d.ts.map +1 -0
  13. package/dist/HybridEngine.js +45 -0
  14. package/dist/HybridEngine.js.map +1 -0
  15. package/dist/IEngine.d.ts +22 -0
  16. package/dist/IEngine.d.ts.map +1 -0
  17. package/dist/IEngine.js +2 -0
  18. package/dist/IEngine.js.map +1 -0
  19. package/dist/PlaywrightEngine.d.ts +88 -0
  20. package/dist/PlaywrightEngine.d.ts.map +1 -0
  21. package/dist/PlaywrightEngine.js +484 -0
  22. package/dist/PlaywrightEngine.js.map +1 -0
  23. package/dist/PlaywrightEngine.test.d.ts +2 -0
  24. package/dist/PlaywrightEngine.test.d.ts.map +1 -0
  25. package/dist/PlaywrightEngine.test.js +299 -0
  26. package/dist/PlaywrightEngine.test.js.map +1 -0
  27. package/dist/PuppeteerEngine.d.ts +21 -0
  28. package/dist/PuppeteerEngine.d.ts.map +1 -0
  29. package/dist/PuppeteerEngine.js +412 -0
  30. package/dist/PuppeteerEngine.js.map +1 -0
  31. package/dist/browser/BrowserPool.d.ts +29 -0
  32. package/dist/browser/BrowserPool.d.ts.map +1 -0
  33. package/dist/browser/BrowserPool.js +378 -0
  34. package/dist/browser/BrowserPool.js.map +1 -0
  35. package/dist/browser/PlaywrightBrowserPool.d.ts +78 -0
  36. package/dist/browser/PlaywrightBrowserPool.d.ts.map +1 -0
  37. package/dist/browser/PlaywrightBrowserPool.js +429 -0
  38. package/dist/browser/PlaywrightBrowserPool.js.map +1 -0
  39. package/dist/browser/PlaywrightBrowserPool.test.d.ts +2 -0
  40. package/dist/browser/PlaywrightBrowserPool.test.d.ts.map +1 -0
  41. package/dist/browser/PlaywrightBrowserPool.test.js +422 -0
  42. package/dist/browser/PlaywrightBrowserPool.test.js.map +1 -0
  43. package/dist/errors.d.ts +20 -0
  44. package/dist/errors.d.ts.map +1 -0
  45. package/dist/errors.js +30 -0
  46. package/dist/errors.js.map +1 -0
  47. package/dist/index.d.ts +8 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +5 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/types.d.ts +151 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +72 -0
@@ -0,0 +1,299 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { PlaywrightEngine } from "./PlaywrightEngine.js";
3
+ import { PlaywrightBrowserPool } from "./browser/PlaywrightBrowserPool.js";
4
+ import axios from "axios";
5
+ import { EventEmitter } from "events";
6
+ // Mock axios
7
+ vi.mock("axios");
8
+ // Mock the BrowserPool itself
9
+ vi.mock("./browser/PlaywrightBrowserPool.js", () => {
10
+ // console.log("Mocking PlaywrightBrowserPool...");
11
+ const MockBrowserPool = vi.fn();
12
+ MockBrowserPool.prototype.initialize = vi.fn().mockResolvedValue(undefined);
13
+ MockBrowserPool.prototype.acquirePage = vi.fn(); // Mocked per test
14
+ MockBrowserPool.prototype.releasePage = vi.fn().mockResolvedValue(undefined);
15
+ MockBrowserPool.prototype.cleanup = vi.fn().mockResolvedValue(undefined);
16
+ MockBrowserPool.prototype.getMetrics = vi.fn().mockReturnValue([]); // Default to empty metrics
17
+ return { PlaywrightBrowserPool: MockBrowserPool };
18
+ });
19
+ // Helper function to create a mock Playwright Response
20
+ const createMockResponse = () => {
21
+ return {
22
+ ok: vi.fn().mockReturnValue(true),
23
+ status: vi.fn().mockReturnValue(200),
24
+ headers: vi.fn().mockReturnValue({ "content-type": "text/html" }),
25
+ // Add other methods/properties if needed by the engine
26
+ // body: vi.fn().mockResolvedValue(Buffer.from("")),
27
+ // text: vi.fn().mockResolvedValue(""),
28
+ // json: vi.fn().mockResolvedValue({}),
29
+ // etc.
30
+ };
31
+ };
32
+ // Helper to create mock Page
33
+ const createMockPage = () => {
34
+ const pageEmitter = new EventEmitter();
35
+ const mockPage = {
36
+ goto: vi.fn().mockResolvedValue(createMockResponse()), // Mock goto to return mock response
37
+ content: vi.fn().mockResolvedValue("<html>Mock HTML</html>"),
38
+ title: vi.fn().mockResolvedValue("Mock Title"),
39
+ url: vi.fn().mockReturnValue("http://mock.example.com"),
40
+ close: vi.fn().mockImplementation(() => {
41
+ pageEmitter.emit("close");
42
+ return Promise.resolve();
43
+ }),
44
+ isClosed: vi.fn().mockReturnValue(false),
45
+ on: pageEmitter.on.bind(pageEmitter),
46
+ once: pageEmitter.once.bind(pageEmitter),
47
+ off: pageEmitter.off.bind(pageEmitter),
48
+ evaluate: vi.fn(), // Mock evaluate if needed
49
+ mouse: { move: vi.fn().mockResolvedValue(undefined) }, // Mock mouse if behavior simulation tested
50
+ // Add other methods/properties as needed by the engine
51
+ };
52
+ return mockPage;
53
+ };
54
+ describe("PlaywrightEngine", () => {
55
+ let engine;
56
+ let mockAcquirePage;
57
+ let mockCleanupPool;
58
+ let mockGetMetrics;
59
+ let mockAxiosGet;
60
+ let browserPoolMock;
61
+ // Store spies to restore them
62
+ let spies = [];
63
+ beforeEach(() => {
64
+ vi.clearAllMocks();
65
+ vi.useRealTimers(); // Ensure real timers by default
66
+ mockAcquirePage = vi.fn();
67
+ mockCleanupPool = vi.fn();
68
+ mockGetMetrics = vi.fn().mockReturnValue([]);
69
+ // Use vi.spyOn for prototype methods
70
+ spies = [
71
+ vi
72
+ .spyOn(PlaywrightBrowserPool.prototype, "initialize")
73
+ .mockResolvedValue(undefined),
74
+ vi
75
+ .spyOn(PlaywrightBrowserPool.prototype, "acquirePage")
76
+ .mockImplementation(mockAcquirePage),
77
+ vi
78
+ .spyOn(PlaywrightBrowserPool.prototype, "cleanup")
79
+ .mockImplementation(mockCleanupPool),
80
+ vi
81
+ .spyOn(PlaywrightBrowserPool.prototype, "getMetrics")
82
+ .mockImplementation(mockGetMetrics),
83
+ ];
84
+ mockAxiosGet = vi.fn();
85
+ // Use mocked implementation signature
86
+ vi.mocked(axios.get).mockImplementation(mockAxiosGet);
87
+ // Get the mocked constructor instance
88
+ browserPoolMock = new PlaywrightBrowserPool();
89
+ // Mock acquirePage for default success case
90
+ vi.mocked(browserPoolMock.acquirePage).mockResolvedValue(createMockPage());
91
+ // Ensure the engine constructor uses the mocked pool
92
+ vi.mocked(PlaywrightBrowserPool).mockImplementation(() => browserPoolMock);
93
+ });
94
+ // Restore spies after each test
95
+ afterEach(async () => {
96
+ spies.forEach((spy) => spy.mockRestore());
97
+ if (engine) {
98
+ await engine.cleanup(); // Ensure engine resources are released
99
+ }
100
+ vi.restoreAllMocks();
101
+ });
102
+ it("should initialize the browser pool on first fetch and return content", async () => {
103
+ engine = new PlaywrightEngine({ useHttpFallback: false }); // Test without fallback initially
104
+ const url = "http://example-success.com";
105
+ const expectedHtml = "<html><body>Success</body></html>";
106
+ const expectedTitle = "Success Title";
107
+ const mockPage = createMockPage();
108
+ mockAcquirePage.mockResolvedValue(mockPage);
109
+ // Mock axios fallback - though not used here due to useHttpFallback: false
110
+ mockAxiosGet.mockRejectedValue(new Error("Axios fallback failed"));
111
+ const result = await engine.fetchHTML(url);
112
+ // Check prototype spies were involved
113
+ expect(PlaywrightBrowserPool.prototype.initialize).toHaveBeenCalledTimes(1);
114
+ expect(mockAcquirePage).toHaveBeenCalledTimes(1); // acquirePage spy
115
+ expect(mockPage.goto).toHaveBeenCalledWith(url, expect.anything());
116
+ expect(mockPage.close).toHaveBeenCalledTimes(1);
117
+ expect(result).toEqual({
118
+ html: expectedHtml,
119
+ title: expectedTitle,
120
+ url: url,
121
+ });
122
+ // Verify axios was NOT called for fallback attempt
123
+ expect(mockAxiosGet).not.toHaveBeenCalled(); // Fallback explicitly disabled
124
+ });
125
+ it("should use HTTP fallback if enabled and successful", async () => {
126
+ engine = new PlaywrightEngine({ useHttpFallback: true }); // Enable fallback
127
+ const url = "http://example.com/fallback-works";
128
+ const fallbackHtml = "<html><head><title>Fallback Title</title></head><body>Fallback HTML</body></html>";
129
+ // Setup successful axios fallback
130
+ mockAxiosGet.mockResolvedValue({
131
+ data: fallbackHtml,
132
+ status: 200,
133
+ headers: { "content-type": "text/html" },
134
+ request: { res: { responseUrl: url } },
135
+ config: { url: url },
136
+ });
137
+ const result = await engine.fetchHTML(url);
138
+ expect(mockAcquirePage).not.toHaveBeenCalled(); // Browser pool should not be used
139
+ expect(mockAxiosGet).toHaveBeenCalledTimes(1);
140
+ expect(mockAxiosGet).toHaveBeenCalledWith(url, expect.anything());
141
+ expect(result.title).toBe("Fallback Title"); // Title extracted by fallback regex
142
+ expect(result.html).toBe(fallbackHtml);
143
+ expect(result.url).toBe(url);
144
+ });
145
+ it("should retry browser fetch if initial attempt fails and fallback also fails", async () => {
146
+ // Explicitly configure retries and delay for predictability
147
+ engine = new PlaywrightEngine({
148
+ useHttpFallback: true,
149
+ maxRetries: 1, // Allow 1 retry (2 total attempts)
150
+ retryDelay: 100, // Short delay (won't be hit due to FAST->THOROUGH)
151
+ });
152
+ const url = "http://example.com/retry";
153
+ const expectedHtml = "<html><body>Retry Success</body></html>";
154
+ const expectedTitle = "Retry Title";
155
+ const mockPage = createMockPage();
156
+ const failureError = new Error("Initial fetch failed");
157
+ // Fail first browser attempt (FAST mode), succeed second (THOROUGH mode)
158
+ // Note: acquirePage is called for *both* FAST and THOROUGH in the first attempt
159
+ mockAcquirePage
160
+ .mockRejectedValueOnce(failureError) // Fails in FAST
161
+ .mockResolvedValueOnce(mockPage); // Succeeds in THOROUGH
162
+ // Fail axios fallback
163
+ mockAxiosGet.mockRejectedValue(new Error("Axios fallback failed"));
164
+ const result = await engine.fetchHTML(url); // Await directly
165
+ expect(mockAxiosGet).toHaveBeenCalledTimes(2); // Fallback tried at start of FAST and start of THOROUGH
166
+ expect(mockAcquirePage).toHaveBeenCalledTimes(2); // Called for FAST (fail) then THOROUGH (success)
167
+ expect(mockPage.goto).toHaveBeenCalledTimes(1); // Only called on the successful THOROUGH attempt
168
+ expect(result.title).toBe(expectedTitle);
169
+ expect(result.html).toBe(expectedHtml);
170
+ });
171
+ it("should exhaust retries and throw if browser fetch consistently fails", async () => {
172
+ const maxRetries = 1; // 2 total attempts
173
+ const retryDelay = 100;
174
+ engine = new PlaywrightEngine({
175
+ useHttpFallback: true,
176
+ maxRetries: maxRetries,
177
+ retryDelay: retryDelay,
178
+ });
179
+ const url = "http://example.com/persistent-fail";
180
+ const failureError = new Error("Browser fetch failed persistently");
181
+ mockAcquirePage.mockRejectedValue(failureError); // Always fail
182
+ mockAxiosGet.mockRejectedValue(new Error("Axios fallback failed")); // Always fail fallback
183
+ vi.useFakeTimers();
184
+ const fetchPromise = engine.fetchHTML(url);
185
+ const maxAttempts = maxRetries + 1; // 2
186
+ // Need to advance timers ONLY for the delay *between* overall attempts
187
+ // Attempt 1 (FAST -> THOROUGH) happens without delay.
188
+ // Then delay happens. Then Attempt 2 (FAST -> THOROUGH) happens.
189
+ if (maxRetries > 0) {
190
+ // Only advance if retries > 0
191
+ await vi.advanceTimersByTimeAsync(retryDelay + 10);
192
+ }
193
+ // Removed the loop for advancing timers multiple times
194
+ // Final error message should reflect the *last* error encountered
195
+ // In this case, the error comes from the _fetchWithBrowser call (mockAcquirePage rejection)
196
+ await expect(fetchPromise).rejects.toThrow(`Failed to fetch ${url} after ${maxAttempts} attempts: ${failureError.message}`);
197
+ vi.useRealTimers();
198
+ // Fallback called at start of attempt 1 and start of attempt 2
199
+ expect(mockAxiosGet).toHaveBeenCalledTimes(2);
200
+ // acquirePage called for FAST (fails), THOROUGH (fails) on attempt 1, then THOROUGH (fails) on attempt 2
201
+ expect(mockAcquirePage).toHaveBeenCalledTimes(3);
202
+ });
203
+ it("should call pool cleanup when engine cleanup is called", async () => {
204
+ engine = new PlaywrightEngine(); // Create default engine for this test
205
+ // --- Add initialization step ---
206
+ const initUrl = "http://example.com/initpool";
207
+ const mockInitPage = createMockPage();
208
+ mockAxiosGet.mockRejectedValueOnce(new Error("Axios fallback failed for init")); // Ensure browser path
209
+ mockAcquirePage.mockResolvedValueOnce(mockInitPage); // Provide a page
210
+ try {
211
+ await engine.fetchHTML(initUrl);
212
+ }
213
+ catch (e) {
214
+ /* Ignore errors during init fetch */
215
+ }
216
+ // Reset mocks if needed, although clearAllMocks runs in next beforeEach
217
+ mockAxiosGet.mockClear(); // Clear init call history
218
+ mockAcquirePage.mockClear();
219
+ // --- End initialization step ---
220
+ await engine.cleanup();
221
+ // Check prototype spy was called
222
+ expect(PlaywrightBrowserPool.prototype.cleanup).toHaveBeenCalledTimes(1);
223
+ expect(mockCleanupPool).toHaveBeenCalledTimes(1); // Check the specific mock function too
224
+ });
225
+ it("should handle errors during HTTP fallback", async () => {
226
+ // Mock fetchHTMLWithHttpFallback to reject
227
+ vi.spyOn(PlaywrightEngine.prototype, "fetchHTMLWithHttpFallback").mockRejectedValue(new Error("HTTP Fallback Failed"));
228
+ engine = new PlaywrightEngine({ useHttpFallback: true });
229
+ // We expect it to fail the fallback, then proceed to playwright (which is mocked to succeed)
230
+ const result = await engine.fetchHTML("http://example.com/fail-fallback");
231
+ expect(result).toBeDefined(); // Should still succeed via Playwright mock
232
+ expect(PlaywrightBrowserPool.prototype.acquirePage).toHaveBeenCalled();
233
+ });
234
+ it("should handle pool acquirePage errors", async () => {
235
+ // Mock acquirePage to reject
236
+ vi.mocked(PlaywrightBrowserPool.prototype.acquirePage).mockRejectedValue(new Error("Pool Error"));
237
+ engine = new PlaywrightEngine({ useHttpFallback: false }); // Disable fallback
238
+ await expect(engine.fetchHTML("http://example.com/pool-error")).rejects.toThrow(/Fetch failed after/);
239
+ expect(PlaywrightBrowserPool.prototype.acquirePage).toHaveBeenCalledTimes(1 + 3); // Initial + 3 retries
240
+ });
241
+ it("should handle page.goto errors", async () => {
242
+ // Mock page.goto to reject
243
+ const mockPage = createMockPage();
244
+ vi.mocked(browserPoolMock.acquirePage).mockResolvedValue(mockPage);
245
+ vi.mocked(mockPage.goto).mockRejectedValue(new Error("Navigation Failed"));
246
+ engine = new PlaywrightEngine({ useHttpFallback: false });
247
+ await expect(engine.fetchHTML("http://example.com/goto-error")).rejects.toThrow(/Fetch failed after/);
248
+ expect(mockPage.goto).toHaveBeenCalledTimes(1 + 3); // Initial + 3 retries
249
+ });
250
+ // Example for testing retry logic
251
+ it("should exhaust retries and throw if browser fetch consistently fails", async () => {
252
+ const mockPage = createMockPage();
253
+ vi.mocked(browserPoolMock.acquirePage).mockResolvedValue(mockPage);
254
+ vi.mocked(mockPage.goto).mockRejectedValue(new Error("Consistent Fail"));
255
+ engine = new PlaywrightEngine({
256
+ maxRetries: 2,
257
+ retryDelay: 10,
258
+ useHttpFallback: false,
259
+ }); // 2 retries
260
+ await expect(engine.fetchHTML("http://example.com/retry-fail")).rejects.toThrow(/Fetch failed after 2 retries: Playwright navigation failed: Consistent Fail/);
261
+ // acquirePage called once initially
262
+ // goto called initial + 2 retries = 3 times
263
+ expect(browserPoolMock.acquirePage).toHaveBeenCalledTimes(1);
264
+ expect(mockPage.goto).toHaveBeenCalledTimes(3);
265
+ });
266
+ it("should switch to thorough mode on first fast mode failure", async () => {
267
+ const mockPage = createMockPage();
268
+ vi.mocked(browserPoolMock.acquirePage).mockResolvedValue(mockPage);
269
+ // Fail once, then succeed
270
+ vi.mocked(mockPage.goto)
271
+ .mockRejectedValueOnce(new Error("Fast Mode Fail"))
272
+ .mockResolvedValue(createMockResponse()); // Succeed on second (thorough) try
273
+ vi.mocked(mockPage.content).mockResolvedValue("<html>Thorough Success</html>");
274
+ vi.mocked(mockPage.title).mockResolvedValue("Thorough Title");
275
+ engine = new PlaywrightEngine({
276
+ defaultFastMode: true,
277
+ maxRetries: 1,
278
+ retryDelay: 10,
279
+ useHttpFallback: false,
280
+ });
281
+ // Mock simulateHumanBehavior before calling fetchHTML
282
+ const simulateSpy = vi
283
+ .spyOn(engine, "simulateHumanBehavior")
284
+ .mockResolvedValue(undefined);
285
+ const result = await engine.fetchHTML("http://example.com/fast-fail");
286
+ expect(mockPage.goto).toHaveBeenCalledTimes(2);
287
+ expect(result.html).toBe("<html>Thorough Success</html>");
288
+ expect(result.title).toBe("Thorough Title");
289
+ // Check simulateHumanBehavior was called on the second (thorough) attempt
290
+ expect(simulateSpy).toHaveBeenCalledTimes(1);
291
+ simulateSpy.mockRestore(); // Clean up spy
292
+ });
293
+ // TODO: Test headed mode fallback logic
294
+ // TODO: Test caching logic
295
+ }, {
296
+ // Increase timeout for tests involving retries and delays
297
+ timeout: 20000,
298
+ });
299
+ //# sourceMappingURL=PlaywrightEngine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlaywrightEngine.test.js","sourceRoot":"","sources":["../src/PlaywrightEngine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { HTMLFetchResult, BrowserMetrics } from "./types";
2
+ import type { IEngine } from "./IEngine";
3
+ /**
4
+ * PuppeteerEngine - A headless browser engine that uses Puppeteer to render JavaScript-heavy pages
5
+ * Ideal for SPAs and sites with anti-scraping measures
6
+ */
7
+ export declare class PuppeteerEngine implements IEngine {
8
+ private static browserPool;
9
+ private readonly queue;
10
+ private readonly cache;
11
+ private readonly cacheTTL;
12
+ private isInitializing;
13
+ constructor(concurrentPages?: number);
14
+ private initializeBrowserPool;
15
+ fetchHTML(url: string): Promise<HTMLFetchResult>;
16
+ private checkCache;
17
+ private cacheResult;
18
+ cleanup(): Promise<void>;
19
+ getMetrics(): BrowserMetrics[];
20
+ }
21
+ //# sourceMappingURL=PuppeteerEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PuppeteerEngine.d.ts","sourceRoot":"","sources":["../src/PuppeteerEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC;;;GAGG;AACH,qBAAa,eAAgB,YAAW,OAAO;IAC7C,OAAO,CAAC,MAAM,CAAC,WAAW,CAA4B;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,cAAc,CAAkB;gBAE5B,eAAe,SAAI;YAmBjB,qBAAqB;IA6B7B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAiUtD,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,WAAW;IAoBb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B,UAAU,IAAI,cAAc,EAAE;CAG/B"}