lexxit-automation-framework 2.0.19 → 3.0.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 +246 -57
- package/npmignore +8 -0
- package/package.json +32 -1
- package/public/dashboard.html +591 -0
- package/src/actions/baseHandler.ts +351 -0
- package/src/actions/browserManager.ts +432 -0
- package/src/actions/checkboxHandler.ts +276 -0
- package/src/actions/clickHandler.ts +513 -0
- package/src/actions/customcodehandler.ts +251 -0
- package/src/actions/dropdownHandler.ts +501 -0
- package/src/actions/radiobuttonHandler.ts +286 -0
- package/src/actions/textHandler.ts +498 -0
- package/src/api/server.ts +210 -0
- package/src/config.ts +7 -0
- package/src/executor/functionMap.ts +153 -0
- package/src/executor/mapping.ts +70 -0
- package/src/executor/scriptExecutor.ts +162 -0
- package/src/executor/stepExecutor.ts +289 -0
- package/src/runner/testRunner.ts +78 -0
- package/src/sse/sseManager.ts +130 -0
- package/src/store/executionStore.ts +152 -0
- package/src/store/testDataStore.ts +46 -0
- package/src/types/types.ts +159 -0
- package/src/utils/healingService.ts +210 -0
- package/src/utils/locatorService.ts +73 -0
- package/src/utils/logger.ts +27 -0
- package/src/utils/metadataService.ts +137 -0
- package/src/utils/waitConditions.ts +141 -0
- package/src/validator/validator.ts +140 -0
- package/tsconfig.json +16 -0
- package/bin/lexxit-automation-framework.js +0 -224
- package/dist-obf/app.js +0 -1
- package/dist-obf/controllers/controller.js +0 -1
- package/dist-obf/core/BrowserManager.js +0 -1
- package/dist-obf/core/PlaywrightEngine.js +0 -1
- package/dist-obf/core/ScreenshotManager.js +0 -1
- package/dist-obf/core/TestData.js +0 -1
- package/dist-obf/core/TestExecutor.js +0 -1
- package/dist-obf/core/handlers/AllHandlers.js +0 -1
- package/dist-obf/core/handlers/BaseHandler.js +0 -1
- package/dist-obf/core/handlers/ClickHandler.js +0 -1
- package/dist-obf/core/handlers/CustomCodeHandler.js +0 -1
- package/dist-obf/core/handlers/DropdownHandler.js +0 -1
- package/dist-obf/core/handlers/InputHandler.js +0 -1
- package/dist-obf/core/registry/ActionRegistry.js +0 -1
- package/dist-obf/installer/frameworkLauncher.js +0 -1
- package/dist-obf/public/dashboard.html +0 -591
- package/dist-obf/public/execution.html +0 -510
- package/dist-obf/public/queue-monitor.html +0 -408
- package/dist-obf/queue/ExecutionQueue.js +0 -1
- package/dist-obf/routes/api.routes.js +0 -1
- package/dist-obf/server.js +0 -1
- package/dist-obf/types/types.js +0 -1
- package/dist-obf/utils/chromefinder.js +0 -1
- package/dist-obf/utils/elementHighlight.js +0 -1
- package/dist-obf/utils/locatorHelper.js +0 -1
- package/dist-obf/utils/logger.js +0 -1
- package/dist-obf/utils/response.js +0 -1
- package/dist-obf/utils/responseFormatter.js +0 -1
- package/dist-obf/utils/sseManager.js +0 -1
- package/scripts/postinstall.js +0 -52
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Page } from 'playwright';
|
|
2
|
+
import { LocatorService } from './locatorService';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_TIMEOUT = 10000;
|
|
5
|
+
|
|
6
|
+
export class WaitConditions {
|
|
7
|
+
// ─── waitForVisible ────────────────────────────────────────────────────────
|
|
8
|
+
|
|
9
|
+
static async waitForVisible(page: Page, locators: string[], timeout: number = DEFAULT_TIMEOUT): Promise<void> {
|
|
10
|
+
const resolved = await LocatorService.resolveElement(page, locators, timeout);
|
|
11
|
+
await resolved.element.waitFor({ state: 'visible', timeout });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// ─── waitForHidden ─────────────────────────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
static async waitForHidden(page: Page, locators: string[], timeout: number = DEFAULT_TIMEOUT): Promise<void> {
|
|
17
|
+
const combinedXPath = locators.join(' | ');
|
|
18
|
+
const element = page.locator(`xpath=${combinedXPath}`).first();
|
|
19
|
+
await element.waitFor({ state: 'hidden', timeout });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ─── waitForEnabled ────────────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
static async waitForEnabled(page: Page, locators: string[], timeout: number = DEFAULT_TIMEOUT): Promise<void> {
|
|
25
|
+
const resolved = await LocatorService.resolveElement(page, locators, timeout);
|
|
26
|
+
const handle = await resolved.element.elementHandle();
|
|
27
|
+
|
|
28
|
+
if (!handle) throw new Error('Element handle could not be resolved');
|
|
29
|
+
|
|
30
|
+
await page.waitForFunction(
|
|
31
|
+
(el) => el && !(el as HTMLInputElement).disabled,
|
|
32
|
+
handle,
|
|
33
|
+
{ timeout }
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ─── waitForDisabled ───────────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
static async waitForDisabled(page: Page, locators: string[], timeout: number = DEFAULT_TIMEOUT): Promise<void> {
|
|
40
|
+
const resolved = await LocatorService.resolveElement(page, locators, timeout);
|
|
41
|
+
const handle = await resolved.element.elementHandle();
|
|
42
|
+
|
|
43
|
+
if (!handle) throw new Error('Element handle could not be resolved');
|
|
44
|
+
|
|
45
|
+
await page.waitForFunction(
|
|
46
|
+
(el) => el && (el as HTMLInputElement).disabled,
|
|
47
|
+
handle,
|
|
48
|
+
{ timeout }
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ─── waitForTextEmpty ──────────────────────────────────────────────────────
|
|
53
|
+
|
|
54
|
+
static async waitForTextEmpty(page: Page, locators: string[], timeout: number = DEFAULT_TIMEOUT): Promise<void> {
|
|
55
|
+
const resolved = await LocatorService.resolveElement(page, locators, timeout);
|
|
56
|
+
const handle = await resolved.element.elementHandle();
|
|
57
|
+
|
|
58
|
+
if (!handle) throw new Error('Element handle could not be resolved');
|
|
59
|
+
|
|
60
|
+
await page.waitForFunction(
|
|
61
|
+
(el) => {
|
|
62
|
+
if (!el) return false;
|
|
63
|
+
const tag = (el as HTMLElement).tagName;
|
|
64
|
+
const text = tag === 'INPUT' || tag === 'TEXTAREA'
|
|
65
|
+
? (el as HTMLInputElement).value
|
|
66
|
+
: (el as HTMLElement).innerText;
|
|
67
|
+
return text.trim() === '';
|
|
68
|
+
},
|
|
69
|
+
handle,
|
|
70
|
+
{ timeout }
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ─── waitForTextNotEmpty ───────────────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
static async waitForTextNotEmpty(page: Page, locators: string[], timeout: number = DEFAULT_TIMEOUT): Promise<void> {
|
|
77
|
+
const resolved = await LocatorService.resolveElement(page, locators, timeout);
|
|
78
|
+
const handle = await resolved.element.elementHandle();
|
|
79
|
+
|
|
80
|
+
if (!handle) throw new Error('Element handle could not be resolved');
|
|
81
|
+
|
|
82
|
+
await page.waitForFunction(
|
|
83
|
+
(el) => {
|
|
84
|
+
if (!el) return false;
|
|
85
|
+
const tag = (el as HTMLElement).tagName;
|
|
86
|
+
const text = tag === 'INPUT' || tag === 'TEXTAREA'
|
|
87
|
+
? (el as HTMLInputElement).value
|
|
88
|
+
: (el as HTMLElement).innerText;
|
|
89
|
+
return text.trim() !== '';
|
|
90
|
+
},
|
|
91
|
+
handle,
|
|
92
|
+
{ timeout }
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ─── waitForTextChange ─────────────────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
static async waitForTextChange(page: Page, locators: string[], initialText: string, timeout: number = DEFAULT_TIMEOUT): Promise<void> {
|
|
99
|
+
const resolved = await LocatorService.resolveElement(page, locators, timeout);
|
|
100
|
+
const handle = await resolved.element.elementHandle();
|
|
101
|
+
|
|
102
|
+
if (!handle) throw new Error('Element handle could not be resolved');
|
|
103
|
+
|
|
104
|
+
await page.waitForFunction(
|
|
105
|
+
(arg) => {
|
|
106
|
+
const el = arg.el as HTMLElement | HTMLInputElement | null;
|
|
107
|
+
if (!el) return false;
|
|
108
|
+
const tag = el.tagName;
|
|
109
|
+
const text = tag === 'INPUT' || tag === 'TEXTAREA'
|
|
110
|
+
? (el as HTMLInputElement).value
|
|
111
|
+
: el.innerText;
|
|
112
|
+
return text.trim() !== arg.oldText.trim();
|
|
113
|
+
},
|
|
114
|
+
{ el: handle, oldText: initialText },
|
|
115
|
+
{ timeout }
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ─── waitForTextContains ───────────────────────────────────────────────────
|
|
120
|
+
|
|
121
|
+
static async waitForTextContains(page: Page, locators: string[], expectedSubstring: string, timeout: number = DEFAULT_TIMEOUT): Promise<void> {
|
|
122
|
+
const resolved = await LocatorService.resolveElement(page, locators, timeout);
|
|
123
|
+
const handle = await resolved.element.elementHandle();
|
|
124
|
+
|
|
125
|
+
if (!handle) throw new Error('Element handle could not be resolved');
|
|
126
|
+
|
|
127
|
+
await page.waitForFunction(
|
|
128
|
+
(arg) => {
|
|
129
|
+
const el = arg.el as HTMLElement | HTMLInputElement | null;
|
|
130
|
+
if (!el) return false;
|
|
131
|
+
const tag = el.tagName;
|
|
132
|
+
const text = tag === 'INPUT' || tag === 'TEXTAREA'
|
|
133
|
+
? (el as HTMLInputElement).value
|
|
134
|
+
: el.innerText;
|
|
135
|
+
return text.includes(arg.substring);
|
|
136
|
+
},
|
|
137
|
+
{ el: handle, substring: expectedSubstring },
|
|
138
|
+
{ timeout }
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export interface ValidationError {
|
|
2
|
+
level: 'testset' | 'testscript' | 'step';
|
|
3
|
+
field: string;
|
|
4
|
+
message: string;
|
|
5
|
+
test_script_uid?: string;
|
|
6
|
+
step_name?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// ─── Testset Payload Validation ───────────────────────────────────────────────
|
|
10
|
+
|
|
11
|
+
function validateTestset(payload: any): ValidationError[] {
|
|
12
|
+
const errors: ValidationError[] = [];
|
|
13
|
+
|
|
14
|
+
if (!payload.test_set_name || typeof payload.test_set_name !== 'string') {
|
|
15
|
+
errors.push({ level: 'testset', field: 'test_set_name', message: 'test_set_name is required and must be a string' });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (typeof payload.open_dashboard !== 'boolean') {
|
|
19
|
+
errors.push({ level: 'testset', field: 'open_dashboard', message: 'open_dashboard is required and must be a boolean' });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (typeof payload.parallel !== 'boolean') {
|
|
23
|
+
errors.push({ level: 'testset', field: 'parallel', message: 'parallel is required and must be a boolean' });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (typeof payload.stop_on_failure !== 'boolean') {
|
|
27
|
+
errors.push({ level: 'testset', field: 'stop_on_failure', message: 'stop_on_failure is required and must be a boolean' });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (typeof payload.video_enabled !== 'boolean') {
|
|
31
|
+
errors.push({ level: 'testset', field: 'video_enabled', message: 'video_enabled is required and must be a boolean' });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (payload.exec_mode !== undefined) {
|
|
35
|
+
if (typeof payload.exec_mode !== 'object' || payload.exec_mode === null) {
|
|
36
|
+
errors.push({ level: 'testset', field: 'exec_mode', message: 'exec_mode must be an object' });
|
|
37
|
+
} else {
|
|
38
|
+
if (!['fast', 'medium', 'slow'].includes(payload.exec_mode.mode)) {
|
|
39
|
+
errors.push({ level: 'testset', field: 'exec_mode.mode', message: 'exec_mode.mode must be one of: fast, medium, slow' });
|
|
40
|
+
}
|
|
41
|
+
if (payload.exec_mode.delay_ms !== undefined && typeof payload.exec_mode.delay_ms !== 'number') {
|
|
42
|
+
errors.push({ level: 'testset', field: 'exec_mode.delay_ms', message: 'exec_mode.delay_ms must be a number' });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!Array.isArray(payload.scripts) || payload.scripts.length === 0) {
|
|
48
|
+
errors.push({ level: 'testset', field: 'scripts', message: 'scripts is required and must be a non-empty array' });
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return errors;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ─── Testscript Payload Validation ────────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
function validateTestscript(script: any): ValidationError[] {
|
|
57
|
+
const errors: ValidationError[] = [];
|
|
58
|
+
const uid = script.test_script_uid || 'unknown';
|
|
59
|
+
|
|
60
|
+
if (!script.test_script_uid || typeof script.test_script_uid !== 'string') {
|
|
61
|
+
errors.push({ level: 'testscript', field: 'test_script_uid', message: 'test_script_uid is required and must be a string', test_script_uid: uid });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!script.test_case_name || typeof script.test_case_name !== 'string') {
|
|
65
|
+
errors.push({ level: 'testscript', field: 'test_case_name', message: 'test_case_name is required and must be a string', test_script_uid: uid });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!script.app_id || typeof script.app_id !== 'string') {
|
|
69
|
+
errors.push({ level: 'testscript', field: 'app_id', message: 'app_id is required and must be a string', test_script_uid: uid });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// if (!['chromium', 'firefox', 'edge'].includes(script.browser)) {
|
|
73
|
+
if (!['chromium', 'chrome', 'firefox', 'edge'].includes(script.browser)) {
|
|
74
|
+
errors.push({ level: 'testscript', field: 'browser', message: 'browser must be one of: chromium, firefox, edge', test_script_uid: uid });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (typeof script.headless !== 'boolean') {
|
|
78
|
+
errors.push({ level: 'testscript', field: 'headless', message: 'headless is required and must be a boolean', test_script_uid: uid });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (typeof script.voice_enabled !== 'boolean') {
|
|
82
|
+
errors.push({ level: 'testscript', field: 'voice_enabled', message: 'voice_enabled is required and must be a boolean', test_script_uid: uid });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!['on_failure', 'always', 'never'].includes(script.screenshot_mode)) {
|
|
86
|
+
errors.push({ level: 'testscript', field: 'screenshot_mode', message: 'screenshot_mode must be one of: on_failure, always, never', test_script_uid: uid });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (typeof script.stop_on_failure !== 'boolean') {
|
|
90
|
+
errors.push({ level: 'testscript', field: 'stop_on_failure', message: 'stop_on_failure is required and must be a boolean', test_script_uid: uid });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!Array.isArray(script.steps) || script.steps.length === 0) {
|
|
94
|
+
errors.push({ level: 'testscript', field: 'steps', message: 'steps is required and must be a non-empty array', test_script_uid: uid });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return errors;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ─── Step Payload Validation ──────────────────────────────────────────────────
|
|
101
|
+
|
|
102
|
+
function validateStep(step: any, test_script_uid: string): ValidationError[] {
|
|
103
|
+
const errors: ValidationError[] = [];
|
|
104
|
+
const stepName = step.step_name || 'unknown';
|
|
105
|
+
|
|
106
|
+
if (!step.step_name || typeof step.step_name !== 'string') {
|
|
107
|
+
errors.push({ level: 'step', field: 'step_name', message: 'step_name is required and must be a string', test_script_uid, step_name: stepName });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (!step.step_script || typeof step.step_script !== 'string') {
|
|
111
|
+
errors.push({ level: 'step', field: 'step_script', message: 'step_script is required and must be a string', test_script_uid, step_name: stepName });
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return errors;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ─── Main Validator ───────────────────────────────────────────────────────────
|
|
118
|
+
|
|
119
|
+
export function validatePayload(payload: any): ValidationError[] {
|
|
120
|
+
const allErrors: ValidationError[] = [];
|
|
121
|
+
|
|
122
|
+
const testsetErrors = validateTestset(payload);
|
|
123
|
+
allErrors.push(...testsetErrors);
|
|
124
|
+
|
|
125
|
+
if (!Array.isArray(payload.scripts)) return allErrors;
|
|
126
|
+
|
|
127
|
+
for (const script of payload.scripts) {
|
|
128
|
+
const scriptErrors = validateTestscript(script);
|
|
129
|
+
allErrors.push(...scriptErrors);
|
|
130
|
+
|
|
131
|
+
if (!Array.isArray(script.steps)) continue;
|
|
132
|
+
|
|
133
|
+
for (const step of script.steps) {
|
|
134
|
+
const stepErrors = validateStep(step, script.test_script_uid || 'unknown');
|
|
135
|
+
allErrors.push(...stepErrors);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return allErrors;
|
|
140
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"lib": ["ES2022", "DOM"],
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
"rootDir": "./src",
|
|
8
|
+
"strict": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"resolveJsonModule": true,
|
|
12
|
+
"forceConsistentCasingInFileNames": true
|
|
13
|
+
},
|
|
14
|
+
"include": ["src/**/*"],
|
|
15
|
+
"exclude": ["node_modules", "dist"]
|
|
16
|
+
}
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
'use strict';
|
|
4
|
-
|
|
5
|
-
const { execSync, spawn } = require('child_process');
|
|
6
|
-
const path = require('path');
|
|
7
|
-
const fs = require('fs');
|
|
8
|
-
const os = require('os');
|
|
9
|
-
const http = require('http');
|
|
10
|
-
|
|
11
|
-
const args = process.argv.slice(2);
|
|
12
|
-
const command = args[0];
|
|
13
|
-
|
|
14
|
-
const COLORS = {
|
|
15
|
-
reset: '\x1b[0m',
|
|
16
|
-
green: '\x1b[32m',
|
|
17
|
-
yellow: '\x1b[33m',
|
|
18
|
-
red: '\x1b[31m',
|
|
19
|
-
cyan: '\x1b[36m',
|
|
20
|
-
bold: '\x1b[1m',
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
function info(msg) { console.log(`${COLORS.cyan}[lexxit]${COLORS.reset} ${msg}`); }
|
|
24
|
-
function success(msg) { console.log(`${COLORS.green}✔${COLORS.reset} ${msg}`); }
|
|
25
|
-
function warn(msg) { console.log(`${COLORS.yellow}⚠${COLORS.reset} ${msg}`); }
|
|
26
|
-
function error(msg) { console.log(`${COLORS.red}✖${COLORS.reset} ${msg}`); }
|
|
27
|
-
|
|
28
|
-
// ── Package root = one level up from /bin ──────────────────────────────────
|
|
29
|
-
const PKG_ROOT = path.join(__dirname, '..');
|
|
30
|
-
// const DIST_SERVER = path.join(PKG_ROOT, 'dist', 'server.js');
|
|
31
|
-
const DIST_SERVER = path.join(PKG_ROOT, 'dist-obf', 'server.js');
|
|
32
|
-
const PID_FILE = path.join(os.tmpdir(), 'lexxit-automation-framework.pid');
|
|
33
|
-
const PORT = 5500;
|
|
34
|
-
|
|
35
|
-
// ── Command router ─────────────────────────────────────────────────────────
|
|
36
|
-
if (command === 'start') {
|
|
37
|
-
startFramework();
|
|
38
|
-
} else if (command === 'stop') {
|
|
39
|
-
stopFramework();
|
|
40
|
-
} else if (command === 'status') {
|
|
41
|
-
checkStatus();
|
|
42
|
-
} else {
|
|
43
|
-
printHelp();
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function printHelp() {
|
|
47
|
-
console.log(`
|
|
48
|
-
${COLORS.bold}lexxit-automation-framework${COLORS.reset}
|
|
49
|
-
|
|
50
|
-
Usage:
|
|
51
|
-
lexxit-automation-framework start Start the local agent on port ${PORT}
|
|
52
|
-
lexxit-automation-framework stop Stop the running agent
|
|
53
|
-
lexxit-automation-framework status Check if agent is running
|
|
54
|
-
`);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// ── START ───────────────────────────────────────────────────────────────────
|
|
58
|
-
|
|
59
|
-
function startFramework() {
|
|
60
|
-
info('Starting lexxit-automation-framework...');
|
|
61
|
-
|
|
62
|
-
// 1. Check if already running
|
|
63
|
-
pingHealth((isRunning) => {
|
|
64
|
-
if (isRunning) {
|
|
65
|
-
success(`Framework already running on http://localhost:${PORT}`);
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// // 2. Ensure dist/server.js exists
|
|
70
|
-
// if (!fs.existsSync(DIST_SERVER)) {
|
|
71
|
-
// info('dist/server.js not found — building project first...');
|
|
72
|
-
// try {
|
|
73
|
-
// execSync('npm run build', {
|
|
74
|
-
// cwd: PKG_ROOT,
|
|
75
|
-
// stdio: 'inherit',
|
|
76
|
-
// });
|
|
77
|
-
// success('Build complete.');
|
|
78
|
-
// } catch (e) {
|
|
79
|
-
// error('Build failed. Please run "npm run build" manually inside the framework folder.');
|
|
80
|
-
// process.exit(1);
|
|
81
|
-
// }
|
|
82
|
-
// }
|
|
83
|
-
if (!fs.existsSync(DIST_SERVER)) {
|
|
84
|
-
error(`❌ dist-obf/server.js not found.`);
|
|
85
|
-
error(`Package is not built correctly.`);
|
|
86
|
-
process.exit(1);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (!fs.existsSync(DIST_SERVER)) {
|
|
90
|
-
error(`Still cannot find: ${DIST_SERVER}`);
|
|
91
|
-
error('Please run "npm run build" inside your lexxit-automation-framework folder.');
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// 3. Launch server
|
|
96
|
-
info(`Launching server: ${DIST_SERVER}`);
|
|
97
|
-
|
|
98
|
-
const isWindows = os.platform() === 'win32';
|
|
99
|
-
|
|
100
|
-
// On Windows we use a slightly different spawn approach
|
|
101
|
-
const child = isWindows
|
|
102
|
-
? spawn(process.execPath, [DIST_SERVER], {
|
|
103
|
-
detached: true,
|
|
104
|
-
stdio: 'ignore',
|
|
105
|
-
cwd: PKG_ROOT,
|
|
106
|
-
env: { ...process.env, PORT: String(PORT) },
|
|
107
|
-
windowsHide: true,
|
|
108
|
-
})
|
|
109
|
-
: spawn(process.execPath, [DIST_SERVER], {
|
|
110
|
-
detached: true,
|
|
111
|
-
stdio: 'ignore',
|
|
112
|
-
cwd: PKG_ROOT,
|
|
113
|
-
env: { ...process.env, PORT: String(PORT) },
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
child.unref();
|
|
117
|
-
|
|
118
|
-
// Save PID for stop command
|
|
119
|
-
try {
|
|
120
|
-
fs.writeFileSync(PID_FILE, String(child.pid));
|
|
121
|
-
info(`PID ${child.pid} saved to ${PID_FILE}`);
|
|
122
|
-
} catch (e) {
|
|
123
|
-
warn('Could not save PID file.');
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// 4. Wait up to 30 seconds for server to be ready
|
|
127
|
-
info(`Waiting for framework on http://localhost:${PORT}/api/health ...`);
|
|
128
|
-
waitForHealth(30, 1000, () => {
|
|
129
|
-
success(`lexxit-automation-framework is running on http://localhost:${PORT}`);
|
|
130
|
-
success('You can now use the web app to run tests.');
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// ── STOP ────────────────────────────────────────────────────────────────────
|
|
136
|
-
|
|
137
|
-
function stopFramework() {
|
|
138
|
-
if (!fs.existsSync(PID_FILE)) {
|
|
139
|
-
warn('No PID file found — framework may not be running.');
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const pid = parseInt(fs.readFileSync(PID_FILE, 'utf8').trim(), 10);
|
|
144
|
-
|
|
145
|
-
if (isNaN(pid)) {
|
|
146
|
-
warn('Invalid PID file. Deleting it.');
|
|
147
|
-
fs.unlinkSync(PID_FILE);
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
try {
|
|
152
|
-
process.kill(pid, 'SIGTERM');
|
|
153
|
-
fs.unlinkSync(PID_FILE);
|
|
154
|
-
success(`Framework stopped (PID: ${pid})`);
|
|
155
|
-
} catch (e) {
|
|
156
|
-
// Process may have already exited
|
|
157
|
-
warn(`Could not kill PID ${pid} — it may have already stopped.`);
|
|
158
|
-
if (fs.existsSync(PID_FILE)) fs.unlinkSync(PID_FILE);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// ── STATUS ──────────────────────────────────────────────────────────────────
|
|
163
|
-
|
|
164
|
-
function checkStatus() {
|
|
165
|
-
info('Checking framework status...');
|
|
166
|
-
pingHealth((isRunning) => {
|
|
167
|
-
if (isRunning) {
|
|
168
|
-
success(`Framework is RUNNING on http://localhost:${PORT}`);
|
|
169
|
-
} else {
|
|
170
|
-
warn('Framework is NOT running.');
|
|
171
|
-
info('Start it with: lexxit-automation-framework start');
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// ── HELPERS ─────────────────────────────────────────────────────────────────
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Single health ping — calls callback(true/false)
|
|
180
|
-
*/
|
|
181
|
-
function pingHealth(callback) {
|
|
182
|
-
const req = http.get(
|
|
183
|
-
`http://localhost:${PORT}/api/health`,
|
|
184
|
-
{ timeout: 1500 },
|
|
185
|
-
(res) => {
|
|
186
|
-
callback(res.statusCode === 200);
|
|
187
|
-
}
|
|
188
|
-
);
|
|
189
|
-
req.on('error', () => callback(false));
|
|
190
|
-
req.on('timeout', () => {
|
|
191
|
-
req.destroy();
|
|
192
|
-
callback(false);
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Retries health check every `intervalMs` up to `maxRetries` times.
|
|
198
|
-
* Calls onSuccess() when server responds, exits process on timeout.
|
|
199
|
-
*/
|
|
200
|
-
function waitForHealth(maxRetries, intervalMs, onSuccess) {
|
|
201
|
-
let attempts = 0;
|
|
202
|
-
|
|
203
|
-
const interval = setInterval(() => {
|
|
204
|
-
attempts++;
|
|
205
|
-
process.stdout.write(`\r${COLORS.cyan}[lexxit]${COLORS.reset} Attempt ${attempts}/${maxRetries}...`);
|
|
206
|
-
|
|
207
|
-
pingHealth((isRunning) => {
|
|
208
|
-
if (isRunning) {
|
|
209
|
-
clearInterval(interval);
|
|
210
|
-
process.stdout.write('\n');
|
|
211
|
-
onSuccess();
|
|
212
|
-
} else if (attempts >= maxRetries) {
|
|
213
|
-
clearInterval(interval);
|
|
214
|
-
process.stdout.write('\n');
|
|
215
|
-
error('Framework did not start in time.');
|
|
216
|
-
error(`Try running directly to see errors:`);
|
|
217
|
-
console.log(` node "${DIST_SERVER}"`);
|
|
218
|
-
process.exit(1);
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
}, intervalMs);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
package/dist-obf/app.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
'use strict';const a0_0xeedcfe=a0_0x2154;(function(_0x58b248,_0x38135d){const _0x1baed5=a0_0x2154,_0x682549=_0x58b248();while(!![]){try{const _0x4de09c=-parseInt(_0x1baed5(0x130))/0x1+parseInt(_0x1baed5(0x12e))/0x2*(parseInt(_0x1baed5(0x132))/0x3)+-parseInt(_0x1baed5(0x142))/0x4*(parseInt(_0x1baed5(0x12c))/0x5)+-parseInt(_0x1baed5(0x150))/0x6*(-parseInt(_0x1baed5(0x136))/0x7)+parseInt(_0x1baed5(0x140))/0x8*(-parseInt(_0x1baed5(0x14d))/0x9)+parseInt(_0x1baed5(0x12d))/0xa+parseInt(_0x1baed5(0x14f))/0xb*(parseInt(_0x1baed5(0x143))/0xc);if(_0x4de09c===_0x38135d)break;else _0x682549['push'](_0x682549['shift']());}catch(_0x1109c4){_0x682549['push'](_0x682549['shift']());}}}(a0_0x48e5,0xd6e32));var a0_0xa8baf6=this&&this[a0_0xeedcfe(0x141)]||function(_0x5e6861){const _0x2c3f89=a0_0xeedcfe;return _0x5e6861&&_0x5e6861[_0x2c3f89(0x12b)]?_0x5e6861:{'default':_0x5e6861};};Object[a0_0xeedcfe(0x139)](exports,a0_0xeedcfe(0x12b),{'value':!![]});function a0_0x2154(_0x3efa67,_0x3e3ff0){_0x3efa67=_0x3efa67-0x129;const _0x48e570=a0_0x48e5();let _0x215432=_0x48e570[_0x3efa67];if(a0_0x2154['LAXAGC']===undefined){var _0x296eea=function(_0x36f8ba){const _0x385f51='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x133d27='',_0x36f724='';for(let _0x22dcfc=0x0,_0x31bf51,_0xca5d19,_0x59c4dd=0x0;_0xca5d19=_0x36f8ba['charAt'](_0x59c4dd++);~_0xca5d19&&(_0x31bf51=_0x22dcfc%0x4?_0x31bf51*0x40+_0xca5d19:_0xca5d19,_0x22dcfc++%0x4)?_0x133d27+=String['fromCharCode'](0xff&_0x31bf51>>(-0x2*_0x22dcfc&0x6)):0x0){_0xca5d19=_0x385f51['indexOf'](_0xca5d19);}for(let _0x1f736e=0x0,_0x1daca6=_0x133d27['length'];_0x1f736e<_0x1daca6;_0x1f736e++){_0x36f724+='%'+('00'+_0x133d27['charCodeAt'](_0x1f736e)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x36f724);};a0_0x2154['oUZDAW']=_0x296eea,a0_0x2154['iqckzt']={},a0_0x2154['LAXAGC']=!![];}const _0x4ddc55=_0x48e570[0x0],_0x28bbc7=_0x3efa67+_0x4ddc55,_0x112b5e=a0_0x2154['iqckzt'][_0x28bbc7];return!_0x112b5e?(_0x215432=a0_0x2154['oUZDAW'](_0x215432),a0_0x2154['iqckzt'][_0x28bbc7]=_0x215432):_0x215432=_0x112b5e,_0x215432;}function a0_0x48e5(){const _0x1b74bf=['zgfZAgjVyxjKlMH0BwW','u0rdB0O','odq5muPLDgPsCW','CxvLDwuTBw9UAxrVCI5ODg1S','C3rHDhvZ','zgvMAw5LuhjVCgvYDhK','C2vUzezPBgu','AM9PBG','rgLlrva','y29YCW','l2rHC2HIB2fYzc86zxHLy3v0Aw9Uswq','ChjqBvC','mty4odH0Dgvdsvu','x19PBxbVCNrezwzHDwX0','ntjKzvHsAva','mZzQA1vbD0i','DgncCwK','z2v0','zxHWCMvZCW','DxnL','DxjSzw5JB2rLza','tM90igzVDw5K','C2vcB2G','l3f1zxvLlw1VBML0B3i','EKvMANO','mZq5mKLNsxPyva','ANnVBG','nZG1odG2mNr1q1fKrG','ndyXne5hrxHsvG','ChvIBgLJ','lI9YB3v0zxmVyxbPlNjVDxrLCW','zxHLy3v0Aw9UlMH0BwW','zgvMyxvSDa','x19LC01VzhvSzq','ntyXntK1r1nlC3jk','nJy4nJGYmhrwDNjZAG','ndaZmdCWDK1Nq29U','C3rHDgLJ','nZG2otq3zeHprfzp','Cgf0Aa','m2HKD3nKtq','l2fWAq'];a0_0x48e5=function(){return _0x1b74bf;};return a0_0x48e5();}const a0_0x4e4505=a0_0xa8baf6(require(a0_0xeedcfe(0x146))),a0_0x15fa83=a0_0xa8baf6(require(a0_0xeedcfe(0x13d))),a0_0xb7458f=a0_0xa8baf6(require(a0_0xeedcfe(0x131))),a0_0x140bc0=a0_0xa8baf6(require(a0_0xeedcfe(0x152))),a0_0x4bd052=(0x0,a0_0x4e4505[a0_0xeedcfe(0x12a)])();a0_0x4bd052[a0_0xeedcfe(0x147)]((0x0,a0_0x15fa83[a0_0xeedcfe(0x12a)])({'origin':'*'})),a0_0x4bd052[a0_0xeedcfe(0x147)](a0_0x4e4505[a0_0xeedcfe(0x12a)][a0_0xeedcfe(0x14e)]({'limit':'20mb'})),a0_0x4bd052['use'](a0_0x4e4505['default'][a0_0xeedcfe(0x148)]({'extended':!![]})),a0_0x4bd052[a0_0xeedcfe(0x147)](a0_0x4e4505['default'][a0_0xeedcfe(0x12f)](a0_0xb7458f[a0_0xeedcfe(0x12a)][a0_0xeedcfe(0x13b)](__dirname,a0_0xeedcfe(0x151)))),a0_0x4bd052['get'](a0_0xeedcfe(0x13e),(_0x988282,_0x16b1a7)=>{const _0x4da4be=a0_0xeedcfe,_0x767843={'DiKEP':'public','prPmW':_0x4da4be(0x134)};_0x16b1a7[_0x4da4be(0x13a)](a0_0xb7458f[_0x4da4be(0x12a)][_0x4da4be(0x13b)](__dirname,_0x767843[_0x4da4be(0x13c)],_0x767843[_0x4da4be(0x13f)]));}),a0_0x4bd052[a0_0xeedcfe(0x145)]('/dashboard/:executionId/:scriptUid',(_0x4050d1,_0x2636a4)=>{const _0xa54679=a0_0xeedcfe,_0x4fccf8={'tcBqi':_0xa54679(0x151),'seBoh':'dashboard.html'};_0x2636a4[_0xa54679(0x13a)](a0_0xb7458f[_0xa54679(0x12a)][_0xa54679(0x13b)](__dirname,_0x4fccf8[_0xa54679(0x144)],_0x4fccf8[_0xa54679(0x14a)]));}),a0_0x4bd052[a0_0xeedcfe(0x145)]('/execution/:executionId',(_0x564fe1,_0x1c6b5a)=>{const _0x3df95b=a0_0xeedcfe,_0x2d5abc={'SDCoJ':'public'};_0x1c6b5a[_0x3df95b(0x13a)](a0_0xb7458f['default'][_0x3df95b(0x13b)](__dirname,_0x2d5abc[_0x3df95b(0x135)],_0x3df95b(0x129)));}),a0_0x4bd052[a0_0xeedcfe(0x145)](a0_0xeedcfe(0x14b),(_0x4e1531,_0x318692)=>{const _0x5f10a8=a0_0xeedcfe,_0x27940f={'zEfjz':_0x5f10a8(0x151)};_0x318692['sendFile'](a0_0xb7458f[_0x5f10a8(0x12a)]['join'](__dirname,_0x27940f[_0x5f10a8(0x14c)],_0x5f10a8(0x137)));}),a0_0x4bd052['use'](a0_0xeedcfe(0x133),a0_0x140bc0[a0_0xeedcfe(0x12a)]),a0_0x4bd052[a0_0xeedcfe(0x147)]((_0xd07801,_0x44832f)=>_0x44832f[a0_0xeedcfe(0x138)](0x194)[a0_0xeedcfe(0x14e)]({'error':a0_0xeedcfe(0x149)})),exports[a0_0xeedcfe(0x12a)]=a0_0x4bd052;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
'use strict';function a1_0x187d(_0x825331,_0x40eb52){_0x825331=_0x825331-0x8b;const _0xff1007=a1_0xff10();let _0x187daf=_0xff1007[_0x825331];if(a1_0x187d['VeDWjf']===undefined){var _0x29415c=function(_0x404bdb){const _0x1e13b7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x628c44='',_0x520033='';for(let _0x4ba418=0x0,_0x2038ea,_0x139278,_0x3d4735=0x0;_0x139278=_0x404bdb['charAt'](_0x3d4735++);~_0x139278&&(_0x2038ea=_0x4ba418%0x4?_0x2038ea*0x40+_0x139278:_0x139278,_0x4ba418++%0x4)?_0x628c44+=String['fromCharCode'](0xff&_0x2038ea>>(-0x2*_0x4ba418&0x6)):0x0){_0x139278=_0x1e13b7['indexOf'](_0x139278);}for(let _0x181faf=0x0,_0x44b5a9=_0x628c44['length'];_0x181faf<_0x44b5a9;_0x181faf++){_0x520033+='%'+('00'+_0x628c44['charCodeAt'](_0x181faf)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x520033);};a1_0x187d['aJVpnZ']=_0x29415c,a1_0x187d['UzFYAe']={},a1_0x187d['VeDWjf']=!![];}const _0x3a8bc6=_0xff1007[0x0],_0x5df89e=_0x825331+_0x3a8bc6,_0x7c477a=a1_0x187d['UzFYAe'][_0x5df89e];return!_0x7c477a?(_0x187daf=a1_0x187d['aJVpnZ'](_0x187daf),a1_0x187d['UzFYAe'][_0x5df89e]=_0x187daf):_0x187daf=_0x7c477a,_0x187daf;}const a1_0x2a8148=a1_0x187d;(function(_0x3e6708,_0x48b5dc){const _0xe476e5=a1_0x187d,_0x5a8553=_0x3e6708();while(!![]){try{const _0x5ce0a6=-parseInt(_0xe476e5(0x1a9))/0x1+-parseInt(_0xe476e5(0x15c))/0x2*(-parseInt(_0xe476e5(0xbc))/0x3)+-parseInt(_0xe476e5(0xc2))/0x4+parseInt(_0xe476e5(0x159))/0x5*(-parseInt(_0xe476e5(0xe5))/0x6)+-parseInt(_0xe476e5(0x8f))/0x7+parseInt(_0xe476e5(0x170))/0x8*(parseInt(_0xe476e5(0xbf))/0x9)+-parseInt(_0xe476e5(0x11c))/0xa*(-parseInt(_0xe476e5(0x155))/0xb);if(_0x5ce0a6===_0x48b5dc)break;else _0x5a8553['push'](_0x5a8553['shift']());}catch(_0x4168af){_0x5a8553['push'](_0x5a8553['shift']());}}}(a1_0xff10,0x93653));var a1_0x216696=this&&this[a1_0x2a8148(0x8b)]||(Object[a1_0x2a8148(0x12a)]?function(_0x4ee7a7,_0x2d11a0,_0x42a38f,_0xc1dd23){const _0x721e3a=a1_0x2a8148,_0x1a742d={'CnTew':function(_0x1b857e,_0x553e25){return _0x1b857e in _0x553e25;},'oIqGv':_0x721e3a(0x162)};if(_0xc1dd23===undefined)_0xc1dd23=_0x42a38f;var _0x4c6531=Object[_0x721e3a(0xff)](_0x2d11a0,_0x42a38f);(!_0x4c6531||(_0x1a742d[_0x721e3a(0x135)](_0x1a742d[_0x721e3a(0x193)],_0x4c6531)?!_0x2d11a0[_0x721e3a(0xdc)]:_0x4c6531[_0x721e3a(0x9b)]||_0x4c6531['configurable']))&&(_0x4c6531={'enumerable':!![],'get':function(){return _0x2d11a0[_0x42a38f];}}),Object[_0x721e3a(0x119)](_0x4ee7a7,_0xc1dd23,_0x4c6531);}:function(_0x31aa2b,_0x16924f,_0xa03ea5,_0x3a56a4){const _0x45cdd4=a1_0x2a8148,_0x2a0f45={'zusnD':function(_0x10a099,_0x26e6c4){return _0x10a099===_0x26e6c4;}};if(_0x2a0f45[_0x45cdd4(0x105)](_0x3a56a4,undefined))_0x3a56a4=_0xa03ea5;_0x31aa2b[_0x3a56a4]=_0x16924f[_0xa03ea5];}),a1_0x349d5b=this&&this[a1_0x2a8148(0x98)]||(Object[a1_0x2a8148(0x12a)]?function(_0x588fc8,_0x2fc948){const _0x13af31=a1_0x2a8148;Object[_0x13af31(0x119)](_0x588fc8,_0x13af31(0x1a2),{'enumerable':!![],'value':_0x2fc948});}:function(_0x256626,_0xfd37ac){const _0x51f5ae=a1_0x2a8148,_0x4466fe={'UbsPo':_0x51f5ae(0x1a2)};_0x256626[_0x4466fe[_0x51f5ae(0xbe)]]=_0xfd37ac;}),a1_0x2e85ea=this&&this[a1_0x2a8148(0x118)]||(function(){const _0x37dc61=a1_0x2a8148,_0x30aaa5={'oKQxY':function(_0x25b25e,_0x32826b){return _0x25b25e===_0x32826b;},'YusxH':function(_0x20818e,_0x336c66){return _0x20818e===_0x336c66;},'LPxLK':'IIZhD','SBrFY':_0x37dc61(0x15b),'oTaKV':function(_0x2079f0,_0x57a499){return _0x2079f0!==_0x57a499;},'HPnIw':_0x37dc61(0x113),'qiBDW':_0x37dc61(0x92),'uGXCa':_0x37dc61(0x90),'wmSEq':function(_0x5b4d5e,_0x559557,_0x46eebb){return _0x5b4d5e(_0x559557,_0x46eebb);},'QCMPP':function(_0x43d29e,_0x44ddaf){return _0x43d29e!=_0x44ddaf;},'PhTmy':function(_0x2c97de,_0x10d015){return _0x2c97de(_0x10d015);},'aNMlZ':function(_0x4ed129,_0x3f72d1){return _0x4ed129<_0x3f72d1;},'yUEYg':_0x37dc61(0x1a2),'GQnaz':function(_0xe96ed6,_0x215316,_0x537a4e,_0x4cb25d){return _0xe96ed6(_0x215316,_0x537a4e,_0x4cb25d);}};var _0x2a96ba=function(_0x46f71c){const _0x18c202=_0x37dc61,_0x561f88={'XktWm':function(_0x40526a,_0x2ebf59){const _0x577b82=a1_0x187d;return _0x30aaa5[_0x577b82(0x174)](_0x40526a,_0x2ebf59);},'jsqIG':_0x18c202(0x132),'Agfyd':function(_0x24277d,_0x446d9f){const _0xfc339a=_0x18c202;return _0x30aaa5[_0xfc339a(0x19d)](_0x24277d,_0x446d9f);},'RZOAa':_0x30aaa5[_0x18c202(0xb1)],'bZGVF':_0x30aaa5[_0x18c202(0x8c)]};if(_0x30aaa5[_0x18c202(0xa3)](_0x30aaa5[_0x18c202(0xa2)],_0x30aaa5[_0x18c202(0xdd)]))return _0x2a96ba=Object[_0x18c202(0xcd)]||function(_0x2fb731){const _0x357088=_0x18c202;if(_0x561f88[_0x357088(0x1a3)](_0x561f88['RZOAa'],_0x561f88[_0x357088(0x106)]))(!_0x51a277[_0x357088(0x13e)]||_0x561f88[_0x357088(0x143)](_0x5e8f41[_0x357088(0x13e)][_0x357088(0xa1)](),''))&&_0x2a2e42[_0x357088(0x160)](_0x285834[_0x357088(0x13a)]||_0x561f88[_0x357088(0x14c)]);else{var _0x549c81=[];for(var _0x39abcf in _0x2fb731)if(Object[_0x357088(0xb7)]['hasOwnProperty']['call'](_0x2fb731,_0x39abcf))_0x549c81[_0x549c81[_0x357088(0x187)]]=_0x39abcf;return _0x549c81;}},_0x2a96ba(_0x46f71c);else{var _0xb3fc90=[];for(var _0x45d0cb in _0x52e7ca)if(_0x5da314[_0x18c202(0xb7)]['hasOwnProperty'][_0x18c202(0x182)](_0x2fa750,_0x45d0cb))_0xb3fc90[_0xb3fc90[_0x18c202(0x187)]]=_0x45d0cb;return _0xb3fc90;}};return function(_0x1bd359){const _0x112fcd=_0x37dc61,_0x299429=_0x30aaa5[_0x112fcd(0x1ab)]['split']('|');let _0x1ad137=0x0;while(!![]){switch(_0x299429[_0x1ad137++]){case'0':if(_0x1bd359&&_0x1bd359['__esModule'])return _0x1bd359;continue;case'1':_0x30aaa5[_0x112fcd(0x15e)](a1_0x349d5b,_0x2f20dc,_0x1bd359);continue;case'2':var _0x2f20dc={};continue;case'3':return _0x2f20dc;case'4':if(_0x30aaa5['QCMPP'](_0x1bd359,null)){for(var _0x1bfdd7=_0x30aaa5['PhTmy'](_0x2a96ba,_0x1bd359),_0x82d8ea=0x0;_0x30aaa5['aNMlZ'](_0x82d8ea,_0x1bfdd7[_0x112fcd(0x187)]);_0x82d8ea++)if(_0x30aaa5[_0x112fcd(0xa3)](_0x1bfdd7[_0x82d8ea],_0x30aaa5[_0x112fcd(0x150)]))_0x30aaa5[_0x112fcd(0x145)](a1_0x216696,_0x2f20dc,_0x1bd359,_0x1bfdd7[_0x82d8ea]);}continue;}break;}};}());function a1_0xff10(){const _0x402116=['DfnLDhvWlNjLzNjLC2HqywDLkcK','AxjNr3u','z2v0vgv4Da','y2HYB21PDw0','DfnLDhvWlM5HDMLNyxrLqMfJAYGP','l2fWAs9ZDhjLyw0V','mtyXmtm2mfDewuXvDa','AgvHBhrO','DfnLDhvWlMnSAwnRtNrOrwXLBwvUDcGNEhbHDgGNlcaNlY9SAsCSicCYjYK','DfnLDhvWlMrPC21PC3nbBgvYDcGP','B0TrEfK','ChjLC3nlzxK','AK9tB1a','C3rLChm','qxbPq29UDhjVBgXLCG','z0HOwKG','CgfYyw1Z','Ag92zxi','C3rHCNrLzef0','BMf2AwDHDgvgB3j3yxjK','DMvYAwz5vgfIBgvdzwXS','DfnLDhvWlMnSAwnRswzqCMvZzw50kcD4Cgf0AcCSicCVl2j1DhrVBLSUlI5DjYK','DwzLz3u','z2v0q2HYB21Lugf0Aa','y2fSBa','vNHfseO','C3rVCf9VBL9MywLSDxjL','Bwf4Aw1PEMvxAw5KB3C','rLrbEe4','BgvUz3rO','DfnLDhvWlNn3AxrJAfrVrNjHBwuOj2zYyw1LtMfTzsCP','y2XPy2TjzLbYzxnLBNq','CNvUvgvZDa','DfnLDhvWlMnSzwfYtg9JywXtDg9YywDLkcK','y2HPBgrFChjVy2vZCW','y2XLyxjmB2nHBfn0B3jHz2u','DfnLDhvWlMnOzwnRq2HLy2TIB3GOj3HWyxrOjYWGjY8VAw5WDxrBqhr5Cgu9iMnOzwnRyM94iL0Nkq','z2v0q3vYCMvUDfvsta','C3bHD24','DMvYAwz5ugfYDgLHBfvsta','y2fUy2vSqwXS','B0LXr3y','D2fPDezVCKvSzw1LBNriAwrKzw4','C2nYB2XSvg9uB3a','C2vSzwn0rhjVCgrVD24','C2nYAxb0CW','DfnLDhvWlNzLCMLMEvrPDgXLkcDfEhbLy3rLzcbuAxrSzsCP','u3rLChmGyxjLig1PC3nPBMCGC3rLCf9Zy3jPChqGzMLLBgqU','C2v0sw5WDxrwywX1zq','zxjYB3i','DfnLDhvWlMfWCgvUzfrLEhqOj3HWyxrOjYWGjY8VAw5WDxrBlI4UxsCSicCGzxH0CMeNkq','wxvZEeG','DfnLDhvWlNDHAxrgB3jqywDLtg9HzcGNmtaWmdaNkq','ls11C2vYlwrHDgeTzgLYpq','zxHLy3v0zvnJCMLWDa','vvzUv0u','zgvMyxvSDa','qwDMEwq','C2vSzwn0qxv0B2nVBxbSzxrL','C2vSzwn0qNLwywX1zq','DgvZDf9JyxnLx25HBwu','DfnLDhvWlNnLBgvJDen1C3rVBurYB3bKB3DUkcD4Cgf0AcCSicCVl2rPDI5KzcCSicD4Cgf0AcCSicCVl2XPjYK','z2v0vgL0Bgu','mZKYmZaYA2DAv1ni','z2v0sM9I','DuDyq2e','x19JCMvHDgvcAw5KAw5N','u0jYrLK','rxHLy3v0Aw9UigzHAwXLzcb3AxrOig5VihjLC3vSDa','qxnTBgK','odqZmZe4mgDPEuPzCW','mhWYFdr8mxWZ','DMvYAwz5vgv4DenVBNrHAw5Z','CK1vwe8','zhjHz0fUzerYB3a','z2v0sw5WDxrwywX1zq','DMvYAwz5sgLKzgvU','j3nJCMLWDhmNigfYCMf5igLZihjLCxvPCMvKlG','DfnLDhvWlNnLBgvJDerYB3bKB3DUkcD4Cgf0AcCSicCVl3nLBgvJDcCSicDpChrPB24GtgfIzwWNkq','x19ZzxrnB2r1BgvezwzHDwX0','q2HYB21Lig5VDcbMB3vUzcbVBIb0AgLZig1Hy2HPBMuU','CMvZB2X2zq','D3jPDgfIBgu','CNvUBMLUzW','DMvYAwz5rwXLBwvUDenVDw50','DfnLDhvWlNzLCMLMEurPC2fIBgvKkcD4Cgf0AcCSicCVl2j1DhrVBLSUlI5DjYK','DfnLDhvWlMDLDfrLEhqOj3HWyxrOjYWGjY8VAdeNlcaNC3rVCMvlzxKNkq','Bwf4x3bHCMfSBgvS','DhjPBq','sfbUsxC','B1rHs1y','DfnLDhvWlNDHAxrgB3jozxr3B3jRswrSzsGNmtaWmdaNkq','DMvYAwz5qxr0CMLIDxrL','DMvYAwz5ugfYDgLHBfrPDgXL','zhjVCgrVD24','Cgf5Bg9Hza','zw5XDwv1zq','y2fUy2vSBgvK','DfnLDhvWlMTLEunVBwjVkcDdB250CM9Sk0eNkq','Dw5Yzwy','EhHov2i','AM9PBG','rw5XDwv1zwq6ia','C2vSzwn0qNLjBMrLEa','tfb4teS','DfnLDhvWlNnLDfDPBMrVD1nPEMuOjZe5mJaNlcaNmta4mcCP','DMvYAwz5vvjm','DfnLDhvWlMHVDMvYkcD4Cgf0AcCSicCVl2rPDLSUlI5DjYK','DfnLDhvWlNDHAxrgB3jfBgvTzw50sgLKzgvUkcD4Cgf0AcCSicCVl2rPDLTaAwq9iMXVywrLCIjDjYWGjZeWmdaWjYK','DfnLDhvWlNzLCMLMEvrHyMXLq2vSBcGNEhbHDgGNlcaNlY90ywjSzs90yM9KEs90CLSXxs90zfSYxsCSicDfEhbLy3rLzcCP','ChjVDg90ExbL','DNbAA1C','Dg1fCu8','Aw5WDxq','DMvYAwz5rgLZywjSzwq','oxzos2Dmsa','BxH5rKS','vwjZug8','ou9st2TctW','Bgf1BMnOzwq','A2v5yM9HCMq','nda0odC5mK9KtKvKsG','wLLVAvK','r1PRzLC','DgvZDf9Zy3jPChrFDwLK','DhLWzvrLEhq','DMvYAwz5vgv4Da','D2fPDa','lI4VDxrPBhmVC3nLtwfUywDLCG','ls1UBY1MAxjZDc1YDw4','C0XnCwW','Dw5JAgvJA0nOzwnRyM94','z2v0t3DUuhjVCgvYDhLoyw1LCW','DfnLDhvWlNnJCM9SBfrVqM90Dg9TkcK','DfnLDhvWlNDHAxrgB3jvuKWOj2rHC2HIB2fYzcCSicCXmdaWmcCP','twT2A0C','DfnLDhvWlNr5CgvuzxH0kcD4Cgf0AcCSicCVl2LUChv0wY4UlL0NlcaNDMfSDwuNlcaNntaNkq','Ahr0CdOVl2XVy2fSAg9ZDdO','y2fUy2vSrxHLy3v0Aw9U','rxHLy3v0Aw9Uia','DfnLDhvWlNDHAxrgB3jfBgvTzw50kcD4Cgf0AcCSicCVl2rPDICSicCXmdaWmcCP','DfnLDhvWlM9Wzw5cCM93C2vYkcDJAhjVBwuNkq','u1HQz1y','y2fUy2vSBgvKqxq','C1rov0O','zvzpA0i','C2vSzwn0q3vZDg9TrhjVCgrVD24','x19LC01VzhvSzq','CwLcrfC','uMvJB3jKAw5NigjYB3DZzxiGBgf1BMnOzwqGFcb1Awq9','y1vUtu0','zxHLy3v0Aw9UuxvLDwu','rxHLy3v0Aw9Uihf1zxvLzc4GrgfZAgjVyxjKig9Wzw5PBMCUifn1yNnJCMLIzsb0BYbZDhjLyw1vuKWGzM9YigXPDMuGDxbKyxrLCYWGB3iGCg9SBcbYzxn1BhrvuKWGzM9YigzPBMfSihjLC3vSDc4','z2v0u3rHDhvZ','DfnLDhvWlMDLDen1CNjLBNrvuKWOkq','AgX5vKe','mtmWmK5HExrfBq','C3rHDhvZ','y2XVC2vdDxjYzw50vgfI','DfnLDhvWlNvWBg9HzezPBguOj3HWyxrOjYWGjY8VAw5WDxrBqhr5Cgu9iMzPBguIxsCSicCVCgf0Ac9MAwXLlNbKzICP','y2fUy2vS','DfnLDhvWlMvUDgvYvgv4DcGNEhbHDgGNlcaNlY9PBNb1DfSUlI5DjYWGj3zHBhvLjYK','u3rLChmGD2L0Ag91DcbZDgvWx3nJCMLWDdOG','DgfLz0C','uwHeugO','yNjVD3nLCG','rxHLy3v0Aw9UihDHCYbJyw5JzwXSzwq','Aw5MBW','CKzQzxC','C2vSzwn0uMfKAw8','zgLZBwLZC0fSzxj0','sw52ywXPzcbYzxf1zxn0iokaLcaNCMvZCcCGzMLLBgqGAxmGCMvXDwLYzwqU','C2XPy2u','DfnLDhvWlM9Wzw5ozxDuywiOj2H0DhbZoI8VzxHHBxbSzs5JB20Nkq','BgLZDefJDgLVBNm','ANnVBG','y2XPy2S','C3DPDgnOvg9gCMfTzq','DfnLDhvWlNn3AxrJAfrVvgfIkcCXjYK','CMvMCMvZAfbHz2u','zgvSzxrLqwXSq29VA2LLCW','AwDUB3jL','z2v0t3DUuhjVCgvYDhLezxnJCMLWDg9Y','yxbWzw5Kvgv4Da','vKHvqwK','B3bLBK5LD1rHyG','C3DPDgnOvg9uywi','DfnLDhvWlMnSAwnRvgfIBgvsB3COj3HWyxrOjYWGjY8VDgfIBguVDgjVzhKVDhiNlcaNmYCP','ENvZBKq','yLPhvKy','C2XLzxa','y3vZDg9Ty29Kzq','C2v0v2LUzg93u2L6zq','y2XPy2TfBgvTzw50','y2XLyxjuzxH0','DfnLDhvWlNnLBgvJDfjHzgLVkcD4Cgf0AcCSicCVl2LUChv0w0b0ExbLpsjYywrPBYjDw0b2ywX1zt0IB3b0msjDjYK','yxnZzxj0Aw9U','qvz4v08','DfnLDhvWlNnLDeLUChv0vMfSDwuOj3HWyxrOjYWGjY8VAw5WDxqNlcaNDMfSDwuNkq','y2XVC2vcCM93C2vY','CxvLDwvK','z2v0qwXLCNruzxH0','quv3AwC','DfnLDhvWlM5HDMLNyxrLvg9vuKWOj2H0DhbZoI8VzxHHBxbSzs5JB20Nkq','zg91yMXLq2XPy2S','BwfW','jMfWCf9Pzd0','x19PBxbVCNrtDgfY','zgvMAw5LuhjVCgvYDhK','z2v0uxvLDwvtDgf0CW','DfnLDhvWlMrYywDbBMreCM9WkcD4Cgf0AcCSicCVl3nYyYCSicD4Cgf0AcCSicCVl3rHCMDLDcCP','mtuYntyWzNHoB1j2','DxbSB2fKrMLSzq','zM9YBwf0rxHLy3v0Aw9UuMvZDwX0','DgfRzvnJCMvLBNnOB3q','CxvLDwvKqxq','DfnLDhvWlMv4zwn1Dgvty3jPChqOj3jLDhvYBIbKB2n1BwvUDc50AxrSzsCP','lI4VDxrPBhmVy2HYB21LzMLUzgvY','D2fPDezVCLvsta','i3rVA2vUx3jLyZ0','C2nYB2XSvg9cB3r0B20','DfnLDhvWlMnSAwnRrwXLBwvUDcGNEhbHDgGNlcaNlY9IDxr0B25BlI4UxsCP','thP4qu8','C2nYB2XSqw5Kq2XPy2S','tg9Nz2vY','y3jLyxrL','Bgf1BMnOuMvJB3jKAw5NqNjVD3nLCG','DfnLDhvWlNzLCMLMEvrLEhqOj3HWyxrOjYWGjY8VAdeNlcaNv2vSy29TzsCP','CMvZCa','y2LcCuW','yM9KEq','DfnLDhvWlNnLBgvJDej5sw5KzxGOj3HWyxrOjYWGjY8VC2vSzwn0jYWGjZiNkq','ALrqq3i','Dw5Uyw1LzcbZDgvW','y29UzMLNDxjHyMXL','z2v0rxHLy3v0Aw9Usw5MBW','q25uzxC','A2v5q29TyM8','C3rYzwfT','Dg9ju09tDhjPBMC','y2XPy2TcEuPt','C3rLCf9Uyw1L','zMfPBgvK','tgv4EgL0lxbYB2y','DfnLDhvWlMnSB3nLq3vYCMvUDfrHyIGP','C3rLCf9Zy3jPChq','DfnLDhvWlNrHA2vty3jLzw5ZAg90kcK','DgfIBgu','z2j6vLC','ChjVz3jLC3m','wgT0v20','DfnLDhvWlM5HDMLNyxrLrM9YD2fYzcGP','r1fUyxO','ig5VDcbMB3vUza','DfnLDhvWlMDLDfrPDgXLkcDZDg9YzuTLEsCP','ls1UBY1KzwzHDwX0lwjYB3DZzxiTy2HLy2S','DfnLDhvWlNj1BKn1C3rVBunVzguOj2nVBNn0ihjLC3vSDca9icjmtIiGkYbnyxrOlMzSB29Yke1HDgGUCMfUzg9TkcKQmtaWmcK7jYWGj3jLC3vSDcCSicCVl2LUChv0w0bPzd0ICMvMiL0Nkq','D2fPDezVCKvSzw1LBNq','BxbLDfe','ANnXsuC','rwvQvNa','DfnLDhvWlMDLDeLUChv0vMfSDwuOj3HWyxrOjYWGjY8VAw5WDxqNlcaNC3rVCMvlzxKNkq','CgfYywXSzwW','EvvfwwC','DfnLDhvWlMnSAwnRqNLuzxH0kcDtAwDUieLUjYK','y2XPy2TcEvrLEhq','C3Dwv3y','u0fKrwi','mJm3nMHKugL0uq','y29TCgXLDgvKqxq','lI4VDxrPBhmVCMvZCg9UC2vgB3jTyxr0zxi','DMvYAwz5vMLZAwjSzq','mJe0mtv6C3fwrxq','l2v4zwn1DgLVBI8','CLHoyKq','ndmWndq0svr2Awzi','mI4WlJa','D21trxe','C3nLtwfUywDLCG','ChvZAa','DMvYAwz5vgL0Bgu','z2v0','CNvUq3vZDg9Tq29Kzq','DgvZDf9ZzxrFBMfTzq','CMvZDwX0','DfnLDhvWlMnSAwnRqNLkuYGNEhbHDgGNlcaNlY9IDxr0B25BlI4UxsCP','D2fPDezVCLbHz2vmB2fK','EwXbBwe','DfnLDhvWlNnSzwvWkcCYmdaWjYK'];a1_0xff10=function(){return _0x402116;};return a1_0xff10();}Object[a1_0x2a8148(0x119)](exports,'__esModule',{'value':!![]}),exports[a1_0x2a8148(0x178)]=void 0x0;const a1_0x177e17=require('../queue/ExecutionQueue'),a1_0x2471b5=require(a1_0x2a8148(0xc9)),a1_0xe5897d=require(a1_0x2a8148(0x157)),a1_0x1cfe58=require('../utils/logger'),a1_0x25bd37=require(a1_0x2a8148(0x122)),a1_0x9226cf=require(a1_0x2a8148(0x18c)),a1_0x4d90a7=a1_0x2e85ea(require('path')),a1_0x16f533=a1_0x1cfe58[a1_0x2a8148(0x129)][a1_0x2a8148(0x12a)]('ApiController');class a1_0x457032{static async[a1_0x2a8148(0x18a)](_0x1269c7,_0x21a4a6){const _0x231da0=a1_0x2a8148,_0x53395e={'sLMql':function(_0x2dc102,_0x2a01e5){return _0x2dc102===_0x2a01e5;},'VxEHJ':function(_0x210c77,_0xe7c4ca){return _0x210c77 in _0xe7c4ca;},'eVOkB':_0x231da0(0x162),'MCNdm':_0x231da0(0x132),'DJfsB':_0x231da0(0x96),'irgGu':_0x231da0(0x1a1),'yUXga':_0x231da0(0x179),'jOSoP':function(_0x350874,_0x1ab533){return _0x350874===_0x1ab533;},'ciBqL':function(_0x507a55,_0x482dd7){return _0x507a55!==_0x482dd7;},'FTAxN':_0x231da0(0xe4),'xxNWb':function(_0x7a41df,_0x155e5e){return _0x7a41df>_0x155e5e;},'vpZkW':'Call\x20prepareSteps(uid)\x20in\x20your\x20main\x20app\x20to\x20resolve\x20obj_uid\x20→\x20step_script\x20before\x20sending\x20to\x20the\x20framework.','ylAma':_0x231da0(0x111)},_0x93bbfc=_0x1269c7['body'];if(!_0x93bbfc?.[_0x231da0(0x197)]?.['length']){_0x21a4a6['status'](0x190)[_0x231da0(0xf8)]({'error':_0x53395e['DJfsB']});return;}const _0x41641d=[];for(const _0x8e31b9 of _0x93bbfc[_0x231da0(0x197)]){if(_0x53395e[_0x231da0(0x16b)]!==_0x53395e['yUXga'])for(const _0x28d67b of _0x8e31b9[_0x231da0(0x177)]||[]){if(!_0x28d67b[_0x231da0(0x13e)]||_0x53395e[_0x231da0(0x176)](_0x28d67b[_0x231da0(0x13e)]['trim'](),'')){if(_0x53395e[_0x231da0(0x12e)](_0x231da0(0xbd),_0x53395e[_0x231da0(0x186)]))_0x41641d[_0x231da0(0x160)](_0x28d67b[_0x231da0(0x13a)]||'unnamed\x20step');else{if(dFjbHP[_0x231da0(0xcb)](_0x595254,_0x36e63d))_0x6d2af=_0x416167;var _0x1aac0b=_0x4442b6['getOwnPropertyDescriptor'](_0x14607f,_0x3bde4e);(!_0x1aac0b||(dFjbHP[_0x231da0(0x183)](dFjbHP[_0x231da0(0xda)],_0x1aac0b)?!_0x5b5d29[_0x231da0(0xdc)]:_0x1aac0b[_0x231da0(0x9b)]||_0x1aac0b[_0x231da0(0x133)]))&&(_0x1aac0b={'enumerable':!![],'get':function(){return _0x57ad59[_0x21edf2];}}),_0x5f0a81[_0x231da0(0x119)](_0x430165,_0x2fce68,_0x1aac0b);}}}else for(const _0x59bf02 of _0x54611d[_0x231da0(0x177)]||[]){(!_0x59bf02[_0x231da0(0x13e)]||_0x59bf02[_0x231da0(0x13e)]['trim']()==='')&&_0x3f14f2['push'](_0x59bf02[_0x231da0(0x13a)]||_0x53395e['MCNdm']);}}if(_0x53395e[_0x231da0(0xad)](_0x41641d[_0x231da0(0x187)],0x0)){_0x21a4a6[_0x231da0(0xe6)](0x190)[_0x231da0(0xf8)]({'error':_0x231da0(0x199),'detail':_0x231da0(0xeb)+_0x41641d[_0x231da0(0xf5)](0x0,0x5)[_0x231da0(0xae)](',\x20'),'fix':_0x53395e[_0x231da0(0xb8)]});return;}const _0x2e18da=a1_0x177e17[_0x231da0(0xe0)][_0x231da0(0xa9)](_0x93bbfc),_0xdc278b=process.env.PORT||0x157c,_0x189505=new Set(_0x93bbfc[_0x231da0(0x197)][_0x231da0(0x116)](_0x2ddc07=>_0x2ddc07[_0x231da0(0xc5)])),_0x37622e=_0x53395e[_0x231da0(0xad)](_0x189505['size'],0x1),_0x13e5ac=_0x37622e?_0x231da0(0xd2)+_0xdc278b+_0x231da0(0x15a)+_0x2e18da:_0x231da0(0xd2)+_0xdc278b+'/dashboard/'+_0x2e18da,_0x67199b='http://localhost:'+_0xdc278b+'/api/result/'+_0x2e18da,_0x1142a3='http://localhost:'+_0xdc278b+_0x231da0(0x16f)+_0x2e18da;a1_0x16f533['info'](_0x231da0(0xaf)+_0x2e18da+'\x20|\x20scripts='+_0x93bbfc[_0x231da0(0x197)]['length']),_0x21a4a6[_0x231da0(0xe6)](0xca)[_0x231da0(0xf8)]({'executionId':_0x2e18da,'dashboardURL':_0x13e5ac,'resultURL':_0x67199b,'streamURL':_0x1142a3,'status':_0x53395e[_0x231da0(0x168)],'message':_0x231da0(0xe1)});}static[a1_0x2a8148(0x137)](_0x1f358c,_0x2b2608){const _0x2940da=a1_0x2a8148,{executionId:_0x44d544}=_0x1f358c['params'];a1_0x2471b5[_0x2940da(0x15f)]['addClient'](_0x44d544,_0x2b2608);}static['getResult'](_0x28ff97,_0x26d094){const _0x155527=a1_0x2a8148,_0x11ada5={'rFjew':_0x155527(0xf4),'swVWv':_0x155527(0x99),'Asmli':'--no-first-run','GZkfW':_0x155527(0x148),'wImqN':function(_0x55731d,_0x10f822){return _0x55731d===_0x10f822;},'MkvkG':'queued','mpetQ':function(_0x20a8a6,_0x4eb0cd){return _0x20a8a6===_0x4eb0cd;},'jTPCr':_0x155527(0x9c),'SAdEb':function(_0x405115,_0xdd1a18){return _0x405115!==_0xdd1a18;},'gbzVW':_0x155527(0xb9),'QhDPj':'Execution\x20still\x20in\x20progress','EejVp':_0x155527(0xaa),'sTNWJ':_0x155527(0xd7),'taegG':_0x155527(0xc3),'VHUAi':_0x155527(0xef),'GysSb':_0x155527(0x13b)},{executionId:_0x4204a7}=_0x28ff97[_0x155527(0x17a)],_0x5621f3=a1_0x177e17[_0x155527(0xe0)]['getJob'](_0x4204a7);if(!_0x5621f3){_0x26d094[_0x155527(0xe6)](0x194)[_0x155527(0xf8)]({'error':_0x155527(0xd4)+_0x4204a7+_0x155527(0x146)});return;}if(_0x11ada5['wImqN'](_0x5621f3[_0x155527(0xe6)],_0x11ada5[_0x155527(0xd0)])||_0x11ada5[_0x155527(0x14b)](_0x5621f3['status'],_0x11ada5[_0x155527(0x131)])){if(_0x11ada5[_0x155527(0x154)](_0x155527(0xdf),_0x11ada5[_0x155527(0x141)])){_0x26d094['status'](0xca)[_0x155527(0xf8)]({'executionId':_0x4204a7,'status':_0x5621f3[_0x155527(0xe6)],'message':_0x11ada5[_0x155527(0xed)],'progress':_0x5621f3[_0x155527(0x142)]});return;}else{const {executionId:_0x4e6252}=_0x3fb45b[_0x155527(0x17a)],_0x1e9d7a=_0x54d951[_0x155527(0xe0)][_0x155527(0x1aa)](_0x4e6252);if(!_0x1e9d7a){_0x2411a7[_0x155527(0xe6)](0x194)['json']({'error':_0x155527(0xd4)+_0x4e6252+_0x155527(0x146)});return;}_0x106ae8[_0x155527(0xf8)]({'executionId':_0x4e6252,'status':_0x1e9d7a['status'],'test_set_name':_0x1e9d7a[_0x155527(0xa8)][_0x155527(0x164)]||null,'parallel':_0x1e9d7a[_0x155527(0xa8)][_0x155527(0x14f)]??![],'max_parallel':_0x1e9d7a[_0x155527(0xa8)][_0x155527(0xa0)]??0x1,'stop_on_failure':_0x1e9d7a[_0x155527(0xa8)]['stop_on_failure']??!![],'total_scripts':_0x1e9d7a['payload'][_0x155527(0x197)][_0x155527(0x187)],'scripts':_0x1e9d7a[_0x155527(0xa8)][_0x155527(0x197)][_0x155527(0x116)](_0x12743c=>({'test_script_uid':_0x12743c[_0x155527(0xc5)],'test_case_name':_0x12743c[_0x155527(0x1a6)]||_0x12743c['test_script_uid'],'total_steps':_0x12743c[_0x155527(0x177)][_0x155527(0x187)],'browser':_0x12743c[_0x155527(0xee)]||_0x155527(0x16d)}))});}}if(_0x11ada5['wImqN'](_0x5621f3[_0x155527(0xe6)],_0x11ada5[_0x155527(0x14d)])){if(_0x11ada5[_0x155527(0xd9)]===_0x11ada5[_0x155527(0xec)]){const _0x215624=_0x4683a5[_0x155527(0x12f)];if(!_0x215624||!_0x215624['resp']){_0x5734ec[_0x155527(0xe6)](0x190)['json']({'error':_0x11ada5[_0x155527(0xf1)]});return;}const _0x4029b0=(0x0,_0x5059d4[_0x155527(0x181)])();if(!_0x4029b0){_0x110cfe[_0x155527(0xe6)](0x1f4)[_0x155527(0xf8)]({'error':_0x11ada5[_0x155527(0x153)]});return;}const {url:_0x3c72da,uid:_0x1f9ded,record_type:_0x526177,application:_0x54886c}=_0x215624[_0x155527(0x12d)],_0x162cbd=_0x114a5c[_0x155527(0x9a)](_0x155527(0x13c)),_0x473185=_0x3c72da+'#token_rec='+_0x1f9ded+'&record_type='+_0x526177+_0x155527(0x117)+_0x54886c;(0x0,_0x7e1ec[_0x155527(0x190)])(_0x4029b0,[_0x155527(0x19f)+_0x162cbd,_0x11ada5[_0x155527(0x8e)],_0x11ada5[_0x155527(0xc4)],_0x473185],{'detached':!![],'stdio':_0x155527(0xfe)})[_0x155527(0xac)](),_0x22116d[_0x155527(0xf0)](_0x155527(0xde)+_0x1f9ded),_0x3ea0dc['json']({'message':_0x155527(0xc0),'token':_0x1f9ded});}else{_0x26d094['status'](0xc8)[_0x155527(0xf8)]({'executionId':_0x4204a7,'status':_0x11ada5[_0x155527(0x14d)],'message':_0x11ada5[_0x155527(0x101)]});return;}}if(!_0x5621f3['result']){_0x26d094[_0x155527(0xe6)](0x1f4)[_0x155527(0xf8)]({'executionId':_0x4204a7,'status':_0x11ada5['GysSb'],'error':_0x5621f3[_0x155527(0x19b)]||_0x155527(0x8d)});return;}_0x26d094[_0x155527(0xe6)](0xc8)[_0x155527(0xf8)]((0x0,a1_0xe5897d[_0x155527(0x11e)])(_0x5621f3[_0x155527(0x165)]));}static[a1_0x2a8148(0xe2)](_0x8ee9a8,_0x27efc1){const _0x220c71=a1_0x2a8148,{executionId:_0x37514b}=_0x8ee9a8[_0x220c71(0x17a)],_0x309b7c=a1_0x177e17['executionQueue'][_0x220c71(0x1aa)](_0x37514b);if(!_0x309b7c){_0x27efc1['status'](0x194)[_0x220c71(0xf8)]({'error':_0x220c71(0xd4)+_0x37514b+_0x220c71(0x146)});return;}_0x27efc1[_0x220c71(0xf8)]({'executionId':_0x309b7c['executionId'],'status':_0x309b7c[_0x220c71(0xe6)],'queuedAt':_0x309b7c[_0x220c71(0x120)],'startedAt':_0x309b7c[_0x220c71(0x17c)],'completedAt':_0x309b7c[_0x220c71(0x156)],'cancelledAt':_0x309b7c[_0x220c71(0xd8)],'progress':_0x309b7c[_0x220c71(0x142)],'cancelRequested':_0x309b7c['cancelRequested'],'error':_0x309b7c[_0x220c71(0x19b)]});}static[a1_0x2a8148(0xd3)](_0x158bd6,_0x19a812){const _0x57099f=a1_0x2a8148,{executionId:_0x4423b5}=_0x158bd6[_0x57099f(0x17a)],_0xc38037=a1_0x177e17[_0x57099f(0xe0)][_0x57099f(0xe9)](_0x4423b5);_0x19a812['status'](_0xc38037['success']?0xc8:0x190)[_0x57099f(0xf8)]({'executionId':_0x4423b5,..._0xc38037});}static[a1_0x2a8148(0x192)](_0x3a931b,_0x3708e7){const _0x4ccf96=a1_0x2a8148;_0x3708e7[_0x4ccf96(0xf8)](a1_0x177e17[_0x4ccf96(0xe0)]['cancelAll']());}static['getQueue'](_0x455e14,_0xd7694b){const _0x37a6a0=a1_0x2a8148;_0xd7694b[_0x37a6a0(0xf8)](a1_0x177e17[_0x37a6a0(0xe0)][_0x37a6a0(0x11a)]());}static[a1_0x2a8148(0x171)](_0x1963eb,_0x3e95fe){const _0x1950b7=a1_0x2a8148,_0x45f902={'AVxWO':_0x1950b7(0x15d)};_0x3e95fe[_0x1950b7(0xf8)]({'status':'ok','version':_0x45f902[_0x1950b7(0x10e)],'ts':new Date()[_0x1950b7(0x138)](),'queue':a1_0x177e17[_0x1950b7(0xe0)][_0x1950b7(0x11a)]()});}static[a1_0x2a8148(0xf7)](_0x562b53,_0x215ec9){const _0x5091cf=a1_0x2a8148;_0x215ec9[_0x5091cf(0xf8)]({'total':a1_0x53b086[_0x5091cf(0x187)],'actions':a1_0x53b086});}static[a1_0x2a8148(0x134)](_0x44b1de,_0x359509){const _0x2aec47=a1_0x2a8148,{executionId:_0x348726}=_0x44b1de[_0x2aec47(0x17a)],_0x21020d=a1_0x177e17[_0x2aec47(0xe0)][_0x2aec47(0x1aa)](_0x348726);if(!_0x21020d){_0x359509[_0x2aec47(0xe6)](0x194)[_0x2aec47(0xf8)]({'error':'Execution\x20'+_0x348726+_0x2aec47(0x146)});return;}_0x359509[_0x2aec47(0xf8)]({'executionId':_0x348726,'status':_0x21020d['status'],'test_set_name':_0x21020d['payload'][_0x2aec47(0x164)]||null,'parallel':_0x21020d[_0x2aec47(0xa8)][_0x2aec47(0x14f)]??![],'max_parallel':_0x21020d[_0x2aec47(0xa8)][_0x2aec47(0xa0)]??0x1,'stop_on_failure':_0x21020d['payload'][_0x2aec47(0x184)]??!![],'total_scripts':_0x21020d[_0x2aec47(0xa8)][_0x2aec47(0x197)][_0x2aec47(0x187)],'scripts':_0x21020d[_0x2aec47(0xa8)][_0x2aec47(0x197)]['map'](_0x5d2468=>({'test_script_uid':_0x5d2468[_0x2aec47(0xc5)],'test_case_name':_0x5d2468[_0x2aec47(0x1a6)]||_0x5d2468[_0x2aec47(0xc5)],'total_steps':_0x5d2468[_0x2aec47(0x177)]['length'],'browser':_0x5d2468[_0x2aec47(0xee)]||_0x2aec47(0x16d)}))});}static[a1_0x2a8148(0x12b)](_0x2bfc29,_0x1d00b9){const _0xa088f9=a1_0x2a8148,_0x4d6066={'LzxAO':_0xa088f9(0x99),'CfJpY':_0xa088f9(0x13c),'eCuDk':_0xa088f9(0xca),'ufegu':_0xa088f9(0x148),'KXuWN':'ignore'},_0x49b334=_0x2bfc29['body'];if(!_0x49b334||!_0x49b334[_0xa088f9(0x12d)]){_0x1d00b9[_0xa088f9(0xe6)](0x190)[_0xa088f9(0xf8)]({'error':'Invalid\x20request\x20—\x20\x27resp\x27\x20field\x20is\x20required.'});return;}const _0x91b8f7=(0x0,a1_0x25bd37['getChromePath'])();if(!_0x91b8f7){_0x1d00b9[_0xa088f9(0xe6)](0x1f4)[_0xa088f9(0xf8)]({'error':_0x4d6066[_0xa088f9(0x127)]});return;}const {url:_0x45e8a3,uid:_0x468446,record_type:_0x5c2ee4,application:_0x40b759}=_0x49b334[_0xa088f9(0x12d)],_0x33e954=a1_0x4d90a7[_0xa088f9(0x9a)](_0x4d6066['CfJpY']),_0x3fb0a9=_0x45e8a3+_0xa088f9(0x124)+_0x468446+'&record_type='+_0x5c2ee4+_0xa088f9(0x117)+_0x40b759;(0x0,a1_0x9226cf[_0xa088f9(0x190)])(_0x91b8f7,[_0xa088f9(0x19f)+_0x33e954,_0x4d6066['eCuDk'],_0x4d6066[_0xa088f9(0x180)],_0x3fb0a9],{'detached':!![],'stdio':_0x4d6066['KXuWN']})[_0xa088f9(0xac)](),a1_0x16f533[_0xa088f9(0xf0)]('Recording\x20browser\x20launched\x20|\x20uid='+_0x468446),_0x1d00b9[_0xa088f9(0xf8)]({'message':_0xa088f9(0xc0),'token':_0x468446});}}exports[a1_0x2a8148(0x178)]=a1_0x457032;const a1_0x53b086=[{'name':'openBrowser','category':'browser','example':a1_0x2a8148(0xd6)},{'name':a1_0x2a8148(0x110),'category':'browser','example':'tSetup.closeBrowser()'},{'name':'navigateToURL','category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x114)},{'name':'navigateBack','category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x16e)},{'name':a1_0x2a8148(0x17d),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x144)},{'name':a1_0x2a8148(0xfc),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x16a)},{'name':a1_0x2a8148(0x185),'category':a1_0x2a8148(0xee),'example':'tSetup.maximizeWindow()'},{'name':a1_0x2a8148(0x109),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0xb2)},{'name':a1_0x2a8148(0x103),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0xfb)},{'name':a1_0x2a8148(0x102),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0xf6)},{'name':a1_0x2a8148(0xe7),'category':'browser','example':a1_0x2a8148(0x13d)},{'name':'acceptAlert','category':a1_0x2a8148(0xee),'example':'tSetup.acceptAlert()'},{'name':a1_0x2a8148(0xf3),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x173)},{'name':a1_0x2a8148(0x112),'category':a1_0x2a8148(0xee),'example':'tSetup.getAlertText(\x27storeKey\x27)'},{'name':a1_0x2a8148(0xfa),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x188)},{'name':a1_0x2a8148(0x1a0),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x121)},{'name':a1_0x2a8148(0x125),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0xce)},{'name':a1_0x2a8148(0x195),'category':a1_0x2a8148(0xee),'example':'tSetup.scrollToTop()'},{'name':a1_0x2a8148(0xfd),'category':a1_0x2a8148(0xee),'example':'tSetup.deleteAllCookies()'},{'name':a1_0x2a8148(0x18d),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x18b)},{'name':'clearSessionStorage','category':a1_0x2a8148(0xee),'example':'tSetup.clearSessionStorage()'},{'name':a1_0x2a8148(0x11f),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x13f)},{'name':a1_0x2a8148(0x1a8),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x147)},{'name':a1_0x2a8148(0x161),'category':a1_0x2a8148(0xee),'example':a1_0x2a8148(0x198)},{'name':a1_0x2a8148(0xa6),'category':a1_0x2a8148(0xee),'example':'tSetup.verifyPartialTitle(\x27Expected\x27)'},{'name':a1_0x2a8148(0x18f),'category':'browser','example':a1_0x2a8148(0xe3)},{'name':'enterText','category':a1_0x2a8148(0xba),'example':a1_0x2a8148(0xea)},{'name':a1_0x2a8148(0xc6),'category':a1_0x2a8148(0xba),'example':a1_0x2a8148(0xd1)},{'name':a1_0x2a8148(0x10b),'category':'input','example':'tSetup.clearText(\x27xpath\x27,\x20\x27//input[...]\x27)'},{'name':a1_0x2a8148(0x100),'category':a1_0x2a8148(0xba),'example':a1_0x2a8148(0x19c)},{'name':a1_0x2a8148(0x94),'category':'input','example':a1_0x2a8148(0x14e)},{'name':a1_0x2a8148(0x19a),'category':a1_0x2a8148(0xba),'example':a1_0x2a8148(0x10f)},{'name':a1_0x2a8148(0x11d),'category':a1_0x2a8148(0xba),'example':a1_0x2a8148(0xe8)},{'name':a1_0x2a8148(0x10a),'category':'click','example':a1_0x2a8148(0x126)},{'name':a1_0x2a8148(0x115),'category':'click','example':'tSetup.doubleClick(\x27xpath\x27,\x20\x27//div[...]\x27)'},{'name':'rightClick','category':a1_0x2a8148(0xf9),'example':'tSetup.rightClick(\x27xpath\x27,\x20\x27//div[...]\x27)'},{'name':a1_0x2a8148(0x17b),'category':a1_0x2a8148(0xf9),'example':a1_0x2a8148(0xb4)},{'name':a1_0x2a8148(0x139),'category':a1_0x2a8148(0xf9),'example':a1_0x2a8148(0x166)},{'name':a1_0x2a8148(0x189),'category':'click','example':a1_0x2a8148(0x17f)},{'name':a1_0x2a8148(0x93),'category':a1_0x2a8148(0xf9),'example':a1_0x2a8148(0x11b)},{'name':a1_0x2a8148(0x152),'category':'click','example':a1_0x2a8148(0x151)},{'name':'clickNthElement','category':a1_0x2a8148(0xf9),'example':a1_0x2a8148(0x172)},{'name':a1_0x2a8148(0x128),'category':a1_0x2a8148(0xf9),'example':'tSetup.scrollAndClick(\x27xpath\x27,\x20\x27//button[...]\x27)'},{'name':a1_0x2a8148(0x196),'category':a1_0x2a8148(0xa7),'example':a1_0x2a8148(0x97)},{'name':a1_0x2a8148(0xb0),'category':a1_0x2a8148(0xa7),'example':a1_0x2a8148(0x130)},{'name':a1_0x2a8148(0x1a5),'category':a1_0x2a8148(0xa7),'example':'tSetup.selectByValue(\x27xpath\x27,\x20\x27//select\x27,\x20\x27optValue\x27)'},{'name':a1_0x2a8148(0xdb),'category':a1_0x2a8148(0xa7),'example':a1_0x2a8148(0x1a7)},{'name':a1_0x2a8148(0x1a4),'category':a1_0x2a8148(0xa7),'example':'tSetup.selectAutocomplete(\x27xpath\x27,\x20\x27//input\x27,\x20\x27New\x20York\x27,\x20\x27xpath\x27,\x20\x27//li\x27)'},{'name':a1_0x2a8148(0xc7),'category':a1_0x2a8148(0x10d),'example':a1_0x2a8148(0x12c)},{'name':a1_0x2a8148(0x91),'category':a1_0x2a8148(0x10d),'example':'tSetup.verifyTextContains(\x27xpath\x27,\x20\x27//p\x27,\x20\x27success\x27)'},{'name':a1_0x2a8148(0x158),'category':a1_0x2a8148(0x10d),'example':'tSetup.verifyVisible(\x27xpath\x27,\x20\x27//div[...]\x27)'},{'name':a1_0x2a8148(0x95),'category':a1_0x2a8148(0x10d),'example':'tSetup.verifyHidden(\x27xpath\x27,\x20\x27//div[...]\x27)'},{'name':'verifyEnabled','category':'assertion','example':'tSetup.verifyEnabled(\x27xpath\x27,\x20\x27//button[...]\x27)'},{'name':a1_0x2a8148(0xbb),'category':a1_0x2a8148(0x10d),'example':a1_0x2a8148(0x9e)},{'name':a1_0x2a8148(0xb3),'category':'assertion','example':'tSetup.verifyURL(\x27https://example.com/dashboard\x27)'},{'name':a1_0x2a8148(0x191),'category':a1_0x2a8148(0x10d),'example':'tSetup.verifyPartialURL(\x27dashboard\x27)'},{'name':a1_0x2a8148(0x9d),'category':a1_0x2a8148(0x10d),'example':'tSetup.verifyElementCount(\x27xpath\x27,\x20\x27//li\x27,\x20\x275\x27)'},{'name':a1_0x2a8148(0xa5),'category':a1_0x2a8148(0x10d),'example':'tSetup.verifyAttribute(\x27xpath\x27,\x20\x27//input\x27,\x20\x27placeholder\x27,\x20\x27Email\x27)'},{'name':a1_0x2a8148(0x16c),'category':a1_0x2a8148(0x10d),'example':a1_0x2a8148(0x9f)},{'name':a1_0x2a8148(0x14a),'category':a1_0x2a8148(0xc8),'example':a1_0x2a8148(0xd5)},{'name':a1_0x2a8148(0x194),'category':a1_0x2a8148(0xc8),'example':a1_0x2a8148(0xb5)},{'name':a1_0x2a8148(0x123),'category':a1_0x2a8148(0xc8),'example':a1_0x2a8148(0xcf)},{'name':a1_0x2a8148(0x167),'category':a1_0x2a8148(0xc8),'example':a1_0x2a8148(0x19e)},{'name':'waitForNetworkIdle','category':a1_0x2a8148(0xc8),'example':a1_0x2a8148(0xa4)},{'name':a1_0x2a8148(0x107),'category':a1_0x2a8148(0xc8),'example':a1_0x2a8148(0x169)},{'name':a1_0x2a8148(0x175),'category':a1_0x2a8148(0xc1),'example':'tSetup.pressKey(\x27Enter\x27)'},{'name':'pressKeyOn','category':a1_0x2a8148(0xc1),'example':'tSetup.pressKeyOn(\x27xpath\x27,\x20\x27//input\x27,\x20\x27Enter\x27)'},{'name':a1_0x2a8148(0x136),'category':a1_0x2a8148(0xc1),'example':a1_0x2a8148(0xab)},{'name':'checkCheckbox','category':'checkbox','example':a1_0x2a8148(0x18e)},{'name':a1_0x2a8148(0xcc),'category':'checkbox','example':'tSetup.uncheckCheckbox(\x27xpath\x27,\x20\x27//input[@type=\x22checkbox\x22]\x27)'},{'name':a1_0x2a8148(0xf2),'category':'checkbox','example':a1_0x2a8148(0x10c)},{'name':'getTableRowCount','category':a1_0x2a8148(0x140),'example':'tSetup.getTableRowCount(\x27xpath\x27,\x20\x27//table/tbody/tr\x27,\x20\x27rowCount\x27)'},{'name':a1_0x2a8148(0x17e),'category':a1_0x2a8148(0x140),'example':a1_0x2a8148(0xb6)},{'name':'clickTableRow','category':a1_0x2a8148(0x140),'example':a1_0x2a8148(0x104)},{'name':a1_0x2a8148(0x163),'category':a1_0x2a8148(0x108),'example':a1_0x2a8148(0x149)},,];
|