@crawlee/browser-pool 4.0.0-beta.9 → 4.0.0-beta.90

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 (83) hide show
  1. package/README.md +17 -13
  2. package/abstract-classes/browser-controller.d.ts +69 -10
  3. package/abstract-classes/browser-controller.js +8 -11
  4. package/abstract-classes/browser-plugin.d.ts +44 -9
  5. package/abstract-classes/browser-plugin.js +65 -7
  6. package/anonymize-proxy.d.ts +5 -2
  7. package/anonymize-proxy.js +9 -5
  8. package/browser-pool.d.ts +88 -14
  9. package/browser-pool.js +151 -28
  10. package/container-proxy-server.d.ts +0 -1
  11. package/container-proxy-server.js +0 -1
  12. package/events.d.ts +0 -1
  13. package/events.js +0 -1
  14. package/fingerprinting/hooks.d.ts +0 -1
  15. package/fingerprinting/hooks.js +24 -9
  16. package/fingerprinting/types.d.ts +0 -1
  17. package/fingerprinting/types.js +0 -1
  18. package/fingerprinting/utils.d.ts +0 -1
  19. package/fingerprinting/utils.js +0 -1
  20. package/index.d.ts +14 -7
  21. package/index.js +5 -3
  22. package/launch-context.d.ts +19 -3
  23. package/launch-context.js +12 -4
  24. package/package.json +7 -8
  25. package/playwright/playwright-browser.d.ts +0 -1
  26. package/playwright/playwright-browser.js +0 -1
  27. package/playwright/playwright-controller.d.ts +0 -1
  28. package/playwright/playwright-controller.js +20 -10
  29. package/playwright/playwright-plugin.d.ts +6 -3
  30. package/playwright/playwright-plugin.js +27 -5
  31. package/proxy-server.d.ts +0 -1
  32. package/proxy-server.js +0 -1
  33. package/puppeteer/puppeteer-controller.d.ts +0 -1
  34. package/puppeteer/puppeteer-controller.js +16 -9
  35. package/puppeteer/puppeteer-plugin.d.ts +3 -1
  36. package/puppeteer/puppeteer-plugin.js +81 -44
  37. package/remote-browser-pool.d.ts +172 -0
  38. package/remote-browser-pool.js +191 -0
  39. package/remote-browser-provider.d.ts +83 -0
  40. package/remote-browser-provider.js +67 -0
  41. package/utils.d.ts +7 -1
  42. package/utils.js +19 -1
  43. package/abstract-classes/browser-controller.d.ts.map +0 -1
  44. package/abstract-classes/browser-controller.js.map +0 -1
  45. package/abstract-classes/browser-plugin.d.ts.map +0 -1
  46. package/abstract-classes/browser-plugin.js.map +0 -1
  47. package/anonymize-proxy.d.ts.map +0 -1
  48. package/anonymize-proxy.js.map +0 -1
  49. package/browser-pool.d.ts.map +0 -1
  50. package/browser-pool.js.map +0 -1
  51. package/container-proxy-server.d.ts.map +0 -1
  52. package/container-proxy-server.js.map +0 -1
  53. package/events.d.ts.map +0 -1
  54. package/events.js.map +0 -1
  55. package/fingerprinting/hooks.d.ts.map +0 -1
  56. package/fingerprinting/hooks.js.map +0 -1
  57. package/fingerprinting/types.d.ts.map +0 -1
  58. package/fingerprinting/types.js.map +0 -1
  59. package/fingerprinting/utils.d.ts.map +0 -1
  60. package/fingerprinting/utils.js.map +0 -1
  61. package/index.d.ts.map +0 -1
  62. package/index.js.map +0 -1
  63. package/launch-context.d.ts.map +0 -1
  64. package/launch-context.js.map +0 -1
  65. package/logger.d.ts +0 -3
  66. package/logger.d.ts.map +0 -1
  67. package/logger.js +0 -5
  68. package/logger.js.map +0 -1
  69. package/playwright/playwright-browser.d.ts.map +0 -1
  70. package/playwright/playwright-browser.js.map +0 -1
  71. package/playwright/playwright-controller.d.ts.map +0 -1
  72. package/playwright/playwright-controller.js.map +0 -1
  73. package/playwright/playwright-plugin.d.ts.map +0 -1
  74. package/playwright/playwright-plugin.js.map +0 -1
  75. package/proxy-server.d.ts.map +0 -1
  76. package/proxy-server.js.map +0 -1
  77. package/puppeteer/puppeteer-controller.d.ts.map +0 -1
  78. package/puppeteer/puppeteer-controller.js.map +0 -1
  79. package/puppeteer/puppeteer-plugin.d.ts.map +0 -1
  80. package/puppeteer/puppeteer-plugin.js.map +0 -1
  81. package/tsconfig.build.tsbuildinfo +0 -1
  82. package/utils.d.ts.map +0 -1
  83. package/utils.js.map +0 -1
