app-manager-edge-worker 1.3.1 → 1.3.3
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 +15 -0
- package/package.json +2 -2
- package/src/banner.js +1 -1
- package/src/client.js +5 -5
- package/src/handlers/interactiveHandler.js +788 -609
package/README.md
CHANGED
|
@@ -201,6 +201,21 @@ Log levels: `[INFO]` · `[SUCCESS]` · `[WARN]` · `[ERROR]` · `[TASK]` (job di
|
|
|
201
201
|
|
|
202
202
|
---
|
|
203
203
|
|
|
204
|
+
### v1.3.3
|
|
205
|
+
- **Captcha Session Preservation & Asynchronous Image Resynchronization**:
|
|
206
|
+
- **Deterministic Error Differentiation**: Disentangled captcha validation rejections from business errors (e.g., invalid GSTIN). When captcha validation fails, the worker and backend preserve the browser page and interactive session alive, reset the session TTL timer, and never abort prematurely.
|
|
207
|
+
- **Expanded Captcha Failure Signatures**: Added broad pattern matching (`letters?`, `characters?`, `image below`, `shown below`, `security/verification code`, `invalid_captcha`) and DOM attribute inspection (`input[name='cap'].ng-invalid`, `[data-ng-bind*='ERR_CAPTCHA']`) to immediately classify captcha errors even when portals omit the word "captcha".
|
|
208
|
+
- **Asynchronous Captcha Settle Logic**: Introduced post-rejection settle delays (`waitForFunction` monitoring `img.src` change and AJAX completion) before taking the replacement captcha screenshot, preventing stale/expired captcha image captures.
|
|
209
|
+
- **Session TTL Auto-Refresh**: Automatically resets the session expiration timer on both edge worker and central backend whenever a captcha is retried or refreshed, granting users the full interaction window.
|
|
210
|
+
- **Clean Session Termination on Business Errors**: Genuine business rejections (such as invalid GSTIN or record not found) immediately purge browser contexts and trigger clean state cleanup across worker, backend, and UI test playground.
|
|
211
|
+
|
|
212
|
+
### v1.3.2
|
|
213
|
+
- **Sub-Second Inline Error Resolution & Strict Outcome Race Protocol**:
|
|
214
|
+
- **Dynamic In-Page Error Detection**: Expanded `defaultBroadErrorSelector` to capture generic inline portal validation elements (`.err`, `span.err`, `p.err`, `div.err`, `[class*='err-']`, `[data-ng-bind*='ERR']`, `[data-ng-show*='err']`, `[data-ng-show*='w_gst']`, `[role='alert']`), eliminating 15-second hangs when portal rejections insert error lines without page reload.
|
|
215
|
+
- **Prioritized Error-First Outcome Race**: Re-ordered `waitForFunction` post-submit race to evaluate visible error elements and semantic error regexes *before* success selectors, preventing false-positive table matches on empty layout wrappers (such as captcha reload tables).
|
|
216
|
+
- **Semantic Pattern Fallback**: When portals display error lines using customized selectors, the worker scans visible DOM leaf elements against canonical failure signatures and links them back to defined `errorDetection.rules` by pattern, surfacing exact error codes (`ERR_INVALID_GSTIN`) and messages instantly.
|
|
217
|
+
- **Multi-Phase Native Form Dispatch**: Enhanced submit button triggering in `HITL_SESSION_SOLVE` with direct DOM `click` and `submit` event cascades, ensuring reactive SPA frameworks (AngularJS `data-ng-submit`, React, jQuery) dispatch form payloads immediately without dropping clicks.
|
|
218
|
+
|
|
204
219
|
### v1.3.1
|
|
205
220
|
- **Robust Portal Input Resolution & Dynamic SPA Lifecycle Engine**:
|
|
206
221
|
- **Dynamic Multi-Selector Fallback Generation**: Form input selectors now automatically generate and evaluate candidate fallbacks (e.g. `input[name="for_gstin"]` expands to include `#for_gstin`, `[name="for_gstin"]`, `input#for_gstin`, `input[data-ng-model*="gstin"]`, and placeholder variants), resolving elements regardless of framework attribute formatting.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "app-manager-edge-worker",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"description": "Distributed Scraper Edge Worker for Apps Manager. Run on any local machine, VPS, or Termux Android device to serve browser and HTTP scraping jobs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -46,4 +46,4 @@
|
|
|
46
46
|
"qrcode": "^1.5.4",
|
|
47
47
|
"socket.io-client": "^4.8.1"
|
|
48
48
|
}
|
|
49
|
-
}
|
|
49
|
+
}
|
package/src/banner.js
CHANGED
package/src/client.js
CHANGED
|
@@ -20,11 +20,11 @@ import fs from "fs";
|
|
|
20
20
|
import { getWhatsAppHandler } from "./handlers/whatsappHandler.js";
|
|
21
21
|
import { printBanner, logInfo, logSuccess, logWarn, logError, logJob } from "./banner.js";
|
|
22
22
|
|
|
23
|
-
let workerPkgVersion = "1.3.
|
|
23
|
+
let workerPkgVersion = "1.3.3";
|
|
24
24
|
try {
|
|
25
25
|
const pkg = JSON.parse(fs.readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
|
|
26
26
|
if (pkg?.version) workerPkgVersion = pkg.version;
|
|
27
|
-
} catch (_) {}
|
|
27
|
+
} catch (_) { }
|
|
28
28
|
|
|
29
29
|
export async function startWorkerClient(config) {
|
|
30
30
|
const { workerKey, serverUrl, concurrency, workerName, keepAliveMinutes = 7 } = config;
|
|
@@ -229,8 +229,8 @@ export async function startWorkerClient(config) {
|
|
|
229
229
|
const targetUrl = jobType === "SEND_EMAIL"
|
|
230
230
|
? (payload.mailOptions?.to ? `to: ${payload.mailOptions.to}` : "email")
|
|
231
231
|
: jobType.startsWith("WHATSAPP_")
|
|
232
|
-
|
|
233
|
-
|
|
232
|
+
? (payload.recipientPhone ? `WA: ${payload.recipientPhone}` : "whatsapp")
|
|
233
|
+
: (payload.url || "(no url)");
|
|
234
234
|
|
|
235
235
|
logJob(jobType, targetUrl);
|
|
236
236
|
activeJobs++;
|
|
@@ -396,7 +396,7 @@ export async function startWorkerClient(config) {
|
|
|
396
396
|
if (isTermux) {
|
|
397
397
|
try {
|
|
398
398
|
execSync("termux-wake-unlock", { stdio: "ignore" });
|
|
399
|
-
} catch {}
|
|
399
|
+
} catch { }
|
|
400
400
|
}
|
|
401
401
|
socket.disconnect();
|
|
402
402
|
await localBrowserManager.close();
|