@hanivanrizky/nestjs-browser-action 0.21.0 → 0.23.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 (79) hide show
  1. package/README.md +78 -45
  2. package/dist/browser-action.module-definition.d.ts +1 -0
  3. package/dist/browser-action.module.d.ts +7 -0
  4. package/dist/browser-action.module.js +203 -28
  5. package/dist/browser-action.module.js.map +1 -1
  6. package/dist/common/index.d.ts +1 -0
  7. package/dist/common/index.js +18 -0
  8. package/dist/common/index.js.map +1 -0
  9. package/dist/common/tokens.d.ts +9 -0
  10. package/dist/common/tokens.js +47 -0
  11. package/dist/common/tokens.js.map +1 -0
  12. package/dist/constants/browser-action.constants.d.ts +1 -0
  13. package/dist/constants/browser-action.constants.js +2 -1
  14. package/dist/constants/browser-action.constants.js.map +1 -1
  15. package/dist/decorators/index.d.ts +1 -0
  16. package/dist/decorators/index.js +1 -0
  17. package/dist/decorators/index.js.map +1 -1
  18. package/dist/decorators/inject-browser.decorator.d.ts +2 -1
  19. package/dist/decorators/inject-browser.decorator.js +2 -1
  20. package/dist/decorators/inject-browser.decorator.js.map +1 -1
  21. package/dist/decorators/inject-page-controller.decorator.d.ts +2 -0
  22. package/dist/decorators/inject-page-controller.decorator.js +8 -0
  23. package/dist/decorators/inject-page-controller.decorator.js.map +1 -0
  24. package/dist/decorators/inject-page.decorator.d.ts +2 -1
  25. package/dist/decorators/inject-page.decorator.js +2 -1
  26. package/dist/decorators/inject-page.decorator.js.map +1 -1
  27. package/dist/examples/named-browser-example.d.ts +1 -0
  28. package/dist/examples/named-browser-example.js +183 -0
  29. package/dist/examples/named-browser-example.js.map +1 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.js +5 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/interfaces/browser-action-options.d.ts +6 -0
  34. package/dist/operators/capture.operator.d.ts +11 -0
  35. package/dist/operators/capture.operator.js +62 -0
  36. package/dist/operators/capture.operator.js.map +1 -0
  37. package/dist/operators/container.operator.d.ts +13 -0
  38. package/dist/operators/container.operator.js +149 -0
  39. package/dist/operators/container.operator.js.map +1 -0
  40. package/dist/operators/extraction.operator.d.ts +22 -0
  41. package/dist/operators/extraction.operator.js +204 -0
  42. package/dist/operators/extraction.operator.js.map +1 -0
  43. package/dist/operators/index.d.ts +5 -0
  44. package/dist/operators/index.js +14 -0
  45. package/dist/operators/index.js.map +1 -0
  46. package/dist/operators/pagination.operator.d.ts +24 -0
  47. package/dist/operators/pagination.operator.js +182 -0
  48. package/dist/operators/pagination.operator.js.map +1 -0
  49. package/dist/operators/workflow.operator.d.ts +35 -0
  50. package/dist/operators/workflow.operator.js +501 -0
  51. package/dist/operators/workflow.operator.js.map +1 -0
  52. package/dist/services/browser-action.service.d.ts +6 -29
  53. package/dist/services/browser-action.service.js +28 -968
  54. package/dist/services/browser-action.service.js.map +1 -1
  55. package/dist/services/browser-health-check.d.ts +11 -0
  56. package/dist/services/browser-health-check.js +30 -0
  57. package/dist/services/browser-health-check.js.map +1 -0
  58. package/dist/services/browser-holder.d.ts +7 -0
  59. package/dist/services/browser-holder.js +26 -0
  60. package/dist/services/browser-holder.js.map +1 -0
  61. package/dist/services/browser-manager.service.js.map +1 -1
  62. package/dist/services/browser-pool.service.d.ts +0 -4
  63. package/dist/services/browser-pool.service.js +12 -103
  64. package/dist/services/browser-pool.service.js.map +1 -1
  65. package/dist/services/named-browser-shutdown.d.ts +11 -0
  66. package/dist/services/named-browser-shutdown.js +51 -0
  67. package/dist/services/named-browser-shutdown.js.map +1 -0
  68. package/dist/services/page-controller.d.ts +39 -0
  69. package/dist/services/page-controller.js +325 -0
  70. package/dist/services/page-controller.js.map +1 -0
  71. package/dist/services/page-session.d.ts +26 -0
  72. package/dist/services/page-session.js +135 -0
  73. package/dist/services/page-session.js.map +1 -0
  74. package/dist/services/page.service.js.map +1 -1
  75. package/dist/tsconfig.build.tsbuildinfo +1 -1
  76. package/dist/utils/browser-launcher.d.ts +6 -0
  77. package/dist/utils/browser-launcher.js +100 -0
  78. package/dist/utils/browser-launcher.js.map +1 -0
  79. package/package.json +2 -2
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  <a href="https://www.npmjs.com/package/@hanivanrizky/nestjs-browser-action" target="_blank"><img src="https://img.shields.io/npm/v/@hanivanrizky/nestjs-browser-action.svg" alt="NPM Version" /></a>
11
11
  <a href="https://www.npmjs.com/package/@hanivanrizky/nestjs-browser-action" target="_blank"><img src="https://img.shields.io/npm/l/@hanivanrizky/nestjs-browser-action.svg" alt="Package License" /></a>
