@crawlee/browser-pool 3.0.0-alpha.8 → 3.0.0-beta.1

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 (80) hide show
  1. package/README.md +2 -0
  2. package/abstract-classes/browser-controller.d.ts +153 -0
  3. package/abstract-classes/browser-controller.d.ts.map +1 -0
  4. package/abstract-classes/browser-controller.js +230 -0
  5. package/abstract-classes/browser-controller.js.map +1 -0
  6. package/abstract-classes/browser-plugin.d.ts +102 -0
  7. package/abstract-classes/browser-plugin.d.ts.map +1 -0
  8. package/abstract-classes/browser-plugin.js +154 -0
  9. package/abstract-classes/browser-plugin.js.map +1 -0
  10. package/abstract-classes/utils.d.ts +2 -0
  11. package/abstract-classes/utils.d.ts.map +1 -0
  12. package/abstract-classes/utils.js +8 -0
  13. package/abstract-classes/utils.js.map +1 -0
  14. package/anonymize-proxy.d.ts +4 -0
  15. package/anonymize-proxy.d.ts.map +1 -0
  16. package/anonymize-proxy.js +34 -0
  17. package/anonymize-proxy.js.map +1 -0
  18. package/browser-pool.d.ts +406 -0
  19. package/browser-pool.d.ts.map +1 -0
  20. package/browser-pool.js +583 -0
  21. package/browser-pool.js.map +1 -0
  22. package/events.d.ts +11 -0
  23. package/events.d.ts.map +1 -0
  24. package/events.js +17 -0
  25. package/events.js.map +1 -0
  26. package/fingerprinting/hooks.d.ts +17 -0
  27. package/fingerprinting/hooks.d.ts.map +1 -0
  28. package/fingerprinting/hooks.js +87 -0
  29. package/fingerprinting/hooks.js.map +1 -0
  30. package/fingerprinting/types.d.ts +33 -0
  31. package/fingerprinting/types.d.ts.map +1 -0
  32. package/fingerprinting/types.js +21 -0
  33. package/fingerprinting/types.js.map +1 -0
  34. package/fingerprinting/utils.d.ts +4 -0
  35. package/fingerprinting/utils.d.ts.map +1 -0
  36. package/fingerprinting/utils.js +47 -0
  37. package/fingerprinting/utils.js.map +1 -0
  38. package/index.d.ts +37 -0
  39. package/index.d.ts.map +1 -0
  40. package/index.js.map +1 -0
  41. package/index.mjs +11 -0
  42. package/launch-context.d.ts +68 -0
  43. package/launch-context.d.ts.map +1 -0
  44. package/launch-context.js +94 -0
  45. package/launch-context.js.map +1 -0
  46. package/logger.d.ts +2 -0
  47. package/logger.d.ts.map +1 -0
  48. package/logger.js +9 -0
  49. package/logger.js.map +1 -0
  50. package/package.json +6 -9
  51. package/playwright/browser.d.ts +27 -0
  52. package/playwright/browser.d.ts.map +1 -0
  53. package/playwright/browser.js +66 -0
  54. package/playwright/browser.js.map +1 -0
  55. package/playwright/playwright-controller.d.ts +12 -0
  56. package/playwright/playwright-controller.d.ts.map +1 -0
  57. package/playwright/playwright-controller.js +71 -0
  58. package/playwright/playwright-controller.js.map +1 -0
  59. package/playwright/playwright-plugin.d.ts +13 -0
  60. package/playwright/playwright-plugin.d.ts.map +1 -0
  61. package/playwright/playwright-plugin.js +89 -0
  62. package/playwright/playwright-plugin.js.map +1 -0
  63. package/proxy-server.d.ts +2 -0
  64. package/proxy-server.d.ts.map +1 -0
  65. package/proxy-server.js +18 -0
  66. package/proxy-server.js.map +1 -0
  67. package/puppeteer/puppeteer-controller.d.ts +11 -0
  68. package/puppeteer/puppeteer-controller.d.ts.map +1 -0
  69. package/puppeteer/puppeteer-controller.js +112 -0
  70. package/puppeteer/puppeteer-controller.js.map +1 -0
  71. package/puppeteer/puppeteer-plugin.d.ts +12 -0
  72. package/puppeteer/puppeteer-plugin.d.ts.map +1 -0
  73. package/puppeteer/puppeteer-plugin.js +151 -0
  74. package/puppeteer/puppeteer-plugin.js.map +1 -0
  75. package/puppeteer/puppeteer-proxy-per-page.d.ts +27 -0
  76. package/tsconfig.build.tsbuildinfo +1 -0
  77. package/utils.d.ts +6 -0
  78. package/utils.d.ts.map +1 -0
  79. package/utils.js +6 -0
  80. package/utils.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-plugin.js","sourceRoot":"","sources":["../../src/abstract-classes/browser-plugin.ts"],"names":[],"mappings":";;;;AAAA,wEAAiC;AACjC,sDAAwE;AAExE,mCAAoD;AAGpD;;;;;;;GAOG;AACU,QAAA,kBAAkB,GAAG,2GAA2G,CAAC;AAmD7I,CAAC;AAUF;;;;;GAKG;AACH,MAAsB,aAAa;IAmB/B,YAAY,OAAgB,EAAE,UAAgD,EAAE;QAZhF;;;;mBAAO,IAAI,CAAC,WAAW,CAAC,IAAI;WAAC;QAE7B;;;;;WAAiB;QAEjB;;;;;WAA8B;QAE9B;;;;;WAAkB;QAElB;;;;;WAAqB;QAErB;;;;;WAA2B;QAGvB,MAAM,EACF,aAAa,GAAG,EAAoB,EACpC,QAAQ,EACR,WAAW,EACX,iBAAiB,GAAG,KAAK,GAC5B,GAAG,OAAO,CAAC;QAEZ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,mBAAmB,CACf,UAA4G,EAAE;QAE9G,MAAM,EACF,EAAE,EACF,aAAa,GAAG,EAAE,EAClB,QAAQ,GAAG,IAAI,CAAC,QAAQ,EACxB,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAC1C,WAAW,GAAG,IAAI,CAAC,WAAW,GACjC,GAAG,OAAO,CAAC;QAEZ,OAAO,IAAI,8BAAa,CAAC;YACrB,EAAE;YACF,aAAa,EAAE,IAAA,sBAAK,EAAC,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;YAC3D,aAAa,EAAE,IAAI;YACnB,QAAQ;YACR,iBAAiB;YACjB,WAAW;SACd,CAAC,CAAC;IACP,CAAC;IAED,gBAAgB;QACZ,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACR,gBAAqG,IAAI,CAAC,mBAAmB,EAAE;QAE/H,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAA8D,aAAa,CAAC;QAE7G,IAAI,QAAQ,EAAE;YACV,MAAM,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAC;SACtD;QAED,IAAI,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAAE;YAC7C,4EAA4E;YAC5E,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,yBAAyB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACxE,yEAAyE;YACzE,wEAAwE;YACxE,iEAAiE;YACjE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;YAC3F,IAAI,aAAa,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE;gBACpE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,0BAAkB,EAAE,CAAC,CAAC;aACjE;SACJ;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAEO,yBAAyB,CAAC,YAAsB;QACpD,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE;YACvB,OAAO,CAAC,+CAA+C,CAAC,CAAC;SAC5D;QAED,MAAM,aAAa,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAE3G,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;YACtB,YAAY,CAAC,aAAa,CAAC,IAAI,uBAAuB,CAAC;SAC1D;aAAM;YACH,YAAY,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;SACtE;QAED,OAAO,YAAY,CAAC;IACxB,CAAC;IAAA,CAAC;IAEF;;OAEG;IACH,8DAA8D;IAC9D,mCAAmC;IAChB,wBAAwB,CAAC,aAAkG;QAC1I,IAAA,iCAAyB,EAAC,0BAA0B,CAAC,CAAC;IAC1D,CAAC;IAED,8DAA8D;IAC9D,mGAAmG;IAChF,uBAAuB,CAAC,aAAkG;QACzI,IAAA,iCAAyB,EAAC,yBAAyB,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,8DAA8D;IAC3C,OAAO,CAAC,aAAkG;QACzH,IAAA,iCAAyB,EAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,8DAA8D;IAC9D,uDAAuD;IACpC,iBAAiB;QAChC,IAAA,iCAAyB,EAAC,mBAAmB,CAAC,CAAC;IACnD,CAAC;CACJ;AA3ID,sCA2IC"}