@@ -0,0 +1,172 @@
1
+ import type { IBrowserPool, NewPageOptions, PageState } from '@crawlee/types';
2
+ import type { BrowserPlugin } from './abstract-classes/browser-plugin.js';
3
+ import { BrowserPool } from './browser-pool.js';
4
+ import type { BrowserPoolHooks, BrowserPoolOptions } from './browser-pool.js';
5
+ import { RemoteBrowserProvider } from './remote-browser-provider.js';
6
+ /**
7
+ * The result of resolving a remote browser endpoint: the URL to connect to plus an optional opaque
8
+ * `context` object that is handed back to `release`.
9
+ */
10
+ export interface ResolvedRemoteEndpoint {
11
+ /** The browser endpoint URL to connect to. */
12
+ url: string;
13
+ /** Opaque metadata passed back to `release()` — e.g. session IDs, API tokens. */
14
+ context?: Record<string, unknown>;
15
+ }
16
+ /**
17
+ * A remote browser endpoint: either a static URL string, or a function called once per browser launch
18
+ * that returns a URL (optionally with a `context` for `release`).
19
+ *
20
+ * The function receives the `proxyUrl` resolved by Crawlee's proxy configuration for the launch, so it
21
+ * can forward it to the remote service's proxy API.
22
+ */
23
+ export type RemoteBrowserEndpoint = string | ((options?: {
24
+ proxyUrl?: string;
25
+ }) => string | ResolvedRemoteEndpoint | Promise<string | ResolvedRemoteEndpoint>);
26
+ /**
27
+ * The bridge a {@link RemoteBrowserPool} injects into a {@link BrowserPlugin} so the plugin can
28
+ * connect to a remote browser without owning any remote-session policy.
29
+ *
30
+ * The plugin only knows how to make the library-specific `connect()` call; everything else — resolving
31
+ * the endpoint, calling the user's `release()`, and guaranteeing release fires at most once — lives in
32
+ * the pool. The plugin calls {@link RemoteConnection.resolve|resolve} before connecting, stores the
33
+ * returned `token` on its launch context, and the controller later calls
34
+ * {@link RemoteConnection.release|release} with that token when the browser closes.
35
+ *
36
+ * @internal
37
+ */
38
+ export interface RemoteConnection {
39
+ /** Resolves the endpoint for a single browser launch. The `token` identifies the session for release. */
40
+ resolve(options?: {
41
+ proxyUrl?: string;
42
+ }): Promise<{
43
+ url: string;
44
+ token: number;
45
+ }>;
46
+ /** Releases the remote session for `token`. Idempotent — safe to call from both `close()` and `kill()`. */
47
+ release(token: number): Promise<void>;
48
+ }
49
+ /**
50
+ * Per-plugin remote connection parameters, passed to {@link BrowserPlugin.useRemoteConnection}.
51
+ * The endpoint is supplied per-launch via {@link RemoteConnection}; these are the static connect()
52
+ * parameters (protocol, headers, timeouts, …).
53
+ */
54
+ export interface RemoteConnectionParameters {
55
+ /**
56
+ * Playwright only: which protocol to connect with. `'cdp'` uses `connectOverCDP()` (the default),
57
+ // @ts-ignore optional peer dependency or compatibility with es2022
58
+ * `'playwright'` uses `connect()` (Playwright's own WebSocket protocol). Ignored by Puppeteer.
59
+ */
60
+ protocol?: 'cdp' | 'playwright';
61
+ /** Extra options forwarded to the library `connect()` / `connectOverCDP()` call (endpoint excluded). */
62
+ connectOptions?: Record<string, unknown>;
63
+ }
64
+ export interface RemoteBrowserPoolOptions {
65
+ /**
66
+ * The browser plugin(s) used to connect to the remote service — e.g. `new PlaywrightPlugin(playwright.chromium)`
67
+ * or `new PuppeteerPlugin(puppeteer)`. The pool configures them for remote connection; do not set a local
68
+ * `launchOptions` on them.
69
+ */
70
+ browserPlugins: BrowserPlugin[];
71
+ /**
72
+ * The remote browser endpoint: a static URL, a function returning one per launch, or a
73
+ * {@link RemoteBrowserProvider} instance encapsulating a session create/release lifecycle.
74
+ */
75
+ endpoint: RemoteBrowserEndpoint | RemoteBrowserProvider<any>;
76
+ /**
77
+ * Cleanup callback invoked when a browser closes, crashes, or the pool is destroyed. Receives the
78
+ * `context` returned by a function endpoint. Errors are caught and logged. Ignored when `endpoint`
79
+ * is a {@link RemoteBrowserProvider} (its own `release()` is used instead).
80
+ */
81
+ release?: (info: {
82
+ endpoint: string;
83
+ context?: Record<string, unknown>;
84
+ }) => unknown;
85
+ /**
86
+ * Maximum number of remote browsers open at once. When reached, {@link RemoteBrowserPool.newPage|newPage}
87
+ * waits for a browser to close before connecting a new one. Set it to your service's concurrent-session limit
88
+ * to avoid `429` errors. Defaults to the {@link RemoteBrowserProvider.maxOpenBrowsers|provider's value}, or
89
+ * `Infinity`.
90
+ */
91
+ maxOpenBrowsers?: number;
92
+ /** Static connect() parameters (Playwright protocol selection, headers, timeouts, …). */
93
+ connection?: RemoteConnectionParameters;
94
+ /** Extra {@link BrowserPool} options (lifecycle hooks, page limits, fingerprinting, …). */
95
+ browserPoolOptions?: Omit<BrowserPoolOptions, 'browserPlugins'> & BrowserPoolHooks<any, any, any>;
96
+ /** Fallback poll interval (ms) while waiting for a free browser slot. The wait is event-driven; this only bounds it. @default 500 */
97
+ slotPollIntervalMillis?: number;
98
+ }
99
+ /**
100
+ * The remote-connection configuration a browser crawler accepts on its `remoteBrowser` option. It is the
101
+ * {@link RemoteBrowserPoolOptions} a user supplies *minus* the parts the crawler provides itself — the
102
+ * `browserPlugins` (the crawler builds the correct one for its browser) and `browserPoolOptions` (taken from
103
+ * the crawler's own `browserPoolOptions`). This is what makes the crawler path both terse and mismatch-proof.
104
+ */
105
+ export type CrawlerRemoteBrowserOptions = Omit<RemoteBrowserPoolOptions, 'browserPlugins' | 'browserPoolOptions'>;
106
+ /**
107
+ * An {@link IBrowserPool} implementation for remote browser services.
108
+ *
109
+ * Unlike configuring a remote browser through a crawler's `launchContext`, this pool is the single owner
110
+ * of all remote-session concerns:
111
+ * - **endpoint resolution** — static URL, per-launch function, or {@link RemoteBrowserProvider};
112
+ * - **release lifecycle** — `release()` fires exactly once per session on close/crash/teardown (no leaks,
113
+ * no double-release);
114
+ * - **concurrency** — {@link RemoteBrowserPoolOptions.maxOpenBrowsers|maxOpenBrowsers} is enforced inside
115
+ * {@link RemoteBrowserPool.newPage|newPage}, which waits for a free slot rather than overshooting.
116
+ *
117
+ * The wrapped {@link BrowserPool} and its plugin only perform the library-specific `connect()` call.
118
+ *
119
+ * Pass an instance as the crawler's `browserPool` option:
120
+ *
121
+ * ```typescript
122
+ * import { PlaywrightPlugin, RemoteBrowserPool } from '@crawlee/browser-pool';
123
+ * import { PlaywrightCrawler } from 'crawlee';
124
+ // @ts-ignore optional peer dependency or compatibility with es2022
125
+ * import playwright from 'playwright';
126
+ *
127
+ * const browserPool = new RemoteBrowserPool({
128
+ * browserPlugins: [new PlaywrightPlugin(playwright.chromium)],
129
+ * endpoint: 'wss://production-sfo.browserless.io?token=xxx',
130
+ * maxOpenBrowsers: 2,
131
+ * });
132
+ *
133
+ * const crawler = new PlaywrightCrawler({ browserPool });
134
+ * ```
135
+ *
136
+ * @category Browser management
137
+ */
138
+ export declare class RemoteBrowserPool<Page = unknown> implements IBrowserPool<Page> {
139
+ /** The wrapped pool that performs the remote connections and serves pages. */
140
+ readonly browserPool: BrowserPool;
141
+ /** The wrapped pool viewed through the {@link IBrowserPool} contract (the bare type widens pages to `never`). */
142
+ private readonly pool;
143
+ private readonly registry;
144
+ private readonly slotPollIntervalMillis;
145
+ private readonly log;
146
+ /** Shared by all `newPage` callers waiting for a free slot, so they don't each register their own listeners. */
147
+ private _capacityChange?;
148
+ constructor(options: RemoteBrowserPoolOptions);
149
+ /** Maximum number of remote browsers that may be open at the same time. */
150
+ get maxOpenBrowsers(): number;
151
+ set maxOpenBrowsers(value: number);
152
+ /**
153
+ * Opens a new page, waiting first until {@link RemoteBrowserPoolOptions.maxOpenBrowsers|maxOpenBrowsers}
154
+ * allows it (either a new browser slot is free, or an active browser still has page capacity).
155
+ */
156
+ newPage(options?: NewPageOptions): Promise<Page>;
157
+ closePage(page: Page, options?: {
158
+ error?: Error;
159
+ }): Promise<void>;
160
+ extractPageState(page: Page): Promise<PageState>;
161
+ injectPageState(page: Page, state: PageState): Promise<void>;
162
+ /** Closes all browsers, releases any still-open remote sessions, and tears down the wrapped pool. */
163
+ destroy(): Promise<void>;
164
+ /** Resolves once the wrapped pool can serve another page without exceeding `maxOpenBrowsers`. */
165
+ private _waitForFreeSlot;
166
+ /**
167
+ * Resolves on the next browser-retired / page-closed event, or after `slotPollIntervalMillis`. All
168
+ * concurrently-waiting `newPage` calls share a single promise (and a single pair of event listeners)
169
+ * per tick, so a fleet of saturated callers doesn't fan out into N listener pairs on the pool.
170
+ */
171
+ private _nextCapacityChange;
172
+ }
@@ -0,0 +1,191 @@
1
+ import { serviceLocator } from '@crawlee/core';
2
+ import { BrowserPool } from './browser-pool.js';
3
+ import { RemoteBrowserProvider } from './remote-browser-provider.js';
4
+ /**
5
+ * Owns the lifecycle of remote browser sessions for a single {@link RemoteBrowserPool}: endpoint
6
+ * resolution, the user's `release()` callback, and a release-at-most-once guarantee. Implements
7
+ * {@link RemoteConnection} so it can be injected into a plugin.
8
+ */
9
+ class RemoteSessionRegistry {
10
+ endpoint;
11
+ onRelease;
12
+ log;
13
+ sessions = new Map();
14
+ nextToken = 0;
15
+ constructor(endpoint, onRelease, log) {
16
+ this.endpoint = endpoint;
17
+ this.onRelease = onRelease;
18
+ this.log = log;
19
+ }
20
+ async resolve(options) {
21
+ const resolved = typeof this.endpoint === 'function' ? await this.endpoint(options) : this.endpoint;
22
+ let result;
23
+ if (typeof resolved === 'string') {
24
+ if (!resolved)
25
+ throw new Error('Remote browser endpoint resolved to an empty string.');
26
+ result = { url: resolved };
27
+ }
28
+ else if (!resolved?.url) {
29
+ throw new Error("Remote browser endpoint() must return a URL string or an object with a non-empty 'url'.");
30
+ }
31
+ else {
32
+ result = resolved;
33
+ }
34
+ const token = this.nextToken++;
35
+ this.sessions.set(token, { url: result.url, context: result.context, released: false });
36
+ return { url: result.url, token };
37
+ }
38
+ async release(token) {
39
+ const session = this.sessions.get(token);
40
+ // Release at most once per session — guards a close()/teardown race (the `released` flag is set
41
+ // synchronously before the awaited onRelease, so releaseAll() can't double-fire an in-flight release).
42
+ if (!session || session.released)
43
+ return;
44
+ session.released = true;
45
+ try {
46
+ await this.onRelease?.({ endpoint: session.url, context: session.context });
47
+ }
48
+ catch (err) {
49
+ this.log.warning('Remote browser release() failed.', { error: err?.message });
50
+ }
51
+ finally {
52
+ this.sessions.delete(token);
53
+ }
54
+ }
55
+ /** Releases every session that is still open. Called on pool teardown so no remote session leaks. */
56
+ async releaseAll() {
57
+ await Promise.all([...this.sessions.keys()].map(async (token) => this.release(token)));
58
+ }
59
+ }
60
+ /**
61
+ * An {@link IBrowserPool} implementation for remote browser services.
62
+ *
63
+ * Unlike configuring a remote browser through a crawler's `launchContext`, this pool is the single owner
64
+ * of all remote-session concerns:
65
+ * - **endpoint resolution** — static URL, per-launch function, or {@link RemoteBrowserProvider};
66
+ * - **release lifecycle** — `release()` fires exactly once per session on close/crash/teardown (no leaks,
67
+ * no double-release);
68
+ * - **concurrency** — {@link RemoteBrowserPoolOptions.maxOpenBrowsers|maxOpenBrowsers} is enforced inside
69
+ * {@link RemoteBrowserPool.newPage|newPage}, which waits for a free slot rather than overshooting.
70
+ *
71
+ * The wrapped {@link BrowserPool} and its plugin only perform the library-specific `connect()` call.
72
+ *
73
+ * Pass an instance as the crawler's `browserPool` option:
74
+ *
75
+ * ```typescript
76
+ * import { PlaywrightPlugin, RemoteBrowserPool } from '@crawlee/browser-pool';
77
+ * import { PlaywrightCrawler } from 'crawlee';
78
+ * import playwright from 'playwright';
79
+ *
80
+ * const browserPool = new RemoteBrowserPool({
81
+ * browserPlugins: [new PlaywrightPlugin(playwright.chromium)],
82
+ * endpoint: 'wss://production-sfo.browserless.io?token=xxx',
83
+ * maxOpenBrowsers: 2,
84
+ * });
85
+ *
86
+ * const crawler = new PlaywrightCrawler({ browserPool });
87
+ * ```
88
+ *
89
+ * @category Browser management
90
+ */
91
+ export class RemoteBrowserPool {
92
+ /** The wrapped pool that performs the remote connections and serves pages. */
93
+ browserPool;
94
+ /** The wrapped pool viewed through the {@link IBrowserPool} contract (the bare type widens pages to `never`). */
95
+ pool;
96
+ registry;
97
+ slotPollIntervalMillis;
98
+ log;
99
+ /** Shared by all `newPage` callers waiting for a free slot, so they don't each register their own listeners. */
100
+ _capacityChange;
101
+ constructor(options) {
102
+ const { browserPlugins, endpoint, release, maxOpenBrowsers, connection = {}, browserPoolOptions = {}, slotPollIntervalMillis = 500, } = options;
103
+ this.log = serviceLocator.getLogger().child({ prefix: 'RemoteBrowserPool' });
104
+ this.slotPollIntervalMillis = slotPollIntervalMillis;
105
+ // A RemoteBrowserProvider carries its own endpoint, release, and maxOpenBrowsers.
106
+ const provider = endpoint instanceof RemoteBrowserProvider ? endpoint : undefined;
107
+ const resolvedEndpoint = provider
108
+ ? (opts) => provider.connect(opts)
109
+ : endpoint;
110
+ const resolvedRelease = provider
111
+ ? ({ context }) => provider.release(context)
112
+ : release;
113
+ const resolvedMax = maxOpenBrowsers ?? provider?.maxOpenBrowsers;
114
+ this.registry = new RemoteSessionRegistry(resolvedEndpoint, resolvedRelease, this.log);
115
+ // Wire every plugin for remote connection.
116
+ for (const plugin of browserPlugins) {
117
+ plugin.useRemoteConnection(this.registry, connection);
118
+ }
119
+ this.browserPool = new BrowserPool({ ...browserPoolOptions, browserPlugins });
120
+ this.pool = this.browserPool;
121
+ // Release a browser's remote session once it closes. The registry dedupes (close() schedules a delayed
122
+ // kill(), so BROWSER_CLOSED can fire twice), and destroy()'s releaseAll() backstops any that never close.
123
+ this.browserPool.on("browserLaunched" /* BROWSER_POOL_EVENTS.BROWSER_LAUNCHED */, (controller) => {
124
+ controller.once("browserClosed" /* BROWSER_CONTROLLER_EVENTS.BROWSER_CLOSED */, () => {
125
+ const token = controller.launchContext._remoteToken;
126
+ if (token !== undefined)
127
+ void this.registry.release(token);
128
+ });
129
+ });
130
+ if (resolvedMax !== undefined) {
131
+ this.browserPool.maxOpenBrowsers = resolvedMax;
132
+ }
133
+ }
134
+ /** Maximum number of remote browsers that may be open at the same time. */
135
+ get maxOpenBrowsers() {
136
+ return this.browserPool.maxOpenBrowsers;
137
+ }
138
+ set maxOpenBrowsers(value) {
139
+ this.browserPool.maxOpenBrowsers = value;
140
+ }
141
+ /**
142
+ * Opens a new page, waiting first until {@link RemoteBrowserPoolOptions.maxOpenBrowsers|maxOpenBrowsers}
143
+ * allows it (either a new browser slot is free, or an active browser still has page capacity).
144
+ */
145
+ async newPage(options) {
146
+ await this._waitForFreeSlot();
147
+ return this.pool.newPage(options);
148
+ }
149
+ async closePage(page, options) {
150
+ return this.pool.closePage(page, options);
151
+ }
152
+ async extractPageState(page) {
153
+ return this.pool.extractPageState(page);
154
+ }
155
+ async injectPageState(page, state) {
156
+ return this.pool.injectPageState(page, state);
157
+ }
158
+ /** Closes all browsers, releases any still-open remote sessions, and tears down the wrapped pool. */
159
+ async destroy() {
160
+ await this.browserPool.destroy();
161
+ // Backstop: release any sessions whose browser never emitted a close (e.g. dropped on teardown).
162
+ await this.registry.releaseAll();
163
+ }
164
+ /** Resolves once the wrapped pool can serve another page without exceeding `maxOpenBrowsers`. */
165
+ async _waitForFreeSlot() {
166
+ while (!this.browserPool.hasFreeBrowserSlot() && !this.browserPool.hasActiveBrowserWithFreeCapacity()) {
167
+ await this._nextCapacityChange();
168
+ }
169
+ }
170
+ /**
171
+ * Resolves on the next browser-retired / page-closed event, or after `slotPollIntervalMillis`. All
172
+ * concurrently-waiting `newPage` calls share a single promise (and a single pair of event listeners)
173
+ * per tick, so a fleet of saturated callers doesn't fan out into N listener pairs on the pool.
174
+ */
175
+ _nextCapacityChange() {
176
+ this._capacityChange ??= new Promise((resolve) => {
177
+ const done = () => {
178
+ clearTimeout(timer);
179
+ this.browserPool.off("browserRetired" /* BROWSER_POOL_EVENTS.BROWSER_RETIRED */, done);
180
+ this.browserPool.off("pageClosed" /* BROWSER_POOL_EVENTS.PAGE_CLOSED */, done);
181
+ this._capacityChange = undefined;
182
+ resolve();
183
+ };
184
+ const timer = setTimeout(done, this.slotPollIntervalMillis);
185
+ timer.unref?.();
186
+ this.browserPool.once("browserRetired" /* BROWSER_POOL_EVENTS.BROWSER_RETIRED */, done);
187
+ this.browserPool.once("pageClosed" /* BROWSER_POOL_EVENTS.PAGE_CLOSED */, done);
188
+ });
189
+ return this._capacityChange;
190
+ }
191
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Abstract base class for remote browser service providers.
3
+ *
4
+ * Implement this class to encapsulate the lifecycle of a remote browser session
5
+ * (creation, connection URL resolution, and cleanup). {@link RemoteBrowserPool}
6
+ * calls {@link connect} once per browser launch and {@link release} when the browser
7
+ * closes, crashes, the pool is destroyed, or the connection fails during launch.
8
+ *
9
+ * Pass the provider instance as the `endpoint` of a {@link RemoteBrowserPool}, then
10
+ * hand the pool to a crawler via its `browserPool` option:
11
+ *
12
+ * ```typescript
13
+ * const browserPool = new RemoteBrowserPool({
14
+ * browserPlugins: [new PlaywrightPlugin(playwright.chromium)],
15
+ * endpoint: new MyProvider(),
16
+ * });
17
+ *
18
+ * const crawler = new PlaywrightCrawler({ browserPool });
19
+ * ```
20
+ *
21
+ * **Example — simple static endpoint (e.g. Browserless):**
22
+ * ```typescript
23
+ * class BrowserlessProvider extends RemoteBrowserProvider {
24
+ * maxOpenBrowsers = 2; // respect the service's concurrent session limit
25
+ *
26
+ * async connect() {
27
+ * return { url: `wss://production-sfo.browserless.io?token=${token}` };
28
+ * }
29
+ * }
30
+ * ```
31
+ *
32
+ * **Example — session lifecycle with concurrency limit (e.g. Browserbase):**
33
+ * ```typescript
34
+ * class BrowserbaseProvider extends RemoteBrowserProvider<{ id: string }> {
35
+ * maxOpenBrowsers = 2; // respect the service's concurrent session limit
36
+ *
37
+ * async connect({ proxyUrl } = {}) {
38
+ * const session = await createSession(apiKey, projectId, {
39
+ * proxies: proxyUrl ? [{ type: 'external', server: proxyUrl }] : undefined,
40
+ * });
41
+ * return { url: session.connectUrl, context: { id: session.id } };
42
+ * }
43
+ *
44
+ * async release(context: { id: string }) {
45
+ * await releaseSession(apiKey, context.id);
46
+ * }
47
+ * }
48
+ * ```
49
+ */
50
+ export declare abstract class RemoteBrowserProvider<TContext extends Record<string, unknown> = Record<string, unknown>> {
51
+ /**
52
+ * Maximum number of browsers that can be open at the same time.
53
+ * Set this to your remote service's concurrent session limit to avoid 429 errors.
54
+ */
55
+ maxOpenBrowsers?: number;
56
+ /**
57
+ * Called once per browser launch. Return the WebSocket/CDP endpoint URL
58
+ * and an optional `context` object that will be passed back to {@link release}.
59
+ *
60
+ * @param options.proxyUrl - The proxy URL resolved by Crawlee's proxy configuration
61
+ * for this browser session. Pass it to your remote service's proxy API if supported.
62
+ */
63
+ abstract connect(options?: {
64
+ proxyUrl?: string;
65
+ }): Promise<{
66
+ url: string;
67
+ context?: TContext;
68
+ }> | {
69
+ url: string;
70
+ context?: TContext;
71
+ };
72
+ /**
73
+ * Called when the browser closes, crashes, the pool is destroyed, or the
74
+ * connection fails right after {@link connect} succeeds.
75
+ * Override this to clean up remote sessions, release API resources, etc.
76
+ *
77
+ * Errors thrown here are caught and logged as warnings — they never crash the crawler.
78
+ * Safe to assume this is called at most once per {@link connect} call.
79
+ *
80
+ * @param _context The same `context` object returned by {@link connect}.
81
+ */
82
+ release(_context: TContext): Promise<void>;
83
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Abstract base class for remote browser service providers.
3
+ *
4
+ * Implement this class to encapsulate the lifecycle of a remote browser session
5
+ * (creation, connection URL resolution, and cleanup). {@link RemoteBrowserPool}
6
+ * calls {@link connect} once per browser launch and {@link release} when the browser
7
+ * closes, crashes, the pool is destroyed, or the connection fails during launch.
8
+ *
9
+ * Pass the provider instance as the `endpoint` of a {@link RemoteBrowserPool}, then
10
+ * hand the pool to a crawler via its `browserPool` option:
11
+ *
12
+ * ```typescript
13
+ * const browserPool = new RemoteBrowserPool({
14
+ * browserPlugins: [new PlaywrightPlugin(playwright.chromium)],
15
+ * endpoint: new MyProvider(),
16
+ * });
17
+ *
18
+ * const crawler = new PlaywrightCrawler({ browserPool });
19
+ * ```
20
+ *
21
+ * **Example — simple static endpoint (e.g. Browserless):**
22
+ * ```typescript
23
+ * class BrowserlessProvider extends RemoteBrowserProvider {
24
+ * maxOpenBrowsers = 2; // respect the service's concurrent session limit
25
+ *
26
+ * async connect() {
27
+ * return { url: `wss://production-sfo.browserless.io?token=${token}` };
28
+ * }
29
+ * }
30
+ * ```
31
+ *
32
+ * **Example — session lifecycle with concurrency limit (e.g. Browserbase):**
33
+ * ```typescript
34
+ * class BrowserbaseProvider extends RemoteBrowserProvider<{ id: string }> {
35
+ * maxOpenBrowsers = 2; // respect the service's concurrent session limit
36
+ *
37
+ * async connect({ proxyUrl } = {}) {
38
+ * const session = await createSession(apiKey, projectId, {
39
+ * proxies: proxyUrl ? [{ type: 'external', server: proxyUrl }] : undefined,
40
+ * });
41
+ * return { url: session.connectUrl, context: { id: session.id } };
42
+ * }
43
+ *
44
+ * async release(context: { id: string }) {
45
+ * await releaseSession(apiKey, context.id);
46
+ * }
47
+ * }
48
+ * ```
49
+ */
50
+ export class RemoteBrowserProvider {
51
+ /**
52
+ * Maximum number of browsers that can be open at the same time.
53
+ * Set this to your remote service's concurrent session limit to avoid 429 errors.
54
+ */
55
+ maxOpenBrowsers;
56
+ /**
57
+ * Called when the browser closes, crashes, the pool is destroyed, or the
58
+ * connection fails right after {@link connect} succeeds.
59
+ * Override this to clean up remote sessions, release API resources, etc.
60
+ *
61
+ * Errors thrown here are caught and logged as warnings — they never crash the crawler.
62
+ * Safe to assume this is called at most once per {@link connect} call.
63
+ *
64
+ * @param _context The same `context` object returned by {@link connect}.
65
+ */
66
+ async release(_context) { }
67
+ }
package/utils.d.ts CHANGED
@@ -3,6 +3,13 @@ import type { PlaywrightPlugin } from './playwright/playwright-plugin.js';
3
3
  import type { PuppeteerPlugin } from './puppeteer/puppeteer-plugin.js';
4
4
  export type UnwrapPromise<T> = T extends PromiseLike<infer R> ? UnwrapPromise<R> : T;
5
5
  export declare function noop(..._args: unknown[]): void;
6
+ /**
7
+ * Strips secrets from a URL so it can be safely included in logs and error messages. Removes userinfo
8
+ * credentials and the entire query string and fragment — remote browser services routinely carry tokens
9
+ * there (e.g. Browserless `?token=…`), and we can't tell which params are sensitive. Keeps the
10
+ * protocol, host, port, and path, which are enough to diagnose connection failures.
11
+ */
12
+ export declare function sanitizeEndpointForLog(endpoint: string): string;
6
13
  /**
7
14
  * This is required when using optional dependencies.
8
15
  * Importing a type gives `any`, but `Parameters<any>` gives `unknown[]` instead of `any`
@@ -11,4 +18,3 @@ export type SafeParameters<T extends (...args: any) => any> = unknown[] extends
11
18
  export type InferBrowserPluginArray<Input extends readonly unknown[], Result extends BrowserPlugin[] = []> = Input extends readonly [infer FirstValue, ...infer Rest] | [infer FirstValue, ...infer Rest] ? FirstValue extends PlaywrightPlugin ? InferBrowserPluginArray<Rest, [...Result, PlaywrightPlugin]> : FirstValue extends PuppeteerPlugin ? InferBrowserPluginArray<Rest, [...Result, PuppeteerPlugin]> : never : Input extends [] ? Result : Input extends readonly (infer U)[] ? [
12
19
  U
13
20
  ] extends [PuppeteerPlugin | PlaywrightPlugin] ? U[] : never : Result;
14
- //# sourceMappingURL=utils.d.ts.map
package/utils.js CHANGED
@@ -1,2 +1,20 @@
1
1
  export function noop(..._args) { }
2
- //# sourceMappingURL=utils.js.map
2
+ /**
3
+ * Strips secrets from a URL so it can be safely included in logs and error messages. Removes userinfo
4
+ * credentials and the entire query string and fragment — remote browser services routinely carry tokens
5
+ * there (e.g. Browserless `?token=…`), and we can't tell which params are sensitive. Keeps the
6
+ * protocol, host, port, and path, which are enough to diagnose connection failures.
7
+ */
8
+ export function sanitizeEndpointForLog(endpoint) {
9
+ try {
10
+ const url = new URL(endpoint);
11
+ url.username = '';
12
+ url.password = '';
13
+ url.search = '';
14
+ url.hash = '';
15
+ return url.toString();
16
+ }
17
+ catch {
18
+ return '<invalid URL>';
19
+ }
20
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-controller.d.ts","sourceRoot":"","sources":["../../src/abstract-classes/browser-controller.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-controller.js","sourceRoot":"","sources":["../../src/abstract-classes/browser-controller.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI3C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAInC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAczC;;;;;;;GAOG;AACH,MAAM,OAAgB,iBAMpB,SAAQ,YAA2G;IACjH,EAAE,GAAG,MAAM,EAAE,CAAC;IAEd;;OAEG;IACH,aAAa,CAAsF;IAEnG;;OAEG;IACH,OAAO,GAAiB,SAAU,CAAC;IAEnC;;OAEG;IACH,aAAa,GAAwF,SAAU,CAAC;IAEhH;;;OAGG;IACH,SAAS,CAAU;IAEnB;;;OAGG;IACH,QAAQ,CAAU;IAElB,QAAQ,GAAG,KAAK,CAAC;IAEjB,WAAW,GAAG,CAAC,CAAC;IAEhB,UAAU,GAAG,CAAC,CAAC;IAEf,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEtB,SAAS,CAAc;IAEvB,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACpD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEK,aAAa,CAAc;IAE3B,iBAAiB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACtD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,YAAY,aAAkG;QAC1G,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,QAAQ;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,aAAa,CACT,OAAqB,EACrB,aAAkG;QAElG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK;QACP,MAAM,IAAI,CAAC,iBAAiB,CAAC;QAE7B,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,gDAAgD;YAChD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,oCAAqC,KAAe,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,CAAC,IAAI,iEAA2C,IAAI,CAAC,CAAC;QAE1D,UAAU,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvB,GAAG,CAAC,KAAK,CAAC,mCAAmC,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACjF,CAAC,CAAC,CAAC;QACP,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,iBAAiB,CAAC;QAC7B,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,iEAA2C,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,WAA4B;QACtC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,eAAe,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC9C,SAAS,EAAE,CAAC;QACZ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEnC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAmB,EAAE,OAAiB;QACnD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAmB;QAChC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CA6BJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-plugin.d.ts","sourceRoot":"","sources":["../../src/abstract-classes/browser-plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-plugin.js","sourceRoot":"","sources":["../../src/abstract-classes/browser-plugin.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anonymize-proxy.d.ts","sourceRoot":"","sources":["../src/anonymize-proxy.ts"],"names":[],"mappings":"AAEA,KAAK,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvC,eAAO,MAAM,mBAAmB,GAC5B,WAAW,MAAM,EACjB,WAAW,MAAM,EACjB,WAAW,MAAM,KAClB,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,EAAE,WAAW,CAAC,CA0B3C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anonymize-proxy.js","sourceRoot":"","sources":["../src/anonymize-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAInE,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACpC,QAAiB,EACjB,QAAiB,EACjB,QAAiB,EACyB,EAAE;IAC5C,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9B,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACvB,GAAG,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;YAC9B,GAAG,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;QAClC,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC/B,0CAA0C;YAC1C,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;YACjF,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;YAExD,OAAO;gBACH,UAAU;gBACV,KAAK,IAAI,EAAE;oBACP,MAAM,oBAAoB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACjD,CAAC;aACJ,CAAC;QACN,CAAC;QAED,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-pool.d.ts","sourceRoot":"","sources":["../src/browser-pool.ts"],"names":[],"mappings":"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"}