@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.
- package/README.md +78 -45
- package/dist/browser-action.module-definition.d.ts +1 -0
- package/dist/browser-action.module.d.ts +7 -0
- package/dist/browser-action.module.js +203 -28
- package/dist/browser-action.module.js.map +1 -1
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.js +18 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/tokens.d.ts +9 -0
- package/dist/common/tokens.js +47 -0
- package/dist/common/tokens.js.map +1 -0
- package/dist/constants/browser-action.constants.d.ts +1 -0
- package/dist/constants/browser-action.constants.js +2 -1
- package/dist/constants/browser-action.constants.js.map +1 -1
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/inject-browser.decorator.d.ts +2 -1
- package/dist/decorators/inject-browser.decorator.js +2 -1
- package/dist/decorators/inject-browser.decorator.js.map +1 -1
- package/dist/decorators/inject-page-controller.decorator.d.ts +2 -0
- package/dist/decorators/inject-page-controller.decorator.js +8 -0
- package/dist/decorators/inject-page-controller.decorator.js.map +1 -0
- package/dist/decorators/inject-page.decorator.d.ts +2 -1
- package/dist/decorators/inject-page.decorator.js +2 -1
- package/dist/decorators/inject-page.decorator.js.map +1 -1
- package/dist/examples/named-browser-example.d.ts +1 -0
- package/dist/examples/named-browser-example.js +183 -0
- package/dist/examples/named-browser-example.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/browser-action-options.d.ts +6 -0
- package/dist/operators/capture.operator.d.ts +11 -0
- package/dist/operators/capture.operator.js +62 -0
- package/dist/operators/capture.operator.js.map +1 -0
- package/dist/operators/container.operator.d.ts +13 -0
- package/dist/operators/container.operator.js +149 -0
- package/dist/operators/container.operator.js.map +1 -0
- package/dist/operators/extraction.operator.d.ts +22 -0
- package/dist/operators/extraction.operator.js +204 -0
- package/dist/operators/extraction.operator.js.map +1 -0
- package/dist/operators/index.d.ts +5 -0
- package/dist/operators/index.js +14 -0
- package/dist/operators/index.js.map +1 -0
- package/dist/operators/pagination.operator.d.ts +24 -0
- package/dist/operators/pagination.operator.js +182 -0
- package/dist/operators/pagination.operator.js.map +1 -0
- package/dist/operators/workflow.operator.d.ts +35 -0
- package/dist/operators/workflow.operator.js +501 -0
- package/dist/operators/workflow.operator.js.map +1 -0
- package/dist/services/browser-action.service.d.ts +6 -29
- package/dist/services/browser-action.service.js +28 -968
- package/dist/services/browser-action.service.js.map +1 -1
- package/dist/services/browser-health-check.d.ts +11 -0
- package/dist/services/browser-health-check.js +30 -0
- package/dist/services/browser-health-check.js.map +1 -0
- package/dist/services/browser-holder.d.ts +7 -0
- package/dist/services/browser-holder.js +26 -0
- package/dist/services/browser-holder.js.map +1 -0
- package/dist/services/browser-manager.service.js.map +1 -1
- package/dist/services/browser-pool.service.d.ts +0 -4
- package/dist/services/browser-pool.service.js +12 -103
- package/dist/services/browser-pool.service.js.map +1 -1
- package/dist/services/named-browser-shutdown.d.ts +11 -0
- package/dist/services/named-browser-shutdown.js +51 -0
- package/dist/services/named-browser-shutdown.js.map +1 -0
- package/dist/services/page-controller.d.ts +39 -0
- package/dist/services/page-controller.js +325 -0
- package/dist/services/page-controller.js.map +1 -0
- package/dist/services/page-session.d.ts +26 -0
- package/dist/services/page-session.js +135 -0
- package/dist/services/page-session.js.map +1 -0
- package/dist/services/page.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/browser-launcher.d.ts +6 -0
- package/dist/utils/browser-launcher.js +100 -0
- package/dist/utils/browser-launcher.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Browser } from 'puppeteer-core';
|
|
2
|
+
import type { BrowserActionOptions, CloakOptions, RemoteOptions } from '../interfaces/browser-action-options';
|
|
3
|
+
import { LoggerWithLevel } from './logger.util';
|
|
4
|
+
export declare function validateRemoteOptions(remote?: RemoteOptions): void;
|
|
5
|
+
export declare function launchLocalBrowser(base: BrowserActionOptions, cloakOverride?: CloakOptions, logger?: LoggerWithLevel): Promise<Browser>;
|
|
6
|
+
export declare function connectRemoteBrowser(remote: RemoteOptions, logger?: LoggerWithLevel): Promise<Browser>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateRemoteOptions = validateRemoteOptions;
|
|
4
|
+
exports.launchLocalBrowser = launchLocalBrowser;
|
|
5
|
+
exports.connectRemoteBrowser = connectRemoteBrowser;
|
|
6
|
+
const puppeteer_core_1 = require("puppeteer-core");
|
|
7
|
+
const browser_action_constants_1 = require("../constants/browser-action.constants");
|
|
8
|
+
const cloak_loader_1 = require("./cloak.loader");
|
|
9
|
+
const delay_util_1 = require("./delay.util");
|
|
10
|
+
const BLOCKED_CHROMIUM_FLAGS = new Set([
|
|
11
|
+
'--remote-debugging-port',
|
|
12
|
+
'--remote-allow-origins',
|
|
13
|
+
'--load-extension',
|
|
14
|
+
'--disable-web-security',
|
|
15
|
+
'--no-sandbox',
|
|
16
|
+
'--disable-features=IsolateOrigins',
|
|
17
|
+
'--disable-site-isolation-trials',
|
|
18
|
+
'--allow-running-insecure-content',
|
|
19
|
+
'--reduce-security-for-testing',
|
|
20
|
+
'--disable-setuid-sandbox',
|
|
21
|
+
'--single-process',
|
|
22
|
+
'--no-zygote',
|
|
23
|
+
]);
|
|
24
|
+
function validateRemoteOptions(remote) {
|
|
25
|
+
if (!remote)
|
|
26
|
+
return;
|
|
27
|
+
const hasURL = !!remote.browserURL;
|
|
28
|
+
const hasWSEndpoint = !!remote.browserWSEndpoint;
|
|
29
|
+
if (hasURL && hasWSEndpoint) {
|
|
30
|
+
throw new Error(browser_action_constants_1.ERROR_MESSAGES.REMOTE_BOTH_PROVIDED);
|
|
31
|
+
}
|
|
32
|
+
if (!hasURL && !hasWSEndpoint) {
|
|
33
|
+
throw new Error(browser_action_constants_1.ERROR_MESSAGES.REMOTE_NONE_PROVIDED);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function warnOnDangerousFlags(args, logger) {
|
|
37
|
+
if (!args)
|
|
38
|
+
return;
|
|
39
|
+
for (const arg of args) {
|
|
40
|
+
const flagName = arg.split('=')[0];
|
|
41
|
+
if (BLOCKED_CHROMIUM_FLAGS.has(flagName)) {
|
|
42
|
+
logger?.warn(`Potentially dangerous Chromium flag detected: ${flagName}. ` +
|
|
43
|
+
`Only use this flag if you understand the security implications.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function launchLocalBrowser(base, cloakOverride, logger) {
|
|
48
|
+
const { launch, launchPersistentContext } = await (0, cloak_loader_1.loadCloakPuppeteer)();
|
|
49
|
+
const cloak = {
|
|
50
|
+
...(base.cloak ?? {}),
|
|
51
|
+
...(cloakOverride ?? {}),
|
|
52
|
+
};
|
|
53
|
+
const headless = base.launchOptions?.headless ?? cloak.headless;
|
|
54
|
+
const launchOptions = {
|
|
55
|
+
...(cloak.launchOptions ?? {}),
|
|
56
|
+
...base.launchOptions,
|
|
57
|
+
};
|
|
58
|
+
if (Array.isArray(launchOptions.args)) {
|
|
59
|
+
warnOnDangerousFlags(launchOptions.args, logger);
|
|
60
|
+
}
|
|
61
|
+
const cloakOptions = {
|
|
62
|
+
...cloak,
|
|
63
|
+
...(typeof headless === 'boolean' ? { headless } : {}),
|
|
64
|
+
launchOptions,
|
|
65
|
+
};
|
|
66
|
+
return cloak.userDataDir
|
|
67
|
+
? await launchPersistentContext({
|
|
68
|
+
...cloakOptions,
|
|
69
|
+
userDataDir: cloak.userDataDir,
|
|
70
|
+
})
|
|
71
|
+
: await launch(cloakOptions);
|
|
72
|
+
}
|
|
73
|
+
async function connectRemoteBrowser(remote, logger) {
|
|
74
|
+
const { browserURL, browserWSEndpoint, retryMax = browser_action_constants_1.DEFAULT_REMOTE_OPTIONS.retryMax, retryDelay = browser_action_constants_1.DEFAULT_REMOTE_OPTIONS.retryDelay, } = remote;
|
|
75
|
+
const connectOptions = {};
|
|
76
|
+
if (browserURL) {
|
|
77
|
+
connectOptions.browserURL = browserURL;
|
|
78
|
+
}
|
|
79
|
+
else if (browserWSEndpoint) {
|
|
80
|
+
connectOptions.browserWSEndpoint = browserWSEndpoint;
|
|
81
|
+
}
|
|
82
|
+
let lastError;
|
|
83
|
+
for (let attempt = 1; attempt <= retryMax; attempt++) {
|
|
84
|
+
try {
|
|
85
|
+
logger?.debug(`Connecting to remote Chrome (attempt ${attempt}/${retryMax})`);
|
|
86
|
+
const browser = await (0, puppeteer_core_1.connect)(connectOptions);
|
|
87
|
+
logger?.debug('Successfully connected to remote Chrome');
|
|
88
|
+
return browser;
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
lastError = error;
|
|
92
|
+
logger?.warn(`Connection attempt ${attempt}/${retryMax} failed: ${lastError.message}`);
|
|
93
|
+
if (attempt < retryMax) {
|
|
94
|
+
await (0, delay_util_1.delay)(retryDelay);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
throw new Error(`Failed to connect to remote Chrome after ${retryMax} attempts: ${lastError?.message}`);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=browser-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-launcher.js","sourceRoot":"","sources":["../../src/utils/browser-launcher.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hanivanrizky/nestjs-browser-action",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "Stealth browser automation module for NestJS (CloakBrowser + puppeteer-core)",
|
|
5
5
|
"author": "Hanivan Rizky S <hanivan20@gmail.com> (https://www.hanivan.my.id)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"dependencies": {
|
|
70
70
|
"class-transformer": "^0.5.1",
|
|
71
71
|
"class-validator": "^0.15.1",
|
|
72
|
-
"cloakbrowser": "^0.4.
|
|
72
|
+
"cloakbrowser": "^0.4.5",
|
|
73
73
|
"html-entities": "^2.6.0",
|
|
74
74
|
"jsonpath-plus": "^10.4.0",
|
|
75
75
|
"libxmljs2": "^0.37.0",
|