12
12
  <a href="https://www.npmjs.com/package/@hanivanrizky/nestjs-browser-action" target="_blank"><img src="https://img.shields.io/npm/dm/@hanivanrizky/nestjs-browser-action.svg" alt="NPM Downloads" /></a>
13
- <img src="https://img.shields.io/badge/tests-410%20passed-brightgreen.svg" alt="Tests: 410 passed" />
13
+ <img src="https://img.shields.io/badge/tests-481%20passed-brightgreen.svg" alt="Tests: 481 passed" />
14
14
  </p>
15
15
 
16
16
  > **⚠️ Status: Experimental** — personal use only; API subject to change.
@@ -39,7 +39,8 @@
39
39
  - **(.\_.) Remote Chrome**: Connect to remote Chrome instances via CDP (browserURL / browserWSEndpoint)
40
40
  - **(>\_<) TLS Fingerprint**: Capture the browser's own TLS/HTTP handshake (ja3/ja4, ciphers, http2 akamai, headers) for use with `nestjs-xpath-parser`'s CycleTLS engine
41
41
  - **(☆^O^☆) TypeScript Generics**: Full generic type support for type-safe results
42
- - **(o_o) Fully Tested**: 410 tests across 39 suites
42
+ - **(o_o) Fully Tested**: 463 tests across 51 suites
43
+ - **(☆^O^☆) Named Browsers & Pages (v0.22+)**: persistent named browser/page pairs with `PageController` — cookies/state carry over across calls, no open/close per scrape
43
44
 
44
45
  ## Installation
45
46
 
@@ -53,69 +54,93 @@ npm install @hanivanrizky/nestjs-browser-action
53
54
 
54
55
  ## Quick Start
55
56
 
56
- ### Import the Module
57
+ Two ways to use this library — pick whichever fits your workload. Both are
58
+ fully supported; neither is deprecated.
57
59
 
