@crawlee/browser-pool 4.0.0-beta.28 → 4.0.0-beta.280
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.
- package/README.md +15 -15
- package/abstract-classes/browser-controller.d.ts +100 -29
- package/abstract-classes/browser-controller.js +70 -24
- package/abstract-classes/browser-plugin.d.ts +25 -22
- package/abstract-classes/browser-plugin.js +21 -13
- package/anonymize-proxy.d.ts +6 -2
- package/anonymize-proxy.js +9 -5
- package/browser-pool.d.ts +110 -51
- package/browser-pool.js +318 -147
- package/events.d.ts +2 -4
- package/events.js +0 -2
- package/fingerprinting/hooks.d.ts +0 -1
- package/fingerprinting/hooks.js +26 -10
- package/fingerprinting/types.d.ts +3 -34
- package/fingerprinting/types.js +0 -2
- package/fingerprinting/utils.d.ts +0 -1
- package/fingerprinting/utils.js +5 -6
- package/index.d.ts +15 -7
- package/index.js +6 -3
- package/launch-context.d.ts +15 -5
- package/launch-context.js +15 -10
- package/package.json +15 -15
- package/playwright/playwright-browser.d.ts +3 -6
- package/playwright/playwright-browser.js +17 -17
- package/playwright/playwright-controller.d.ts +1 -1
- package/playwright/playwright-controller.js +10 -6
- package/playwright/playwright-plugin.d.ts +3 -7
- package/playwright/playwright-plugin.js +18 -17
- package/playwright/remote-playwright-plugin.d.ts +29 -0
- package/playwright/remote-playwright-plugin.js +38 -0
- package/proxy-server.d.ts +0 -1
- package/proxy-server.js +0 -1
- package/puppeteer/puppeteer-controller.d.ts +1 -1
- package/puppeteer/puppeteer-controller.js +29 -20
- package/puppeteer/puppeteer-plugin.d.ts +12 -4
- package/puppeteer/puppeteer-plugin.js +73 -49
- package/puppeteer/remote-puppeteer-plugin.d.ts +22 -0
- package/puppeteer/remote-puppeteer-plugin.js +31 -0
- package/remote-browser-plugin.d.ts +49 -0
- package/remote-browser-plugin.js +63 -0
- package/remote-browser-provider.d.ts +81 -0
- package/remote-browser-provider.js +65 -0
- package/utils.d.ts +7 -1
- package/utils.js +19 -1
- package/abstract-classes/browser-controller.d.ts.map +0 -1
- package/abstract-classes/browser-controller.js.map +0 -1
- package/abstract-classes/browser-plugin.d.ts.map +0 -1
- package/abstract-classes/browser-plugin.js.map +0 -1
- package/anonymize-proxy.d.ts.map +0 -1
- package/anonymize-proxy.js.map +0 -1
- package/browser-pool.d.ts.map +0 -1
- package/browser-pool.js.map +0 -1
- package/container-proxy-server.d.ts +0 -12
- package/container-proxy-server.d.ts.map +0 -1
- package/container-proxy-server.js +0 -43
- package/container-proxy-server.js.map +0 -1
- package/events.d.ts.map +0 -1
- package/events.js.map +0 -1
- package/fingerprinting/hooks.d.ts.map +0 -1
- package/fingerprinting/hooks.js.map +0 -1
- package/fingerprinting/types.d.ts.map +0 -1
- package/fingerprinting/types.js.map +0 -1
- package/fingerprinting/utils.d.ts.map +0 -1
- package/fingerprinting/utils.js.map +0 -1
- package/index.d.ts.map +0 -1
- package/index.js.map +0 -1
- package/launch-context.d.ts.map +0 -1
- package/launch-context.js.map +0 -1
- package/logger.d.ts +0 -3
- package/logger.d.ts.map +0 -1
- package/logger.js +0 -5
- package/logger.js.map +0 -1
- package/playwright/playwright-browser.d.ts.map +0 -1
- package/playwright/playwright-browser.js.map +0 -1
- package/playwright/playwright-controller.d.ts.map +0 -1
- package/playwright/playwright-controller.js.map +0 -1
- package/playwright/playwright-plugin.d.ts.map +0 -1
- package/playwright/playwright-plugin.js.map +0 -1
- package/proxy-server.d.ts.map +0 -1
- package/proxy-server.js.map +0 -1
- package/puppeteer/puppeteer-controller.d.ts.map +0 -1
- package/puppeteer/puppeteer-controller.js.map +0 -1
- package/puppeteer/puppeteer-plugin.d.ts.map +0 -1
- package/puppeteer/puppeteer-plugin.js.map +0 -1
- package/utils.d.ts.map +0 -1
- package/utils.js.map +0 -1
package/anonymize-proxy.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
export const anonymizeProxySugar = async (proxyUrl, username, password) => {
|
|
1
|
+
/** @internal */
|
|
2
|
+
export const anonymizeProxySugar = async (proxyUrl, username, password, options) => {
|
|
3
3
|
if (proxyUrl) {
|
|
4
4
|
const url = new URL(proxyUrl);
|
|
5
5
|
if (username || password) {
|
|
6
6
|
url.username = username ?? '';
|
|
7
7
|
url.password = password ?? '';
|
|
8
8
|
}
|
|
9
|
-
if (url.username || url.password) {
|
|
9
|
+
if (url.username || url.password || options?.ignoreProxyCertificate) {
|
|
10
10
|
// trim off trailing slash if it's present
|
|
11
11
|
const proxyUrlString = url.href.endsWith('/') ? url.href.slice(0, -1) : url.href;
|
|
12
|
-
const
|
|
12
|
+
const { anonymizeProxy, closeAnonymizedProxy } = await import('proxy-chain');
|
|
13
|
+
const anonymized = await anonymizeProxy({
|
|
14
|
+
url: proxyUrlString,
|
|
15
|
+
port: 0,
|
|
16
|
+
ignoreProxyCertificate: options?.ignoreProxyCertificate ?? false,
|
|
17
|
+
});
|
|
13
18
|
return [
|
|
14
19
|
anonymized,
|
|
15
20
|
async () => {
|
|
@@ -21,4 +26,3 @@ export const anonymizeProxySugar = async (proxyUrl, username, password) => {
|
|
|
21
26
|
}
|
|
22
27
|
return [undefined, async () => { }];
|
|
23
28
|
};
|
|
24
|
-
//# sourceMappingURL=anonymize-proxy.js.map
|
package/browser-pool.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { IBrowserPool, NewPageOptions, PageState } from '@crawlee/types';
|
|
1
2
|
import type { BrowserFingerprintWithHeaders } from 'fingerprint-generator';
|
|
2
3
|
import { FingerprintGenerator } from 'fingerprint-generator';
|
|
3
4
|
import { FingerprintInjector } from 'fingerprint-injector';
|
|
@@ -53,6 +54,16 @@ export interface BrowserPoolOptions<Plugin extends BrowserPlugin = BrowserPlugin
|
|
|
53
54
|
* @default 20
|
|
54
55
|
*/
|
|
55
56
|
maxOpenPagesPerBrowser?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Maximum number of browser processes alive at once. A browser counts from the moment its launch starts until it
|
|
59
|
+
* actually closes — a retired browser that is still finishing its last pages still occupies a slot. Once the
|
|
60
|
+
* limit is reached, {@link BrowserPool.newPage|newPage} waits for a slot (a browser closing, or an open
|
|
61
|
+
* browser with page capacity to spare) instead of launching another. Set it to a remote browser service's
|
|
62
|
+
* concurrent-session limit to avoid `429` errors.
|
|
63
|
+
*
|
|
64
|
+
* @default Infinity
|
|
65
|
+
*/
|
|
66
|
+
maxOpenBrowsers?: number;
|
|
56
67
|
/**
|
|
57
68
|
* Browsers tend to get bloated after processing a lot of pages. This option
|
|
58
69
|
* configures the maximum number of processed pages after which the browser will
|
|
@@ -246,38 +257,37 @@ export interface BrowserPoolHooks<BC extends BrowserController, LC extends Launc
|
|
|
246
257
|
* });
|
|
247
258
|
* ```
|
|
248
259
|
*/
|
|
249
|
-
export declare class BrowserPool<Options extends BrowserPoolOptions = BrowserPoolOptions, BrowserPlugins extends BrowserPlugin[] = InferBrowserPluginArray<Options['browserPlugins']>, BrowserControllerReturn extends BrowserController = ReturnType<BrowserPlugins[number]['createController']>, LaunchContextReturn extends LaunchContext = ReturnType<BrowserPlugins[number]['createLaunchContext']>, PageOptions = Parameters<BrowserControllerReturn['newPage']>[0], PageReturn extends UnwrapPromise<ReturnType<BrowserControllerReturn['newPage']>> = UnwrapPromise<ReturnType<BrowserControllerReturn['newPage']>>> extends TypedEmitter<BrowserPoolEvents<BrowserControllerReturn, PageReturn>> {
|
|
260
|
+
export declare class BrowserPool<Options extends BrowserPoolOptions = BrowserPoolOptions, BrowserPlugins extends BrowserPlugin[] = InferBrowserPluginArray<Options['browserPlugins']>, BrowserControllerReturn extends BrowserController = ReturnType<BrowserPlugins[number]['createController']>, LaunchContextReturn extends LaunchContext = ReturnType<BrowserPlugins[number]['createLaunchContext']>, PageOptions = Parameters<BrowserControllerReturn['newPage']>[0], PageReturn extends UnwrapPromise<ReturnType<BrowserControllerReturn['newPage']>> = UnwrapPromise<ReturnType<BrowserControllerReturn['newPage']>>> extends TypedEmitter<BrowserPoolEvents<BrowserControllerReturn, PageReturn>> implements IBrowserPool<PageReturn> {
|
|
261
|
+
#private;
|
|
250
262
|
browserPlugins: BrowserPlugins;
|
|
251
|
-
|
|
252
|
-
retireBrowserAfterPageCount: number;
|
|
253
|
-
operationTimeoutMillis: number;
|
|
254
|
-
closeInactiveBrowserAfterMillis: number;
|
|
255
|
-
useFingerprints?: boolean;
|
|
263
|
+
/** @internal */
|
|
256
264
|
fingerprintOptions: FingerprintOptions;
|
|
257
|
-
|
|
258
|
-
postLaunchHooks: PostLaunchHook<BrowserControllerReturn>[];
|
|
259
|
-
prePageCreateHooks: PrePageCreateHook<BrowserControllerReturn, PageOptions>[];
|
|
260
|
-
postPageCreateHooks: PostPageCreateHook<BrowserControllerReturn, PageReturn>[];
|
|
261
|
-
prePageCloseHooks: PrePageCloseHook<BrowserControllerReturn, PageReturn>[];
|
|
262
|
-
postPageCloseHooks: PostPageCloseHook<BrowserControllerReturn>[];
|
|
263
|
-
pageCounter: number;
|
|
264
|
-
pages: Map<string, PageReturn>;
|
|
265
|
-
pageIds: WeakMap<PageReturn, string>;
|
|
266
|
-
startingBrowserControllers: Set<BrowserControllerReturn>;
|
|
267
|
-
activeBrowserControllers: Set<BrowserControllerReturn>;
|
|
268
|
-
retiredBrowserControllers: Set<BrowserControllerReturn>;
|
|
269
|
-
pageToBrowserController: WeakMap<PageReturn, BrowserControllerReturn>;
|
|
265
|
+
/** @internal */
|
|
270
266
|
fingerprintInjector?: FingerprintInjector;
|
|
271
267
|
fingerprintGenerator?: FingerprintGenerator;
|
|
268
|
+
/** @internal */
|
|
272
269
|
fingerprintCache?: QuickLRU<string, BrowserFingerprintWithHeaders>;
|
|
270
|
+
private pages;
|
|
271
|
+
private activeBrowserControllers;
|
|
272
|
+
private retiredBrowserControllers;
|
|
273
273
|
private browserKillerInterval?;
|
|
274
|
-
private browserRetireInterval?;
|
|
275
|
-
private limiter;
|
|
276
274
|
constructor(options: Options & BrowserPoolHooks<BrowserControllerReturn, LaunchContextReturn, PageReturn>);
|
|
277
275
|
/**
|
|
278
276
|
* Opens a new page in one of the running browsers or launches
|
|
279
277
|
* a new browser and opens a page there, if no browsers are active,
|
|
280
278
|
* or their page limits have been exceeded.
|
|
279
|
+
*
|
|
280
|
+
* **Session injection (best-effort):** When a {@link NewPageOptions.session|session} is
|
|
281
|
+
* provided, this implementation uses it as a cache key for browser fingerprints (when
|
|
282
|
+
* fingerprinting is enabled) and reads
|
|
283
|
+
* {@link ProxyInfo.url|session.proxyInfo.url} /
|
|
284
|
+
* {@link ProxyInfo.ignoreTlsErrors|session.proxyInfo.ignoreTlsErrors} as defaults
|
|
285
|
+
* for `proxyUrl` and `ignoreTlsErrors` respectively. Explicit `proxyUrl` /
|
|
286
|
+
* `ignoreTlsErrors` values in the options take precedence.
|
|
287
|
+
*
|
|
288
|
+
* Beyond fingerprint caching and proxy configuration, no other session
|
|
289
|
+
* properties are consumed — cookie and header injection remain the
|
|
290
|
+
* crawler's responsibility.
|
|
281
291
|
*/
|
|
282
292
|
newPage(options?: BrowserPoolNewPageOptions<PageOptions, BrowserPlugins[number]>): Promise<PageReturn>;
|
|
283
293
|
/**
|
|
@@ -335,7 +345,6 @@ export declare class BrowserPool<Options extends BrowserPoolOptions = BrowserPoo
|
|
|
335
345
|
* until it's closed.
|
|
336
346
|
*/
|
|
337
347
|
getPageId(page: PageReturn): string | undefined;
|
|
338
|
-
private _createPageForBrowser;
|
|
339
348
|
/**
|
|
340
349
|
* Removes a browser controller from the pool. The underlying
|
|
341
350
|
* browser will be closed after all its pages are closed.
|
|
@@ -347,6 +356,44 @@ export declare class BrowserPool<Options extends BrowserPoolOptions = BrowserPoo
|
|
|
347
356
|
* closed after all its pages are closed.
|
|
348
357
|
*/
|
|
349
358
|
retireBrowserByPage(page: PageReturn): void;
|
|
359
|
+
/**
|
|
360
|
+
* Releases a page back to the pool. The page is closed and, if the
|
|
361
|
+
* optional `error` is a {@link SessionError} (including
|
|
362
|
+
* {@link SessionRetiredError}), the browser controller that served
|
|
363
|
+
* the page is retired so that the finished session's state (cookies,
|
|
364
|
+
* storage, etc.) cannot leak into future sessions.
|
|
365
|
+
*
|
|
366
|
+
* This is the primary way the crawler should return pages to the pool.
|
|
367
|
+
*
|
|
368
|
+
* @param page The page to release.
|
|
369
|
+
* @param options.error The error that caused the page to be released, if any.
|
|
370
|
+
*/
|
|
371
|
+
closePage(page: PageReturn, options?: {
|
|
372
|
+
error?: Error;
|
|
373
|
+
}): Promise<void>;
|
|
374
|
+
/**
|
|
375
|
+
* Extracts the relevant state (currently just cookies) from a page via its
|
|
376
|
+
* owning {@link BrowserController}. Returns empty state when the page is
|
|
377
|
+
* no longer associated with a controller.
|
|
378
|
+
*
|
|
379
|
+
* As with {@link BrowserPool.injectPageState}, cookies are isolated per
|
|
380
|
+
* page only when the pool is configured with `useIncognitoPages: true`.
|
|
381
|
+
* With the default `useIncognitoPages: false`, the extracted cookies
|
|
382
|
+
* include those set by any sibling page sharing the same browser.
|
|
383
|
+
*/
|
|
384
|
+
extractPageState(page: PageReturn): Promise<PageState>;
|
|
385
|
+
/**
|
|
386
|
+
* Injects state into a page via its owning {@link BrowserController}.
|
|
387
|
+
*
|
|
388
|
+
* No-op when the page is no longer associated with a controller.
|
|
389
|
+
*
|
|
390
|
+
* Note that cookies are isolated per page only when the pool is configured
|
|
391
|
+
* with `useIncognitoPages: true` — each page then gets its own browser
|
|
392
|
+
* context. With the default `useIncognitoPages: false`, all pages in a
|
|
393
|
+
* browser share a single context, so injected cookies are visible to every
|
|
394
|
+
* page served by that browser.
|
|
395
|
+
*/
|
|
396
|
+
injectPageState(page: PageReturn, state: PageState): Promise<void>;
|
|
350
397
|
/**
|
|
351
398
|
* Removes all active browsers from the pool. The browsers will be
|
|
352
399
|
* closed after all their pages are closed.
|
|
@@ -357,32 +404,53 @@ export declare class BrowserPool<Options extends BrowserPoolOptions = BrowserPoo
|
|
|
357
404
|
* @return {Promise<void>}
|
|
358
405
|
*/
|
|
359
406
|
closeAllBrowsers(): Promise<void>;
|
|
407
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
360
408
|
/**
|
|
361
|
-
* Closes
|
|
409
|
+
* Closes every managed browser and empties the pool, which stays usable afterwards — a crawler releases its
|
|
410
|
+
* browsers when a run ends and may start another run on the same pool.
|
|
411
|
+
*/
|
|
412
|
+
releaseAllBrowsers(): Promise<void>;
|
|
413
|
+
/**
|
|
414
|
+
* Closes all managed browsers and tears the pool down for good: its intervals are cleared without being
|
|
415
|
+
* re-armed and its listeners are dropped, so it cannot be used again.
|
|
362
416
|
*/
|
|
363
417
|
destroy(): Promise<void>;
|
|
364
|
-
private
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
*
|
|
369
|
-
* @
|
|
370
|
-
*/
|
|
371
|
-
|
|
372
|
-
private _pickBrowserWithFreeCapacity;
|
|
373
|
-
private _closeInactiveRetiredBrowsers;
|
|
374
|
-
private _overridePageClose;
|
|
375
|
-
private _executeHooks;
|
|
376
|
-
private _closeRetiredBrowserWithNoPages;
|
|
377
|
-
private _initializeFingerprinting;
|
|
378
|
-
private _addFingerprintHooks;
|
|
418
|
+
private closeInactiveRetiredBrowsers;
|
|
419
|
+
/**
|
|
420
|
+
* Returns `true` if the pool can accept a new browser launch without exceeding `maxOpenBrowsers`.
|
|
421
|
+
* Counts starting, active, and retired browsers.
|
|
422
|
+
*
|
|
423
|
+
* @internal
|
|
424
|
+
*/
|
|
425
|
+
hasFreeBrowserSlot(): boolean;
|
|
379
426
|
}
|
|
380
|
-
export interface BrowserPoolNewPageOptions<PageOptions, BP extends BrowserPlugin> {
|
|
427
|
+
export interface BrowserPoolNewPageOptions<PageOptions, BP extends BrowserPlugin> extends NewPageOptions {
|
|
428
|
+
/**
|
|
429
|
+
* The proxy URL the pool uses internally to route the page: it keys browser
|
|
430
|
+
* reuse (with `browserPerProxy`, only a browser already on this proxy is
|
|
431
|
+
* reused), configures the launched browser, and is applied to incognito
|
|
432
|
+
* pages. When omitted, it is derived from the
|
|
433
|
+
* {@link NewPageOptions.session|session}'s `proxyInfo`; an explicit value
|
|
434
|
+
* here takes precedence.
|
|
435
|
+
*
|
|
436
|
+
* This is an implementation detail of the built-in `BrowserPool`'s proxy
|
|
437
|
+
* handling and is intentionally not part of the {@link IBrowserPool}
|
|
438
|
+
* contract — through that interface the proxy is supplied via the session.
|
|
439
|
+
*/
|
|
440
|
+
proxyUrl?: string;
|
|
381
441
|
/**
|
|
382
|
-
*
|
|
383
|
-
*
|
|
442
|
+
* Disable TLS certificate verification for MITM proxies. Applied both when
|
|
443
|
+
* launching a new browser and when creating a page in an existing one. When
|
|
444
|
+
* omitted, it is derived from the
|
|
445
|
+
* {@link NewPageOptions.session|session}'s `proxyInfo`; an explicit value
|
|
446
|
+
* here takes precedence.
|
|
447
|
+
*
|
|
448
|
+
* This is an implementation detail of the built-in `BrowserPool` and is
|
|
449
|
+
* intentionally not part of the {@link IBrowserPool} contract — through
|
|
450
|
+
* that interface, configure it via the session's `proxyInfo` or through the
|
|
451
|
+
* browser's `launchOptions`.
|
|
384
452
|
*/
|
|
385
|
-
|
|
453
|
+
ignoreTlsErrors?: boolean;
|
|
386
454
|
/**
|
|
387
455
|
* Some libraries (Playwright) allow you to open new pages with specific
|
|
388
456
|
* options. Use this property to set those options.
|
|
@@ -397,14 +465,6 @@ export interface BrowserPoolNewPageOptions<PageOptions, BP extends BrowserPlugin
|
|
|
397
465
|
* see the `newPageInNewBrowser` function.
|
|
398
466
|
*/
|
|
399
467
|
browserPlugin?: BP;
|
|
400
|
-
/**
|
|
401
|
-
* Proxy URL.
|
|
402
|
-
*/
|
|
403
|
-
proxyUrl?: string;
|
|
404
|
-
/**
|
|
405
|
-
* Proxy tier.
|
|
406
|
-
*/
|
|
407
|
-
proxyTier?: number;
|
|
408
468
|
}
|
|
409
469
|
export interface BrowserPoolNewPageInNewBrowserOptions<PageOptions, BP extends BrowserPlugin> {
|
|
410
470
|
/**
|
|
@@ -435,4 +495,3 @@ export interface BrowserPoolNewPageInNewBrowserOptions<PageOptions, BP extends B
|
|
|
435
495
|
*/
|
|
436
496
|
launchOptions?: BP['launchOptions'];
|
|
437
497
|
}
|
|
438
|
-
//# sourceMappingURL=browser-pool.d.ts.map
|