@@ -0,0 +1,2 @@
1
+ export declare function throwImplementationNeeded(methodName: string): never;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/abstract-classes/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAEnE"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.throwImplementationNeeded = void 0;
4
+ function throwImplementationNeeded(methodName) {
5
+ throw new Error(`You need to implement method ${methodName}.`);
6
+ }
7
+ exports.throwImplementationNeeded = throwImplementationNeeded;
8
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/abstract-classes/utils.ts"],"names":[],"mappings":";;;AAAA,SAAgB,yBAAyB,CAAC,UAAkB;IACxD,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,GAAG,CAAC,CAAC;AACnE,CAAC;AAFD,8DAEC"}
@@ -0,0 +1,4 @@
1
+ declare type PromiseVoid = () => Promise<void>;
2
+ export declare const anonymizeProxySugar: (proxyUrl?: string, username?: string, password?: string) => Promise<[string | undefined, PromiseVoid]>;
3
+ export {};
4
+ //# sourceMappingURL=anonymize-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anonymize-proxy.d.ts","sourceRoot":"","sources":["../src/anonymize-proxy.ts"],"names":[],"mappings":"AAEA,aAAK,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvC,eAAO,MAAM,mBAAmB,cACjB,MAAM,aACN,MAAM,aACN,MAAM,KAClB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,WAAW,CAAC,CAgC3C,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.anonymizeProxySugar = void 0;
4
+ const proxy_chain_1 = require("proxy-chain");
5
+ const anonymizeProxySugar = async (proxyUrl, username, password) => {
6
+ if (proxyUrl) {
7
+ const url = new URL(proxyUrl);
8
+ if (username || password) {
9
+ url.username = username ?? '';
10
+ url.password = password ?? '';
11
+ }
12
+ if (url.username || url.password) {
13
+ const anonymized = await (0, proxy_chain_1.anonymizeProxy)(url.href);
14
+ return [
15
+ anonymized,
16
+ async () => {
17
+ await (0, proxy_chain_1.closeAnonymizedProxy)(anonymized, true);
18
+ },
19
+ ];
20
+ }
21
+ return [
22
+ undefined,
23
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
24
+ async () => { },
25
+ ];
26
+ }
27
+ return [
28
+ undefined,
29
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
30
+ async () => { },
31
+ ];
32
+ };
33
+ exports.anonymizeProxySugar = anonymizeProxySugar;
34
+ //# sourceMappingURL=anonymize-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anonymize-proxy.js","sourceRoot":"","sources":["../src/anonymize-proxy.ts"],"names":[],"mappings":";;;AAAA,6CAAmE;AAI5D,MAAM,mBAAmB,GAAG,KAAK,EACpC,QAAiB,EACjB,QAAiB,EACjB,QAAiB,EACyB,EAAE;IAC5C,IAAI,QAAQ,EAAE;QACV,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9B,IAAI,QAAQ,IAAI,QAAQ,EAAE;YACtB,GAAG,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;YAC9B,GAAG,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;SACjC;QAED,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE;YAC9B,MAAM,UAAU,GAAG,MAAM,IAAA,4BAAc,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAElD,OAAO;gBACH,UAAU;gBACV,KAAK,IAAI,EAAE;oBACP,MAAM,IAAA,kCAAoB,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACjD,CAAC;aACJ,CAAC;SACL;QAED,OAAO;YACH,SAAS;YACT,gEAAgE;YAChE,KAAK,IAAI,EAAE,GAAE,CAAC;SACjB,CAAC;KACL;IAED,OAAO;QACH,SAAS;QACT,gEAAgE;QAChE,KAAK,IAAI,EAAE,GAAE,CAAC;KACjB,CAAC;AACN,CAAC,CAAC;AApCW,QAAA,mBAAmB,uBAoC9B"}
@@ -0,0 +1,406 @@
1
+ import { TypedEmitter } from 'tiny-typed-emitter';
2
+ import { Fingerprint, FingerprintInjector } from 'fingerprint-injector';
3
+ import QuickLRU from 'quick-lru';
4
+ import { BrowserController } from './abstract-classes/browser-controller';
5
+ import { BrowserPlugin } from './abstract-classes/browser-plugin';
6
+ import { BROWSER_POOL_EVENTS } from './events';
7
+ import { LaunchContext } from './launch-context';
8
+ import { InferBrowserPluginArray, UnwrapPromise } from './utils';
9
+ import { FingerprintGeneratorOptions } from './fingerprinting/types';
10
+ export interface BrowserPoolEvents<BC extends BrowserController, Page> {
11
+ [BROWSER_POOL_EVENTS.PAGE_CREATED]: (page: Page) => void | Promise<void>;
12
+ [BROWSER_POOL_EVENTS.PAGE_CLOSED]: (page: Page) => void | Promise<void>;
13
+ [BROWSER_POOL_EVENTS.BROWSER_RETIRED]: (browserController: BC) => void | Promise<void>;
14
+ [BROWSER_POOL_EVENTS.BROWSER_LAUNCHED]: (browserController: BC) => void | Promise<void>;
15
+ }
16
+ export interface FingerprintsOptions {
17
+ fingerprintGeneratorOptions?: FingerprintGeneratorOptions;
18
+ /**
19
+ * @default true
20
+ */
21
+ useFingerprintPerProxyCache?: boolean;
22
+ /**
23
+ * @default 10000
24
+ */
25
+ fingerprintPerProxyCacheSize?: number;
26
+ }
27
+ export interface BrowserPoolOptions<Plugin extends BrowserPlugin = BrowserPlugin> {
28
+ /**
29
+ * Browser plugins are wrappers of browser automation libraries that
30
+ * allow `BrowserPool` to control browsers with those libraries.
31
+ * `browser-pool` comes with a `PuppeteerPlugin` and a `PlaywrightPlugin`.
32
+ */
33
+ browserPlugins: readonly Plugin[];
34
+ /**
35
+ * Sets the maximum number of pages that can be open in a browser at the
36
+ * same time. Once reached, a new browser will be launched to handle the excess.
37
+ *
38
+ * @default 20
39
+ */
40
+ maxOpenPagesPerBrowser?: number;
41
+ /**
42
+ * Browsers tend to get bloated after processing a lot of pages. This option
43
+ * configures the number of processed pages after which the browser will
44
+ * automatically retire and close. A new browser will launch in its place.
45
+ *
46
+ * @default 100
47
+ */
48
+ retireBrowserAfterPageCount?: number;
49
+ /**
50
+ * As we know from experience, async operations of the underlying libraries,
51
+ * such as launching a browser or opening a new page, can get stuck.
52
+ * To prevent `BrowserPool` from getting stuck, we add a timeout
53
+ * to those operations and you can configure it with this option.
54
+ *
55
+ * @default 15
56
+ */
57
+ operationTimeoutSecs?: number;
58
+ /**
59
+ * Browsers normally close immediately after their last page is processed.
60
+ * However, there could be situations where this does not happen. Browser Pool
61
+ * makes sure all inactive browsers are closed regularly, to free resources.
62
+ *
63
+ * @default 300
64
+ */
65
+ closeInactiveBrowserAfterSecs?: number;
66
+ /**
67
+ * @default true
68
+ */
69
+ useFingerprints?: boolean;
70
+ fingerprintsOptions?: FingerprintsOptions;
71
+ }
72
+ /**
73
+ * Pre-launch hooks are executed just before a browser is launched and provide
74
+ * a good opportunity to dynamically change the launch options.
75
+ * The hooks are called with two arguments:
76
+ * `pageId`: `string` and `launchContext`: {@link LaunchContext}
77
+ */
78
+ export declare type PreLaunchHook<LC extends LaunchContext> = (pageId: string, launchContext: LC) => void | Promise<void>;
79
+ /**
80
+ * Post-launch hooks are executed as soon as a browser is launched.
81
+ * The hooks are called with two arguments:
82
+ * `pageId`: `string` and `browserController`: {@link BrowserController}
83
+ * To guarantee order of execution before other hooks in the same browser,
84
+ * the {@link BrowserController} methods cannot be used until the post-launch
85
+ * hooks complete. If you attempt to call `await browserController.close()` from
86
+ * a post-launch hook, it will deadlock the process. This API is subject to change.
87
+ */
88
+ export declare type PostLaunchHook<BC extends BrowserController> = (pageId: string, browserController: BC) => void | Promise<void>;
89
+ /**
90
+ * Pre-page-create hooks are executed just before a new page is created. They
91
+ * are useful to make dynamic changes to the browser before opening a page.
92
+ * The hooks are called with three arguments:
93
+ * `pageId`: `string`, `browserController`: {@link BrowserController} and
94
+ * `pageOptions`: `object|undefined` - This only works if the underlying `BrowserController` supports new page options.
95
+ * So far, new page options are only supported by `PlaywrightController`.
96
+ * If the page options are not supported by `BrowserController` the `pageOptions` argument is `undefined`.
97
+ */
98
+ export declare type PrePageCreateHook<BC extends BrowserController, PO = Parameters<BC['newPage']>[0]> = (pageId: string, browserController: BC, pageOptions?: PO) => void | Promise<void>;
99
+ /**
100
+ * Post-page-create hooks are called right after a new page is created
101
+ * and all internal actions of Browser Pool are completed. This is the
102
+ * place to make changes to a page that you would like to apply to all
103
+ * pages. Such as injecting a JavaScript library into all pages.
104
+ * The hooks are called with two arguments:
105
+ * `page`: `Page` and `browserController`: {@link BrowserController}
106
+ */
107
+ export declare type PostPageCreateHook<BC extends BrowserController, Page = UnwrapPromise<ReturnType<BC['newPage']>>> = (page: Page, browserController: BC) => void | Promise<void>;
108
+ /**
109
+ * Pre-page-close hooks give you the opportunity to make last second changes
110
+ * in a page that's about to be closed, such as saving a snapshot or updating
111
+ * state.
112
+ * The hooks are called with two arguments:
113
+ * `page`: `Page` and `browserController`: {@link BrowserController}
114
+ */
115
+ export declare type PrePageCloseHook<BC extends BrowserController, Page = UnwrapPromise<ReturnType<BC['newPage']>>> = (page: Page, browserController: BC) => void | Promise<void>;
116
+ /**
117
+ * Post-page-close hooks allow you to do page related clean up.
118
+ * The hooks are called with two arguments:
119
+ * `pageId`: `string` and `browserController`: {@link BrowserController}
120
+ */
121
+ export declare type PostPageCloseHook<BC extends BrowserController> = (pageId: string, browserController: BC) => void | Promise<void>;
122
+ export interface BrowserPoolHooks<BC extends BrowserController, LC extends LaunchContext, PR extends UnwrapPromise<ReturnType<BC['newPage']>> = UnwrapPromise<ReturnType<BC['newPage']>>> {
123
+ /**
124
+ * Pre-launch hooks are executed just before a browser is launched and provide
125
+ * a good opportunity to dynamically change the launch options.
126
+ * The hooks are called with two arguments:
127
+ * `pageId`: `string` and `launchContext`: {@link LaunchContext}
128
+ */
129
+ preLaunchHooks?: PreLaunchHook<LC>[];
130
+ /**
131
+ * Post-launch hooks are executed as soon as a browser is launched.
132
+ * The hooks are called with two arguments:
133
+ * `pageId`: `string` and `browserController`: {@link BrowserController}
134
+ * To guarantee order of execution before other hooks in the same browser,
135
+ * the {@link BrowserController} methods cannot be used until the post-launch
136
+ * hooks complete. If you attempt to call `await browserController.close()` from
137
+ * a post-launch hook, it will deadlock the process. This API is subject to change.
138
+ */
139
+ postLaunchHooks?: PostLaunchHook<BC>[];
140
+ /**
141
+ * Pre-page-create hooks are executed just before a new page is created. They
142
+ * are useful to make dynamic changes to the browser before opening a page.
143
+ * The hooks are called with three arguments:
144
+ * `pageId`: `string`, `browserController`: {@link BrowserController} and
145
+ * `pageOptions`: `object|undefined` - This only works if the underlying `BrowserController` supports new page options.
146
+ * So far, new page options are only supported by `PlaywrightController`.
147
+ * If the page options are not supported by `BrowserController` the `pageOptions` argument is `undefined`.
148
+ */
149
+ prePageCreateHooks?: PrePageCreateHook<BC>[];
150
+ /**
151
+ * Post-page-create hooks are called right after a new page is created
152
+ * and all internal actions of Browser Pool are completed. This is the
153
+ * place to make changes to a page that you would like to apply to all
154
+ * pages. Such as injecting a JavaScript library into all pages.
155
+ * The hooks are called with two arguments:
156
+ * `page`: `Page` and `browserController`: {@link BrowserController}
157
+ */
158
+ postPageCreateHooks?: PostPageCreateHook<BC, PR>[];
159
+ /**
160
+ * Pre-page-close hooks give you the opportunity to make last second changes
161
+ * in a page that's about to be closed, such as saving a snapshot or updating
162
+ * state.
163
+ * The hooks are called with two arguments:
164
+ * `page`: `Page` and `browserController`: {@link BrowserController}
165
+ */
166
+ prePageCloseHooks?: PrePageCloseHook<BC, PR>[];
167
+ /**
168
+ * Post-page-close hooks allow you to do page related clean up.
169
+ * The hooks are called with two arguments:
170
+ * `pageId`: `string` and `browserController`: {@link BrowserController}
171
+ */
172
+ postPageCloseHooks?: PostPageCloseHook<BC>[];
173
+ }
174
+ /**
175
+ * The `BrowserPool` class is the most important class of the `browser-pool` module.
176
+ * It manages opening and closing of browsers and their pages and its constructor
177
+ * options allow easy configuration of the browsers' and pages' lifecycle.
178
+ *
179
+ * The most important and useful constructor options are the various lifecycle hooks.
180
+ * Those allow you to sequentially call a list of (asynchronous) functions at each
181
+ * stage of the browser / page lifecycle.
182
+ *
183
+ * **Example:**
184
+ * ```js
185
+ * const { BrowserPool, PlaywrightPlugin } = require('@crawlee/browser-pool');
186
+ // @ts-ignore optional peer dependency
187
+ * const playwright = require('playwright');
188
+ *
189
+ * const browserPool = new BrowserPool({
190
+ * browserPlugins: [ new PlaywrightPlugin(playwright.chromium)],
191
+ * preLaunchHooks: [(pageId, launchContext) => {
192
+ * // do something before a browser gets launched
193
+ * launchContext.launchOptions.headless = false;
194
+ * }],
195
+ * postLaunchHooks: [(pageId, browserController) => {
196
+ * // manipulate the browser right after launch
197
+ * console.dir(browserController.browser.contexts());
198
+ * }],
199
+ * prePageCreateHooks: [(pageId, browserController) => {
200
+ * if (pageId === 'my-page') {
201
+ * // make changes right before a specific page is created
202
+ * }
203
+ * }],
204
+ * postPageCreateHooks: [async (page, browserController) => {
205
+ * // update some or all new pages
206
+ * await page.evaluate(() => {
207
+ * // now all pages will have 'foo'
208
+ * window.foo = 'bar'
209
+ * })
210
+ * }],
211
+ * prePageCloseHooks: [async (page, browserController) => {
212
+ * // collect information just before a page closes
213
+ * await page.screenshot();
214
+ * }],
215
+ * postPageCloseHooks: [(pageId, browserController) => {
216
+ * // clean up or log after a job is done
217
+ * console.log('Page closed: ', pageId)
218
+ * }]
219
+ * });
220
+ * ```
221
+ */
222
+ 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>> {
223
+ browserPlugins: BrowserPlugins;
224
+ maxOpenPagesPerBrowser: number;
225
+ retireBrowserAfterPageCount: number;
226
+ operationTimeoutMillis: number;
227
+ closeInactiveBrowserAfterMillis: number;
228
+ useFingerprints?: boolean;
229
+ fingerprintsOptions: FingerprintsOptions;
230
+ preLaunchHooks: PreLaunchHook<LaunchContextReturn>[];
231
+ postLaunchHooks: PostLaunchHook<BrowserControllerReturn>[];
232
+ prePageCreateHooks: PrePageCreateHook<BrowserControllerReturn, PageOptions>[];
233
+ postPageCreateHooks: PostPageCreateHook<BrowserControllerReturn, PageReturn>[];
234
+ prePageCloseHooks: PrePageCloseHook<BrowserControllerReturn, PageReturn>[];
235
+ postPageCloseHooks: PostPageCloseHook<BrowserControllerReturn>[];
236
+ pageCounter: number;
237
+ pages: Map<string, PageReturn>;
238
+ pageIds: WeakMap<PageReturn, string>;
239
+ activeBrowserControllers: Set<BrowserControllerReturn>;
240
+ retiredBrowserControllers: Set<BrowserControllerReturn>;
241
+ pageToBrowserController: WeakMap<PageReturn, BrowserControllerReturn>;
242
+ fingerprintInjector?: FingerprintInjector;
243
+ fingerprintGenerator?: any;
244
+ fingerprintCache?: QuickLRU<string, Fingerprint>;
245
+ private browserKillerInterval?;
246
+ private limiter;
247
+ constructor(options: Options & BrowserPoolHooks<BrowserControllerReturn, LaunchContextReturn, PageReturn>);
248
+ /**
249
+ * Opens a new page in one of the running browsers or launches
250
+ * a new browser and opens a page there, if no browsers are active,
251
+ * or their page limits have been exceeded.
252
+ */
253
+ newPage(options?: BrowserPoolNewPageOptions<PageOptions, BrowserPlugins[number]>): Promise<PageReturn>;
254
+ /**
255
+ * Unlike {@link newPage}, `newPageInNewBrowser` always launches a new
256
+ * browser to open the page in. Use the `launchOptions` option to
257
+ * configure the new browser.
258
+ */
259
+ newPageInNewBrowser(options?: BrowserPoolNewPageInNewBrowserOptions<PageOptions, BrowserPlugins[number]>): Promise<PageReturn>;
260
+ /**
261
+ * Opens new pages with all available plugins and returns an array
262
+ * of pages in the same order as the plugins were provided to `BrowserPool`.
263
+ * This is useful when you want to run a script in multiple environments
264
+ * at the same time, typically in testing or website analysis.
265
+ *
266
+ * **Example:**
267
+ * ```js
268
+ * const browserPool = new BrowserPool({
269
+ * browserPlugins: [
270
+ * new PlaywrightPlugin(playwright.chromium),
271
+ * new PlaywrightPlugin(playwright.firefox),
272
+ * new PlaywrightPlugin(playwright.webkit),
273
+ * new PuppeteerPlugin(puppeteer),
274
+ * ]
275
+ * });
276
+ *
277
+ * const pages = await browserPool.newPageWithEachPlugin();
278
+ * const [chromiumPage, firefoxPage, webkitPage, puppeteerPage] = pages;
279
+ * ```
280
+ */
281
+ newPageWithEachPlugin(optionsList?: Omit<BrowserPoolNewPageOptions<PageOptions, BrowserPlugins[number]>, 'browserPlugin'>[]): Promise<PageReturn[]>;
282
+ /**
283
+ * Retrieves a {@link BrowserController} for a given page. This is useful
284
+ * when you're working only with pages and need to access the browser
285
+ * manipulation functionality.
286
+ *
287
+ * You could access the browser directly from the page,
288
+ * but that would circumvent `BrowserPool` and most likely
289
+ * cause weird things to happen, so please always use `BrowserController`
290
+ * to control your browsers. The function returns `undefined` if the
291
+ * browser is closed.
292
+ *
293
+ * @param page - Browser plugin page
294
+ */
295
+ getBrowserControllerByPage(page: PageReturn): BrowserControllerReturn | undefined;
296
+ /**
297
+ * If you provided a custom ID to one of your pages or saved the
298
+ * randomly generated one, you can use this function to retrieve
299
+ * the page. If the page is no longer open, the function will
300
+ * return `undefined`.
301
+ */
302
+ getPage(id: string): PageReturn | undefined;
303
+ /**
304
+ * Page IDs are used throughout `BrowserPool` as a method of linking
305
+ * events. You can use a page ID to track the full lifecycle of the page.
306
+ * It is created even before a browser is launched and stays with the page
307
+ * until it's closed.
308
+ */
309
+ getPageId(page: PageReturn): string | undefined;
310
+ private _createPageForBrowser;
311
+ /**
312
+ * Removes a browser controller from the pool. The underlying
313
+ * browser will be closed after all its pages are closed.
314
+ *
315
+ */
316
+ retireBrowserController(browserController: BrowserControllerReturn): void;
317
+ /**
318
+ * Removes a browser from the pool. It will be
319
+ * closed after all its pages are closed.
320
+ */
321
+ retireBrowserByPage(page: PageReturn): void;
322
+ /**
323
+ * Removes all active browsers from the pool. The browsers will be
324
+ * closed after all their pages are closed.
325
+ */
326
+ retireAllBrowsers(): void;
327
+ /**
328
+ * Closes all managed browsers without waiting for pages to close.
329
+ * @return {Promise<void>}
330
+ */
331
+ closeAllBrowsers(): Promise<void>;
332
+ /**
333
+ * Closes all managed browsers and tears down the pool.
334
+ */
335
+ destroy(): Promise<void>;
336
+ private _teardown;
337
+ private _getAllBrowserControllers;
338
+ private _launchBrowser;
339
+ /**
340
+ * Picks plugins round robin.
341
+ * @private
342
+ */
343
+ private _pickBrowserPlugin;
344
+ private _pickBrowserWithFreeCapacity;
345
+ private _closeInactiveRetiredBrowsers;
346
+ private _overridePageClose;
347
+ private _executeHooks;
348
+ private _closeRetiredBrowserWithNoPages;
349
+ private _initializeFingerprinting;
350
+ private _addFingerprintHooks;
351
+ }
352
+ export interface BrowserPoolNewPageOptions<PageOptions, BP extends BrowserPlugin> {
353
+ /**
354
+ * Assign a custom ID to the page. If you don't a random string ID
355
+ * will be generated.
356
+ */
357
+ id?: string;
358
+ /**
359
+ * Some libraries (Playwright) allow you to open new pages with specific
360
+ * options. Use this property to set those options.
361
+ */
362
+ pageOptions?: PageOptions;
363
+ /**
364
+ * Choose a plugin to open the page with. If none is provided,
365
+ * one of the pool's available plugins will be used.
366
+ *
367
+ * It must be one of the plugins browser pool was created with.
368
+ * If you wish to start a browser with a different configuration,
369
+ * see the `newPageInNewBrowser` function.
370
+ */
371
+ browserPlugin?: BP;
372
+ /**
373
+ * Proxy URL.
374
+ */
375
+ proxyUrl?: string;
376
+ }
377
+ export interface BrowserPoolNewPageInNewBrowserOptions<PageOptions, BP extends BrowserPlugin> {
378
+ /**
379
+ * Assign a custom ID to the page. If you don't a random string ID
380
+ * will be generated.
381
+ */
382
+ id?: string;
383
+ /**
384
+ * Some libraries (Playwright) allow you to open new pages with specific
385
+ * options. Use this property to set those options.
386
+ */
387
+ pageOptions?: PageOptions;
388
+ /**
389
+ * Provide a plugin to launch the browser. If none is provided,
390
+ * one of the pool's available plugins will be used.
391
+ *
392
+ * If you configured `BrowserPool` to rotate multiple libraries,
393
+ * such as both Puppeteer and Playwright, you should always set
394
+ * the `browserPlugin` when using the `launchOptions` option.
395
+ *
396
+ * The plugin will not be added to the list of plugins used by
397
+ * the pool. You can either use one of those, to launch a specific
398
+ * browser, or provide a completely new configuration.
399
+ */
400
+ browserPlugin?: BP;
401
+ /**
402
+ * Options that will be used to launch the new browser.
403
+ */
404
+ launchOptions?: BP['launchOptions'];
405
+ }
406
+ //# sourceMappingURL=browser-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-pool.d.ts","sourceRoot":"","sources":["../src/browser-pool.ts"],"names":[],"mappings":"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"}