58
- **Basic usage:**
60
+ - **[Named Browser + Pages](#option-a-named-browser--pages)** — persistent
61
+ browser/page pairs. Cookies, localStorage, and navigation state carry over
62
+ between calls. Best for login sessions and authenticated crawls.
63
+ - **[Browser Pool](#option-b-browser-pool)** — a pool of browsers, each
64
+ `scrape()` call opens and closes a fresh page. Best for one-shot,
65
+ stateless scraping.
66
+
67
+ ### Option A: Named Browser + Pages
59
68
 
60
69
  ```typescript
61
70
  import { Module } from '@nestjs/common';
62
71
  import { BrowserActionModule } from '@hanivanrizky/nestjs-browser-action';
63
72
 
64
73
  @Module({
65
- imports: [BrowserActionModule.forRoot()],
74
+ imports: [
75
+ BrowserActionModule.forRoot({ name: 'stealth', cloak: { headless: true } }),
76
+ BrowserActionModule.forFeature(['products'], 'stealth'),
77
+ ],
66
78
  })
67
79
  export class AppModule {}
68
80
  ```
69
81
 
70
- **With pool and cookie options:**
71
-
72
82
  ```typescript
73
- import { Module } from '@nestjs/common';
74
- import { BrowserActionModule } from '@hanivanrizky/nestjs-browser-action';
83
+ import { Injectable } from '@nestjs/common';
84
+ import {
85
+ InjectPageController,
86
+ PageController,
87
+ } from '@hanivanrizky/nestjs-browser-action';
75
88
 
76
- @Module({
77
- imports: [
78
- BrowserActionModule.forRoot({
79
- pool: { min: 2, max: 10 },
80
- cookies: { enabled: true, cookiesDir: './cookies' },
81
- logLevel: 'log',
82
- }),
83
- ],
84
- })
85
- export class AppModule {}
89
+ @Injectable()
90
+ export class YourService {
91
+ constructor(
92
+ @InjectPageController('products', 'stealth')
93
+ private readonly products: PageController,
94
+ ) {}
95
+
96
+ async scrapeProducts() {
97
+ const result = await this.products.evaluateWebsite({
98
+ url: 'https://www.scrapingcourse.com/ecommerce/',
99
+ patterns: [
100
+ {
101
+ key: 'container',
102
+ patternType: 'css',
103
+ returnType: 'text',
104
+ patterns: ['.product'],
105
+ meta: { isContainer: true },
106
+ },
107
+ {
108
+ key: 'name',
109
+ patternType: 'css',
110
+ returnType: 'text',
111
+ patterns: ['h2.woocommerce-loop-product__title'],
112
+ pipes: { trim: true },
113
+ },
114
+ ],
115
+ });
116
+
117
+ return result.results;
118
+ }
119
+ }
86
120
  ```
87
121
 
88
- **Async configuration:**
122
+ Async config, cookies, and the `maxPages` page-count guard are covered in
123
+ [Named Browsers & Pages](docs/features/named-browsers.md), along with
124
+ decorators, auto-recreate semantics, and a pool ↔ controller migration table.
125
+
126
+ ### Option B: Browser Pool
127
+
128
+ A pool of browsers; each `scrape()`/`scrapeAll()`/`evaluateWebsite()` call
129
+ opens a fresh page and closes it when done. No persistent navigation state
130
+ between calls.
89
131
 
90
132
  ```typescript
91
133
  import { Module } from '@nestjs/common';
92
134
  import { BrowserActionModule } from '@hanivanrizky/nestjs-browser-action';
93
- import { ConfigModule, ConfigService } from '@nestjs/config';
94
135
 
95
136
  @Module({
96
137
  imports: [
97
- ConfigModule.forRoot(),
98
- BrowserActionModule.forRootAsync({
99
- imports: [ConfigModule],
100
- useFactory: (configService: ConfigService) => ({
101
- pool: {
102
- min: configService.get<number>('POOL_MIN', 2),
103
- max: configService.get<number>('POOL_MAX', 10),
104
- },
105
- cloak: {
106
- proxy: { server: configService.get<string>('PROXY_URL', '') },
107
- },
108
- logLevel: configService.get<string>('LOG_LEVEL', 'log'),
109
- }),
110
- inject: [ConfigService],
111
- }),
138
+ BrowserActionModule.forRoot({ pool: { min: 2, max: 10 } }),
112
139
  ],
113
140
  })
114
141
  export class AppModule {}
115
142
  ```
116
143
 
117
- ### Inject the Service
118
-
119
144
  ```typescript
120
145
  import { Injectable } from '@nestjs/common';
121
146
  import { BrowserActionService } from '@hanivanrizky/nestjs-browser-action';
@@ -142,13 +167,6 @@ export class YourService {
142
167
  patterns: ['h2.woocommerce-loop-product__title'],
143
168
  pipes: { trim: true },
144
169
  },
145
- {
146
- key: 'price',
147
- patternType: 'css',
148
- returnType: 'text',
149
- patterns: ['.price'],
150
- pipes: { trim: true },
151
- },
152
170
  ],
153
171
  });
154
172
 
@@ -157,6 +175,12 @@ export class YourService {
157
175
  }
158
176
  ```
159
177
 
178
+ > `BrowserActionModule.forRoot()`/`forRootAsync()` without a `name` gives
179
+ > you pool mode; pass `name` for named-browser mode (Option A). Async config
180
+ > and cookies work the same way on both — see the
181
+ > [migration table](docs/features/named-browsers.md#migration-pool-method--controller-method)
182
+ > if you're moving code between the two.
183
+
160
184
  ## Documentation
161
185
 
162
186
  ### Features
@@ -166,6 +190,7 @@ export class YourService {
166
190
  - [Data Cleaning Pipes](docs/features/pipes.md) - Transform extracted data with pipes
167
191
  - [Cookie Management](docs/features/cookies.md) - Session persistence
168
192
  - [Workflow Actions](docs/methods/workflow.md) - Declarative step-by-step automation
193
+ - [Named Browsers & Pages](docs/features/named-browsers.md) - Persistent named browser/page pairs with `PageController`
169
194
 
170
195
  ### Reference
171
196
 
@@ -331,6 +356,14 @@ pnpm format
331
356
  4. Push to the branch (`git push origin feature/yourusername/amazing-feature`)
332
357
  5. Open a Pull Request
333
358
 
359
+ ## Acknowledgments
360
+
361
+ The [Named Browsers & Pages](#option-a-named-browser--pages) DI pattern
362
+ (`forRoot({ name })` + `forFeature(pages, name)` +
363
+ `@InjectBrowser`/`@InjectPage`/`@InjectPageController`) was inspired by
364
+ [oblakstudio/nestjs-puppeteer](https://github.com/oblakstudio/nestjs-puppeteer).
365
+ Thanks to the maintainers for the clean named-instance design.
366
+
334
367
  ## License
335
368
 
336
369
  This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
@@ -4,4 +4,5 @@ export type BrowserActionModuleOptions = BrowserActionOptions;
4
4
  export interface BrowserActionAsyncModuleOptions extends Pick<ModuleMetadata, 'imports'> {
5
5
  useFactory: (...args: unknown[]) => Promise<BrowserActionModuleOptions> | BrowserActionModuleOptions;
6
6
  inject?: Array<Type | string | symbol>;
7
+ name?: string;
7
8
  }
@@ -1,8 +1,15 @@
1
1
  import { DynamicModule } from '@nestjs/common';
2
+ import type { Browser } from 'puppeteer-core';
2
3
  import { BrowserActionModuleOptions, BrowserActionAsyncModuleOptions } from './browser-action.module-definition';
4
+ declare function launchNamedBrowser(options: BrowserActionModuleOptions): Promise<Browser>;
5
+ export declare const __test__launchNamedBrowser: typeof launchNamedBrowser;
3
6
  export declare class BrowserActionModule {
4
7
  static register(options: BrowserActionModuleOptions): DynamicModule;
5
8
  static forRoot(options: BrowserActionModuleOptions): DynamicModule;
9
+ private static forNamedBrowser;
6
10
  static forRootAsync(options: BrowserActionAsyncModuleOptions): DynamicModule;
11
+ private static forNamedBrowserAsync;
12
+ static forFeature(pages: string[], browserName?: string): DynamicModule;
7
13
  onModuleDestroy(): Promise<void>;
8
14
  }
15
+ export {};
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  };
8
8
  var BrowserActionModule_1;
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.BrowserActionModule = void 0;
10
+ exports.BrowserActionModule = exports.__test__launchNamedBrowser = void 0;
11
11
  const common_1 = require("@nestjs/common");
12
12
  const browser_pool_service_1 = require("./services/browser-pool.service");
13
13
  const browser_manager_service_1 = require("./services/browser-manager.service");
@@ -15,7 +15,77 @@ const page_service_1 = require("./services/page.service");
15
15
  const browser_action_service_1 = require("./services/browser-action.service");
16
16
  const cookie_service_1 = require("./services/cookie.service");
17
17
  const cleansing_service_1 = require("./services/cleansing.service");
18
+ const named_browser_shutdown_1 = require("./services/named-browser-shutdown");
19
+ const browser_holder_1 = require("./services/browser-holder");
20
+ const browser_health_check_1 = require("./services/browser-health-check");
18
21
  const constants_1 = require("./constants");
22
+ const tokens_1 = require("./common/tokens");
23
+ const browser_launcher_1 = require("./utils/browser-launcher");
24
+ const logger_util_1 = require("./utils/logger.util");
25
+ const pipe_engine_1 = require("./pipes/pipe-engine");
26
+ const operators_1 = require("./operators");
27
+ const page_session_1 = require("./services/page-session");
28
+ const page_controller_1 = require("./services/page-controller");
29
+ const browser_action_constants_1 = require("./constants/browser-action.constants");
30
+ const POOL_MODE_SERVICES = [
31
+ browser_pool_service_1.BrowserPoolService,
32
+ browser_manager_service_1.BrowserManagerService,
33
+ page_service_1.PageService,
34
+ browser_action_service_1.BrowserActionService,
35
+ cookie_service_1.CookieService,
36
+ cleansing_service_1.CleansingService,
37
+ ];
38
+ const POOL_MODE_EXPORTS = [
39
+ browser_manager_service_1.BrowserManagerService,
40
+ page_service_1.PageService,
41
+ browser_action_service_1.BrowserActionService,
42
+ cookie_service_1.CookieService,
43
+ cleansing_service_1.CleansingService,
44
+ ];
45
+ function resolveLogLevel(logLevel) {
46
+ return (Array.isArray(logLevel) ? logLevel[0] : logLevel) || 'log';
47
+ }
48
+ async function launchNamedBrowser(options) {
49
+ const logger = new logger_util_1.LoggerWithLevel('BrowserActionModule', resolveLogLevel(options.logLevel));
50
+ if (options.remote) {
51
+ return await (0, browser_launcher_1.connectRemoteBrowser)(options.remote, logger);
52
+ }
53
+ const browser = await (0, browser_launcher_1.launchLocalBrowser)(options, undefined, logger);
54
+ logger.warn('Call app.enableShutdownHooks() in main.ts to ensure graceful browser cleanup on Ctrl+C');
55
+ const childProcess = browser.process();
56
+ if (childProcess) {
57
+ process.once('exit', () => {
58
+ if (!childProcess.killed)
59
+ childProcess.kill();
60
+ });
61
+ }
62
+ return browser;
63
+ }
64
+ exports.__test__launchNamedBrowser = launchNamedBrowser;
65
+ function namedBrowserHolderProvider(name) {
66
+ return {
67
+ provide: (0, tokens_1.getBrowserHolderToken)(name),
68
+ useFactory: (browser) => new browser_holder_1.BrowserHolder(browser),
69
+ inject: [(0, tokens_1.getBrowserToken)(name)],
70
+ };
71
+ }
72
+ function getHealthCheckToken(name) {
73
+ return `${(0, tokens_1.getBrowserToken)(name)}HealthCheck`;
74
+ }
75
+ function namedBrowserHealthCheckProvider(name, optionsToken) {
76
+ return {
77
+ provide: getHealthCheckToken(name),
78
+ useFactory: (holder, options) => {
79
+ if (!options.healthCheck)
80
+ return undefined;
81
+ const logger = new logger_util_1.LoggerWithLevel('BrowserActionModule', resolveLogLevel(options.logLevel));
82
+ const check = new browser_health_check_1.BrowserHealthCheck(name, holder, logger);
83
+ check.start(options.healthCheck.intervalMs);
84
+ return check;
85
+ },
86
+ inject: [(0, tokens_1.getBrowserHolderToken)(name), optionsToken],
87
+ };
88
+ }
19
89
  let BrowserActionModule = BrowserActionModule_1 = class BrowserActionModule {
20
90
  static register(options) {
21
91
  const optionsProvider = {
@@ -29,31 +99,55 @@ let BrowserActionModule = BrowserActionModule_1 = class BrowserActionModule {
29
99
  };
30
100
  }
31
101
  static forRoot(options) {
102
+ if (options.name)
103
+ return this.forNamedBrowser(options);
32
104
  const optionsProvider = {
33
105
  provide: constants_1.BROWSER_ACTION_OPTIONS,
34
106
  useValue: options,
35
107
  };
36
108
  return {
37
109
  module: BrowserActionModule_1,
110
+ providers: [optionsProvider, ...POOL_MODE_SERVICES],
111
+ exports: [...POOL_MODE_EXPORTS],
112
+ };
113
+ }
114
+ static forNamedBrowser(options) {
115
+ const name = options.name;
116
+ (0, tokens_1.claimBrowserName)(name);
117
+ if (options.remote)
118
+ (0, browser_launcher_1.validateRemoteOptions)(options.remote);
119
+ const optionsProvider = {
120
+ provide: (0, tokens_1.getNamedOptionsToken)(name),
121
+ useValue: options,
122
+ };
123
+ const browserProvider = {
124
+ provide: (0, tokens_1.getBrowserToken)(name),
125
+ useFactory: () => launchNamedBrowser(options),
126
+ };
127
+ const holderProvider = namedBrowserHolderProvider(name);
128
+ const optionsToken = (0, tokens_1.getNamedOptionsToken)(name);
129
+ const healthCheckProvider = namedBrowserHealthCheckProvider(name, optionsToken);
130
+ const shutdownProvider = {
131
+ provide: `${(0, tokens_1.getBrowserToken)(name)}Shutdown`,
132
+ useFactory: (holder, healthCheck) => new named_browser_shutdown_1.NamedBrowserShutdown(name, holder, !!options.remote, healthCheck),
133
+ inject: [(0, tokens_1.getBrowserHolderToken)(name), getHealthCheckToken(name)],
134
+ };
135
+ return {
136
+ module: BrowserActionModule_1,
137
+ global: true,
38
138
  providers: [
39
139
  optionsProvider,
40
- browser_pool_service_1.BrowserPoolService,
41
- browser_manager_service_1.BrowserManagerService,
42
- page_service_1.PageService,
43
- browser_action_service_1.BrowserActionService,
44
- cookie_service_1.CookieService,
45
- cleansing_service_1.CleansingService,
46
- ],
47
- exports: [
48
- browser_manager_service_1.BrowserManagerService,
49
- page_service_1.PageService,
50
- browser_action_service_1.BrowserActionService,
51
- cookie_service_1.CookieService,
52
- cleansing_service_1.CleansingService,
140
+ browserProvider,
141
+ holderProvider,
142
+ healthCheckProvider,
143
+ shutdownProvider,
53
144
  ],
145
+ exports: [browserProvider, holderProvider, optionsProvider],
54
146
  };
55
147
  }
56
148
  static forRootAsync(options) {
149
+ if (options.name)
150
+ return this.forNamedBrowserAsync(options);
57
151
  const asyncOptionsProvider = {
58
152
  provide: constants_1.BROWSER_ACTION_OPTIONS,
59
153
  useFactory: async (...args) => {
@@ -64,22 +158,103 @@ let BrowserActionModule = BrowserActionModule_1 = class BrowserActionModule {
64
158
  return {
65
159
  module: BrowserActionModule_1,
66
160
  imports: options.imports || [],
67
- providers: [
68
- asyncOptionsProvider,
69
- browser_pool_service_1.BrowserPoolService,
70
- browser_manager_service_1.BrowserManagerService,
71
- page_service_1.PageService,
72
- browser_action_service_1.BrowserActionService,
73
- cookie_service_1.CookieService,
74
- cleansing_service_1.CleansingService,
161
+ providers: [asyncOptionsProvider, ...POOL_MODE_SERVICES],
162
+ exports: [...POOL_MODE_EXPORTS],
163
+ };
164
+ }
165
+ static forNamedBrowserAsync(options) {
166
+ const name = options.name;
167
+ (0, tokens_1.claimBrowserName)(name);
168
+ const optionsToken = (0, tokens_1.getNamedOptionsToken)(name);
169
+ const optionsProvider = {
170
+ provide: optionsToken,
171
+ useFactory: async (...args) => {
172
+ const resolved = await options.useFactory(...args);
173
+ if (resolved.remote)
174
+ (0, browser_launcher_1.validateRemoteOptions)(resolved.remote);
175
+ return resolved;
176
+ },
177
+ inject: options.inject || [],
178
+ };
179
+ const browserProvider = {
180
+ provide: (0, tokens_1.getBrowserToken)(name),
181
+ useFactory: (resolved) => launchNamedBrowser(resolved),
182
+ inject: [optionsToken],
183
+ };
184
+ const holderProvider = namedBrowserHolderProvider(name);
185
+ const healthCheckProvider = namedBrowserHealthCheckProvider(name, optionsToken);
186
+ const shutdownProvider = {
187
+ provide: `${(0, tokens_1.getBrowserToken)(name)}Shutdown`,
188
+ useFactory: (holder, resolved, healthCheck) => new named_browser_shutdown_1.NamedBrowserShutdown(name, holder, !!resolved.remote, healthCheck),
189
+ inject: [
190
+ (0, tokens_1.getBrowserHolderToken)(name),
191
+ optionsToken,
192
+ getHealthCheckToken(name),
75
193
  ],
76
- exports: [
77
- browser_manager_service_1.BrowserManagerService,
78
- page_service_1.PageService,
79
- browser_action_service_1.BrowserActionService,
80
- cookie_service_1.CookieService,
81
- cleansing_service_1.CleansingService,
194
+ };
195
+ return {
196
+ module: BrowserActionModule_1,
197
+ global: true,
198
+ imports: options.imports || [],
199
+ providers: [
200
+ optionsProvider,
201
+ browserProvider,
202
+ holderProvider,
203
+ healthCheckProvider,
204
+ shutdownProvider,
82
205
  ],
206
+ exports: [browserProvider, holderProvider, optionsProvider],
207
+ };
208
+ }
209
+ static forFeature(pages, browserName = 'default') {
210
+ const providers = pages.flatMap((pageName) => {
211
+ const pageProvider = {
212
+ provide: (0, tokens_1.getPageToken)(pageName, browserName),
213
+ useFactory: async (browser) => await browser.newPage(),
214
+ inject: [(0, tokens_1.getBrowserToken)(browserName)],
215
+ };
216
+ const controllerProvider = {
217
+ provide: (0, tokens_1.getPageControllerToken)(pageName, browserName),
218
+ useFactory: (holder, page, options) => {
219
+ const debugLen = options.debugLogMaxLength ?? browser_action_constants_1.DEFAULT_DEBUG_LOG_MAX_LENGTH;
220
+ const logger = new logger_util_1.LoggerWithLevel(`PageController:${browserName}/${pageName}`, resolveLogLevel(options.logLevel));
221
+ const pipeEngine = new pipe_engine_1.PipeEngine();
222
+ const extraction = new operators_1.ExtractionOperator(pipeEngine, logger);
223
+ const container = new operators_1.ContainerOperator(extraction, pipeEngine, logger);
224
+ const cleansingService = new cleansing_service_1.CleansingService(options);
225
+ const cookieService = new cookie_service_1.CookieService(options);
226
+ const workflow = new operators_1.WorkflowOperator(extraction, container, pipeEngine, cleansingService, logger, () => cookieService);
227
+ const pagination = new operators_1.PaginationOperator(logger);
228
+ const capture = new operators_1.CaptureOperator(logger);
229
+ const session = new page_session_1.PageSession(browserName, holder, page, options, logger);
230
+ return new page_controller_1.PageController(session, extraction, container, workflow, pagination, capture, logger, debugLen);
231
+ },
232
+ inject: [
233
+ (0, tokens_1.getBrowserHolderToken)(browserName),
234
+ (0, tokens_1.getPageToken)(pageName, browserName),
235
+ (0, tokens_1.getNamedOptionsToken)(browserName),
236
+ ],
237
+ };
238
+ return [pageProvider, controllerProvider];
239
+ });
240
+ const pageCountGuardProvider = {
241
+ provide: `${(0, tokens_1.getBrowserToken)(browserName)}PageCountGuard_${pages.join(',')}`,
242
+ useFactory: (options) => {
243
+ const total = (0, tokens_1.registerPages)(browserName, pages.length);
244
+ const max = options.maxPages ?? browser_action_constants_1.DEFAULT_MAX_PAGES_WARNING;
245
+ if (total > max) {
246
+ const logger = new logger_util_1.LoggerWithLevel('BrowserActionModule', resolveLogLevel(options.logLevel));
247
+ logger.warn(`Named browser "${browserName}" has ${total} registered pages, ` +
248
+ `exceeding the configured maxPages (${max}). This is a sanity ` +
249
+ `warning, not an enforced limit — review your forFeature() calls.`);
250
+ }
251
+ },
252
+ inject: [(0, tokens_1.getNamedOptionsToken)(browserName)],
253
+ };
254
+ return {
255
+ module: BrowserActionModule_1,
256
+ providers: [...providers, pageCountGuardProvider],
257
+ exports: providers,
83
258
  };
84
259
  }
85
260
  async onModuleDestroy() {
@@ -1 +1 @@
1
- {"version":3,"file":"browser-action.module.js","sourceRoot":"","sources":["../src/browser-action.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAyE;AAKzE,0EAAqE;AACrE,gFAA2E;AAC3E,0DAAsD;AACtD,8EAAyE;AACzE,8DAA0D;AAC1D,oEAAgE;AAChE,2CAAqD;AAI9C,IAAM,mBAAmB,2BAAzB,MAAM,mBAAmB;IAC9B,MAAM,CAAC,QAAQ,CAAC,OAAmC;QACjD,MAAM,eAAe,GAAa;YAChC,OAAO,EAAE,kCAAsB;YAC/B,QAAQ,EAAE,OAAO;SAClB,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,qBAAmB;YAC3B,SAAS,EAAE,CAAC,eAAe,CAAC;YAC5B,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAmC;QAChD,MAAM,eAAe,GAAa;YAChC,OAAO,EAAE,kCAAsB;YAC/B,QAAQ,EAAE,OAAO;SAClB,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,qBAAmB;YAC3B,SAAS,EAAE;gBACT,eAAe;gBACf,yCAAkB;gBAClB,+CAAqB;gBACrB,0BAAW;gBACX,6CAAoB;gBACpB,8BAAa;gBACb,oCAAgB;aACjB;YACD,OAAO,EAAE;gBACP,+CAAqB;gBACrB,0BAAW;gBACX,6CAAoB;gBACpB,8BAAa;gBACb,oCAAgB;aACjB;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAwC;QAC1D,MAAM,oBAAoB,GAAa;YACrC,OAAO,EAAE,kCAAsB;YAC/B,UAAU,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;gBACvC,OAAO,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;SAC7B,CAAC;QAEF,OAAO;YACL,MAAM,EAAE,qBAAmB;YAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS,EAAE;gBACT,oBAAoB;gBACpB,yCAAkB;gBAClB,+CAAqB;gBACrB,0BAAW;gBACX,6CAAoB;gBACpB,8BAAa;gBACb,oCAAgB;aACjB;YACD,OAAO,EAAE;gBACP,+CAAqB;gBACrB,0BAAW;gBACX,6CAAoB;gBACpB,8BAAa;gBACb,oCAAgB;aACjB;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe;IAErB,CAAC;CACF,CAAA;AA3EY,kDAAmB;8BAAnB,mBAAmB;IAF/B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,mBAAmB,CA2E/B"}
1
+ {"version":3,"file":"browser-action.module.js","sourceRoot":"","sources":["../src/browser-action.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './tokens';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./tokens"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB"}
@@ -0,0 +1,9 @@
1
+ export declare function getBrowserToken(name: string): string;
2
+ export declare function getPageToken(page: string, name: string): string;
3
+ export declare function getPageControllerToken(page: string, name: string): string;
4
+ export declare function getBrowserHolderToken(name: string): string;
5
+ export declare function getNamedOptionsToken(name: string): string;
6
+ export declare function claimBrowserName(name: string): void;
7
+ export declare function releaseBrowserName(name: string): void;
8
+ export declare function registerPages(browserName: string, count: number): number;
9
+ export declare function releasePageCount(browserName: string): void;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBrowserToken = getBrowserToken;
4
+ exports.getPageToken = getPageToken;
5
+ exports.getPageControllerToken = getPageControllerToken;
6
+ exports.getBrowserHolderToken = getBrowserHolderToken;
7
+ exports.getNamedOptionsToken = getNamedOptionsToken;
8
+ exports.claimBrowserName = claimBrowserName;
9
+ exports.releaseBrowserName = releaseBrowserName;
10
+ exports.registerPages = registerPages;
11
+ exports.releasePageCount = releasePageCount;
12
+ function getBrowserToken(name) {
13
+ return `${name}BrowserActionBrowser`;
14
+ }
15
+ function getPageToken(page, name) {
16
+ return `${name}_${page}BrowserActionPage`;
17
+ }
18
+ function getPageControllerToken(page, name) {
19
+ return `${name}_${page}BrowserActionPageController`;
20
+ }
21
+ function getBrowserHolderToken(name) {
22
+ return `${getBrowserToken(name)}Holder`;
23
+ }
24
+ function getNamedOptionsToken(name) {
25
+ return `BROWSER_ACTION_OPTIONS:${name}`;
26
+ }
27
+ const registeredBrowserNames = new Set();
28
+ function claimBrowserName(name) {
29
+ if (registeredBrowserNames.has(name)) {
30
+ throw new Error(`BrowserActionModule: a browser with name "${name}" is already registered. ` +
31
+ `Each forRoot()/forRootAsync() call must use a unique \`name\`.`);
32
+ }
33
+ registeredBrowserNames.add(name);
34
+ }
35
+ function releaseBrowserName(name) {
36
+ registeredBrowserNames.delete(name);
37
+ }
38
+ const pageCountByBrowser = new Map();
39
+ function registerPages(browserName, count) {
40
+ const total = (pageCountByBrowser.get(browserName) ?? 0) + count;
41
+ pageCountByBrowser.set(browserName, total);
42
+ return total;
43
+ }
44
+ function releasePageCount(browserName) {
45
+ pageCountByBrowser.delete(browserName);
46
+ }
47
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/common/tokens.ts"],"names":[],"mappings":";;AAAA,0CAEC;AAED,oCAEC;AAED,wDAEC;AAED,sDAEC;AAED,oDAEC;AASD,4CAQC;AAED,gDAEC;AAYD,sCAIC;AAED,4CAEC;AA3DD,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,GAAG,IAAI,sBAAsB,CAAC;AACvC,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY,EAAE,IAAY;IACrD,OAAO,GAAG,IAAI,IAAI,IAAI,mBAAmB,CAAC;AAC5C,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAAY,EAAE,IAAY;IAC/D,OAAO,GAAG,IAAI,IAAI,IAAI,6BAA6B,CAAC;AACtD,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1C,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,OAAO,0BAA0B,IAAI,EAAE,CAAC;AAC1C,CAAC;AAOD,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjD,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,6CAA6C,IAAI,2BAA2B;YAC1E,gEAAgE,CACnE,CAAC;IACJ,CAAC;IACD,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAUD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAErD,SAAgB,aAAa,CAAC,WAAmB,EAAE,KAAa;IAC9D,MAAM,KAAK,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IACjE,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC"}
@@ -38,3 +38,4 @@ export declare const DEFAULT_COOKIE_OPTIONS: {
38
38
  readonly autoLoad: false;
39
39
  readonly defaultSessionName: "default";
40
40
  };
41
+ export declare const DEFAULT_MAX_PAGES_WARNING = 5;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_COOKIE_OPTIONS = exports.TLS_CAPTURE_URL = exports.DEFAULT_ERROR_SCREENSHOT_FILENAME = exports.DEFAULT_SCREENSHOT_FILENAME = exports.DEFAULT_SCROLL_DELAY_MS = exports.DEFAULT_NAVIGATION_TIMEOUT = exports.DEFAULT_DEBUG_LOG_MAX_LENGTH = exports.DEFAULT_ACTION_TIMEOUT = exports.DEFAULT_CONTEXT_OPTIONS = exports.ERROR_MESSAGES = exports.AVAILABILITY_CHECK_INTERVAL_MS = exports.DEFAULT_REMOTE_OPTIONS = exports.DEFAULT_LAUNCH_OPTIONS = exports.DEFAULT_POOL_OPTIONS = exports.BROWSER_ACTION_OPTIONS = void 0;
3
+ exports.DEFAULT_MAX_PAGES_WARNING = exports.DEFAULT_COOKIE_OPTIONS = exports.TLS_CAPTURE_URL = exports.DEFAULT_ERROR_SCREENSHOT_FILENAME = exports.DEFAULT_SCREENSHOT_FILENAME = exports.DEFAULT_SCROLL_DELAY_MS = exports.DEFAULT_NAVIGATION_TIMEOUT = exports.DEFAULT_DEBUG_LOG_MAX_LENGTH = exports.DEFAULT_ACTION_TIMEOUT = exports.DEFAULT_CONTEXT_OPTIONS = exports.ERROR_MESSAGES = exports.AVAILABILITY_CHECK_INTERVAL_MS = exports.DEFAULT_REMOTE_OPTIONS = exports.DEFAULT_LAUNCH_OPTIONS = exports.DEFAULT_POOL_OPTIONS = exports.BROWSER_ACTION_OPTIONS = void 0;
4
4
  exports.BROWSER_ACTION_OPTIONS = 'BROWSER_ACTION_OPTIONS';
5
5
  exports.DEFAULT_POOL_OPTIONS = {
6
6
  min: 2,
@@ -41,4 +41,5 @@ exports.DEFAULT_COOKIE_OPTIONS = {
41
41
  autoLoad: false,
42
42
  defaultSessionName: 'default',
43
43
  };
44
+ exports.DEFAULT_MAX_PAGES_WARNING = 5;
44
45
  //# sourceMappingURL=browser-action.constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser-action.constants.js","sourceRoot":"","sources":["../../src/constants/browser-action.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAElD,QAAA,oBAAoB,GAAG;IAClC,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,EAAE;IACP,aAAa,EAAE,KAAK;IACpB,gBAAgB,EAAE,KAAK;IACvB,QAAQ,EAAE,aAAsB;CACjC,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,QAAQ,EAAE,IAAI;CACf,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,IAAI;CACR,CAAC;AAEE,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAErC,QAAA,cAAc,GAAG;IAC5B,oBAAoB,EAClB,2EAA2E;IAC7E,oBAAoB,EAClB,iEAAiE;CAC3D,CAAC;AAEE,QAAA,uBAAuB,GAAG;IACrC,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;KACb;CACF,CAAC;AAGW,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAC/B,QAAA,4BAA4B,GAAG,GAAG,CAAC;AACnC,QAAA,0BAA0B,GAAG,KAAK,CAAC;AACnC,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAC9B,QAAA,2BAA2B,GAAG,YAAY,CAAC;AAC3C,QAAA,iCAAiC,GAAG,OAAO,CAAC;AAG5C,QAAA,eAAe,GAAG,6BAA6B,CAAC;AAEhD,QAAA,sBAAsB,GAAG;IACpC,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,WAAW;IACvB,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;IACf,kBAAkB,EAAE,SAAS;CACrB,CAAC"}
1
+ {"version":3,"file":"browser-action.constants.js","sourceRoot":"","sources":["../../src/constants/browser-action.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAElD,QAAA,oBAAoB,GAAG;IAClC,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,EAAE;IACP,aAAa,EAAE,KAAK;IACpB,gBAAgB,EAAE,KAAK;IACvB,QAAQ,EAAE,aAAsB;CACjC,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,QAAQ,EAAE,IAAI;CACf,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,IAAI;CACR,CAAC;AAEE,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAErC,QAAA,cAAc,GAAG;IAC5B,oBAAoB,EAClB,2EAA2E;IAC7E,oBAAoB,EAClB,iEAAiE;CAC3D,CAAC;AAEE,QAAA,uBAAuB,GAAG;IACrC,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;KACb;CACF,CAAC;AAGW,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAC/B,QAAA,4BAA4B,GAAG,GAAG,CAAC;AACnC,QAAA,0BAA0B,GAAG,KAAK,CAAC;AACnC,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAC9B,QAAA,2BAA2B,GAAG,YAAY,CAAC;AAC3C,QAAA,iCAAiC,GAAG,OAAO,CAAC;AAG5C,QAAA,eAAe,GAAG,6BAA6B,CAAC;AAEhD,QAAA,sBAAsB,GAAG;IACpC,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,WAAW;IACvB,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;IACf,kBAAkB,EAAE,SAAS;CACrB,CAAC;AAME,QAAA,yBAAyB,GAAG,CAAC,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from './inject-browser.decorator';
2
2
  export * from './inject-page.decorator';
3
+ export * from './inject-page-controller.decorator';
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./inject-browser.decorator"), exports);
18
18
  __exportStar(require("./inject-page.decorator"), exports);
19
+ __exportStar(require("./inject-page-controller.decorator"), exports);
19
20
  //# sourceMappingURL=index.js.map