react-native-ai-debugger 1.6.16 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/build/__tests__/unit/exec.test.d.ts +2 -0
- package/build/__tests__/unit/exec.test.d.ts.map +1 -0
- package/build/__tests__/unit/exec.test.js +54 -0
- package/build/__tests__/unit/exec.test.js.map +1 -0
- package/build/__tests__/unit/focusedInput.test.d.ts +2 -0
- package/build/__tests__/unit/focusedInput.test.d.ts.map +1 -0
- package/build/__tests__/unit/focusedInput.test.js +58 -0
- package/build/__tests__/unit/focusedInput.test.js.map +1 -0
- package/build/__tests__/unit/focusedInputTools.test.d.ts +2 -0
- package/build/__tests__/unit/focusedInputTools.test.d.ts.map +1 -0
- package/build/__tests__/unit/focusedInputTools.test.js +79 -0
- package/build/__tests__/unit/focusedInputTools.test.js.map +1 -0
- package/build/__tests__/unit/tap.test.js +46 -0
- package/build/__tests__/unit/tap.test.js.map +1 -1
- package/build/core/android.d.ts +3 -3
- package/build/core/android.d.ts.map +1 -1
- package/build/core/android.js +21 -14
- package/build/core/android.js.map +1 -1
- package/build/core/appDetection.d.ts +7 -0
- package/build/core/appDetection.d.ts.map +1 -1
- package/build/core/appDetection.js +38 -17
- package/build/core/appDetection.js.map +1 -1
- package/build/core/componentSearch.d.ts +38 -0
- package/build/core/componentSearch.d.ts.map +1 -0
- package/build/core/componentSearch.js +419 -0
- package/build/core/componentSearch.js.map +1 -0
- package/build/core/componentTree.d.ts +12 -0
- package/build/core/componentTree.d.ts.map +1 -0
- package/build/core/componentTree.js +275 -0
- package/build/core/componentTree.js.map +1 -0
- package/build/core/connection.d.ts +1 -0
- package/build/core/connection.d.ts.map +1 -1
- package/build/core/connection.js +99 -89
- package/build/core/connection.js.map +1 -1
- package/build/core/debugGlobals.d.ts +5 -0
- package/build/core/debugGlobals.d.ts.map +1 -0
- package/build/core/debugGlobals.js +300 -0
- package/build/core/debugGlobals.js.map +1 -0
- package/build/core/errors.d.ts +14 -0
- package/build/core/errors.d.ts.map +1 -0
- package/build/core/errors.js +17 -0
- package/build/core/errors.js.map +1 -0
- package/build/core/exec.d.ts +22 -0
- package/build/core/exec.d.ts.map +1 -0
- package/build/core/exec.js +54 -0
- package/build/core/exec.js.map +1 -0
- package/build/core/executor.d.ts +7 -204
- package/build/core/executor.d.ts.map +1 -1
- package/build/core/executor.js +10 -4103
- package/build/core/executor.js.map +1 -1
- package/build/core/focusedInput.d.ts +27 -0
- package/build/core/focusedInput.d.ts.map +1 -0
- package/build/core/focusedInput.js +110 -0
- package/build/core/focusedInput.js.map +1 -0
- package/build/core/focusedInputTools.d.ts +21 -0
- package/build/core/focusedInputTools.d.ts.map +1 -0
- package/build/core/focusedInputTools.js +51 -0
- package/build/core/focusedInputTools.js.map +1 -0
- package/build/core/guides.d.ts.map +1 -1
- package/build/core/guides.js +15 -2
- package/build/core/guides.js.map +1 -1
- package/build/core/index.d.ts +4 -3
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +4 -3
- package/build/core/index.js.map +1 -1
- package/build/core/inspector.d.ts +50 -0
- package/build/core/inspector.d.ts.map +1 -0
- package/build/core/inspector.js +604 -0
- package/build/core/inspector.js.map +1 -0
- package/build/core/ios.d.ts +8 -0
- package/build/core/ios.d.ts.map +1 -1
- package/build/core/ios.js +142 -2
- package/build/core/ios.js.map +1 -1
- package/build/core/jsExecute.d.ts +27 -0
- package/build/core/jsExecute.d.ts.map +1 -0
- package/build/core/jsExecute.js +453 -0
- package/build/core/jsExecute.js.map +1 -0
- package/build/core/ocr.d.ts +13 -0
- package/build/core/ocr.d.ts.map +1 -1
- package/build/core/ocr.js +37 -15
- package/build/core/ocr.js.map +1 -1
- package/build/core/posthog.d.ts.map +1 -1
- package/build/core/posthog.js +7 -1
- package/build/core/posthog.js.map +1 -1
- package/build/core/pressables.d.ts +44 -0
- package/build/core/pressables.d.ts.map +1 -0
- package/build/core/pressables.js +1480 -0
- package/build/core/pressables.js.map +1 -0
- package/build/core/register.d.ts +8 -0
- package/build/core/register.d.ts.map +1 -0
- package/build/core/register.js +216 -0
- package/build/core/register.js.map +1 -0
- package/build/core/screenLayout.d.ts +52 -0
- package/build/core/screenLayout.d.ts.map +1 -0
- package/build/core/screenLayout.js +828 -0
- package/build/core/screenLayout.js.map +1 -0
- package/build/core/toolHelpers.d.ts +24 -0
- package/build/core/toolHelpers.d.ts.map +1 -0
- package/build/core/toolHelpers.js +118 -0
- package/build/core/toolHelpers.js.map +1 -0
- package/build/core/types.d.ts +11 -6
- package/build/core/types.d.ts.map +1 -1
- package/build/index.d.ts +2 -4
- package/build/index.d.ts.map +1 -1
- package/build/index.js +37 -4313
- package/build/index.js.map +1 -1
- package/build/pro/tap.d.ts +51 -5
- package/build/pro/tap.d.ts.map +1 -1
- package/build/pro/tap.js +457 -54
- package/build/pro/tap.js.map +1 -1
- package/build/tools/accountTools.d.ts +2 -0
- package/build/tools/accountTools.d.ts.map +1 -1
- package/build/tools/accountTools.js +5 -0
- package/build/tools/accountTools.js.map +1 -1
- package/build/tools/bundleTools.d.ts +3 -0
- package/build/tools/bundleTools.d.ts.map +1 -0
- package/build/tools/bundleTools.js +368 -0
- package/build/tools/bundleTools.js.map +1 -0
- package/build/tools/componentTools.d.ts +3 -0
- package/build/tools/componentTools.d.ts.map +1 -0
- package/build/tools/componentTools.js +639 -0
- package/build/tools/componentTools.js.map +1 -0
- package/build/tools/connectionTools.d.ts +3 -0
- package/build/tools/connectionTools.d.ts.map +1 -0
- package/build/tools/connectionTools.js +564 -0
- package/build/tools/connectionTools.js.map +1 -0
- package/build/tools/deviceTools.d.ts +3 -0
- package/build/tools/deviceTools.d.ts.map +1 -0
- package/build/tools/deviceTools.js +296 -0
- package/build/tools/deviceTools.js.map +1 -0
- package/build/tools/executionTools.d.ts +3 -0
- package/build/tools/executionTools.d.ts.map +1 -0
- package/build/tools/executionTools.js +173 -0
- package/build/tools/executionTools.js.map +1 -0
- package/build/tools/interactionTools.d.ts +3 -0
- package/build/tools/interactionTools.d.ts.map +1 -0
- package/build/tools/interactionTools.js +414 -0
- package/build/tools/interactionTools.js.map +1 -0
- package/build/tools/logTools.d.ts +3 -0
- package/build/tools/logTools.d.ts.map +1 -0
- package/build/tools/logTools.js +371 -0
- package/build/tools/logTools.js.map +1 -0
- package/build/tools/metaTools.d.ts +7 -0
- package/build/tools/metaTools.d.ts.map +1 -0
- package/build/tools/metaTools.js +205 -0
- package/build/tools/metaTools.js.map +1 -0
- package/build/tools/networkTools.d.ts +3 -0
- package/build/tools/networkTools.d.ts.map +1 -0
- package/build/tools/networkTools.js +478 -0
- package/build/tools/networkTools.js.map +1 -0
- package/build/tools/reduxTools.d.ts +3 -0
- package/build/tools/reduxTools.d.ts.map +1 -0
- package/build/tools/reduxTools.js +83 -0
- package/build/tools/reduxTools.js.map +1 -0
- package/build/tools/screenshotTools.d.ts +3 -0
- package/build/tools/screenshotTools.d.ts.map +1 -0
- package/build/tools/screenshotTools.js +606 -0
- package/build/tools/screenshotTools.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import WebSocket from "ws";
|
|
2
|
+
import { pendingExecutions, getNextMessageId, connectedApps } from "./state.js";
|
|
3
|
+
import { getFirstConnectedApp, getConnectedAppByDevice, connectToDevice } from "./connection.js";
|
|
4
|
+
import { fetchDevices, selectMainDevice, scanMetroPorts } from "./metro.js";
|
|
5
|
+
import { cancelReconnectionTimer } from "./connectionState.js";
|
|
6
|
+
// Hermes runtime compatibility: polyfill for 'global' which doesn't exist in Hermes
|
|
7
|
+
// In Hermes, globalThis is the standard way to access global scope
|
|
8
|
+
const GLOBAL_POLYFILL = `var global = typeof global !== 'undefined' ? global : globalThis;`;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a string contains emoji or other problematic Unicode characters
|
|
11
|
+
* Hermes has issues with certain UTF-16 surrogate pairs (like emoji)
|
|
12
|
+
*/
|
|
13
|
+
export function containsProblematicUnicode(str) {
|
|
14
|
+
// Detect UTF-16 surrogate pairs (emoji and other characters outside BMP)
|
|
15
|
+
// These cause "Invalid UTF-8 code point" errors in Hermes
|
|
16
|
+
// eslint-disable-next-line no-control-regex
|
|
17
|
+
return /[\uD800-\uDFFF]/.test(str);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Strip leading comments from an expression
|
|
21
|
+
* Users often start with // comments which break the (return expr) wrapping
|
|
22
|
+
*/
|
|
23
|
+
export function stripLeadingComments(expression) {
|
|
24
|
+
let result = expression;
|
|
25
|
+
// Strip leading whitespace first
|
|
26
|
+
result = result.trimStart();
|
|
27
|
+
// Repeatedly strip leading single-line comments (// ...)
|
|
28
|
+
while (result.startsWith("//")) {
|
|
29
|
+
const newlineIndex = result.indexOf("\n");
|
|
30
|
+
if (newlineIndex === -1) {
|
|
31
|
+
// Entire expression is a comment
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
result = result.slice(newlineIndex + 1).trimStart();
|
|
35
|
+
}
|
|
36
|
+
// Strip leading multi-line comments (/* ... */)
|
|
37
|
+
while (result.startsWith("/*")) {
|
|
38
|
+
const endIndex = result.indexOf("*/");
|
|
39
|
+
if (endIndex === -1) {
|
|
40
|
+
// Unclosed comment
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
result = result.slice(endIndex + 2).trimStart();
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate and preprocess an expression before execution
|
|
49
|
+
* Returns cleaned expression or error with helpful message
|
|
50
|
+
*/
|
|
51
|
+
export function validateAndPreprocessExpression(expression) {
|
|
52
|
+
// Check for emoji/problematic Unicode before any processing
|
|
53
|
+
if (containsProblematicUnicode(expression)) {
|
|
54
|
+
return {
|
|
55
|
+
valid: false,
|
|
56
|
+
expression,
|
|
57
|
+
error: "Expression contains emoji or special Unicode characters that Hermes cannot compile. " +
|
|
58
|
+
"Please remove emoji and use ASCII characters only."
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Strip leading comments that would break the expression wrapper
|
|
62
|
+
const cleaned = stripLeadingComments(expression);
|
|
63
|
+
if (!cleaned.trim()) {
|
|
64
|
+
return {
|
|
65
|
+
valid: false,
|
|
66
|
+
expression,
|
|
67
|
+
error: "Expression is empty or contains only comments."
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Check for top-level async that Hermes doesn't support in Runtime.evaluate
|
|
71
|
+
// Pattern: starts with (async or async keyword at expression level
|
|
72
|
+
const trimmed = cleaned.trim();
|
|
73
|
+
if (trimmed.startsWith("(async") || trimmed.startsWith("async ") || trimmed.startsWith("async(")) {
|
|
74
|
+
return {
|
|
75
|
+
valid: false,
|
|
76
|
+
expression: cleaned,
|
|
77
|
+
error: "Hermes does not support top-level async functions in Runtime.evaluate. " +
|
|
78
|
+
"Instead of `(async () => { ... })()`, use a synchronous approach or " +
|
|
79
|
+
"execute the async code and access the result via a global variable: " +
|
|
80
|
+
"`global.__result = null; myAsyncFn().then(r => global.__result = r)`"
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Check for require() calls that don't work in Hermes Runtime.evaluate
|
|
84
|
+
if (/\brequire\s*\(/.test(trimmed)) {
|
|
85
|
+
return {
|
|
86
|
+
valid: false,
|
|
87
|
+
expression: cleaned,
|
|
88
|
+
error: "require() is not available in Hermes Runtime.evaluate. " +
|
|
89
|
+
"Modules cannot be imported at runtime. Only pre-existing global variables are accessible. " +
|
|
90
|
+
"Use list_debug_globals to discover available globals, or add `globalThis.__MY_VAR__ = myModule;` in your app code."
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Check for multi-statement expressions. Runtime.evaluate compiles input as
|
|
94
|
+
// a single expression — `console.log('x'); 1+1` raises `')' expected at end
|
|
95
|
+
// of parenthesized expression`. Internal callers wrap in (function(){...})()
|
|
96
|
+
// so any `;` they use is at brace depth 1 and won't be flagged.
|
|
97
|
+
if (hasTopLevelStatementSeparator(trimmed)) {
|
|
98
|
+
return {
|
|
99
|
+
valid: false,
|
|
100
|
+
expression: cleaned,
|
|
101
|
+
error: "Multi-statement expressions are not supported by Hermes Runtime.evaluate " +
|
|
102
|
+
"(compiles input as a single expression). " +
|
|
103
|
+
"Wrap the body in an IIFE: `(function(){ stmt1; stmt2; return result; })()`."
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
valid: true,
|
|
108
|
+
expression: cleaned
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Walk `src` tracking string/template/comment and bracket depth. Returns true
|
|
112
|
+
// iff a `;` appears at depth 0 with non-whitespace following it (i.e. it
|
|
113
|
+
// separates two top-level statements rather than terminating a single one).
|
|
114
|
+
function hasTopLevelStatementSeparator(src) {
|
|
115
|
+
let i = 0;
|
|
116
|
+
let parens = 0;
|
|
117
|
+
let braces = 0;
|
|
118
|
+
let brackets = 0;
|
|
119
|
+
while (i < src.length) {
|
|
120
|
+
const ch = src[i];
|
|
121
|
+
const next = src[i + 1];
|
|
122
|
+
if (ch === "/" && next === "/") {
|
|
123
|
+
const nl = src.indexOf("\n", i + 2);
|
|
124
|
+
if (nl === -1)
|
|
125
|
+
return false;
|
|
126
|
+
i = nl + 1;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (ch === "/" && next === "*") {
|
|
130
|
+
const end = src.indexOf("*/", i + 2);
|
|
131
|
+
if (end === -1)
|
|
132
|
+
return false;
|
|
133
|
+
i = end + 2;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (ch === '"' || ch === "'" || ch === "`") {
|
|
137
|
+
const quote = ch;
|
|
138
|
+
i++;
|
|
139
|
+
while (i < src.length) {
|
|
140
|
+
if (src[i] === "\\") {
|
|
141
|
+
i += 2;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
if (src[i] === quote) {
|
|
145
|
+
i++;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
i++;
|
|
149
|
+
}
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (ch === "(")
|
|
153
|
+
parens++;
|
|
154
|
+
else if (ch === ")")
|
|
155
|
+
parens--;
|
|
156
|
+
else if (ch === "{")
|
|
157
|
+
braces++;
|
|
158
|
+
else if (ch === "}")
|
|
159
|
+
braces--;
|
|
160
|
+
else if (ch === "[")
|
|
161
|
+
brackets++;
|
|
162
|
+
else if (ch === "]")
|
|
163
|
+
brackets--;
|
|
164
|
+
else if (ch === ";" && parens === 0 && braces === 0 && brackets === 0) {
|
|
165
|
+
const rest = src.slice(i + 1).trim();
|
|
166
|
+
if (rest.length > 0)
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
i++;
|
|
170
|
+
}
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
// Error patterns that indicate a stale/destroyed context
|
|
174
|
+
const CONTEXT_ERROR_PATTERNS = [
|
|
175
|
+
"cannot find context",
|
|
176
|
+
"execution context was destroyed",
|
|
177
|
+
"target closed",
|
|
178
|
+
"inspected target navigated",
|
|
179
|
+
"session closed",
|
|
180
|
+
"context with specified id",
|
|
181
|
+
"no execution context",
|
|
182
|
+
"runningdetached"
|
|
183
|
+
];
|
|
184
|
+
/**
|
|
185
|
+
* Check if an error indicates a stale page context
|
|
186
|
+
*/
|
|
187
|
+
function isContextError(error) {
|
|
188
|
+
if (!error)
|
|
189
|
+
return false;
|
|
190
|
+
const lowerError = error.toLowerCase();
|
|
191
|
+
return CONTEXT_ERROR_PATTERNS.some((pattern) => lowerError.includes(pattern));
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Simple delay helper
|
|
195
|
+
*/
|
|
196
|
+
export function delay(ms) {
|
|
197
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Attempt quick reconnection to Metro
|
|
201
|
+
*/
|
|
202
|
+
async function attemptQuickReconnect(preferredPort) {
|
|
203
|
+
try {
|
|
204
|
+
const ports = await scanMetroPorts();
|
|
205
|
+
const targetPort = preferredPort && ports.includes(preferredPort) ? preferredPort : ports[0];
|
|
206
|
+
if (!targetPort)
|
|
207
|
+
return false;
|
|
208
|
+
const devices = await fetchDevices(targetPort);
|
|
209
|
+
const mainDevice = selectMainDevice(devices);
|
|
210
|
+
if (!mainDevice)
|
|
211
|
+
return false;
|
|
212
|
+
await connectToDevice(mainDevice, targetPort);
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Execute expression on a connected app (core implementation without retry)
|
|
221
|
+
*/
|
|
222
|
+
async function executeExpressionCore(expression, awaitPromise, timeoutMs = 10000, targetApp) {
|
|
223
|
+
const app = targetApp ?? getFirstConnectedApp();
|
|
224
|
+
if (!app) {
|
|
225
|
+
return { success: false, error: "No apps connected. Run 'scan_metro' first." };
|
|
226
|
+
}
|
|
227
|
+
if (app.ws.readyState !== WebSocket.OPEN) {
|
|
228
|
+
return { success: false, error: "WebSocket connection is not open." };
|
|
229
|
+
}
|
|
230
|
+
// Validate and preprocess the expression
|
|
231
|
+
const validation = validateAndPreprocessExpression(expression);
|
|
232
|
+
if (!validation.valid) {
|
|
233
|
+
return { success: false, error: validation.error };
|
|
234
|
+
}
|
|
235
|
+
const cleanedExpression = validation.expression;
|
|
236
|
+
// Hermes CDP does not support awaitPromise — it serializes the Promise's
|
|
237
|
+
// internal fields (_A, _x, _y, _z) instead of waiting for resolution.
|
|
238
|
+
// When the caller wants awaitPromise, we handle it ourselves: wrap the
|
|
239
|
+
// expression to store the resolved value in a temp global, then poll.
|
|
240
|
+
if (awaitPromise) {
|
|
241
|
+
return executeWithManualAwait(app, cleanedExpression, timeoutMs);
|
|
242
|
+
}
|
|
243
|
+
return executeCDP(app, cleanedExpression, false, timeoutMs);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Execute a CDP Runtime.evaluate call (no promise awaiting).
|
|
247
|
+
*/
|
|
248
|
+
function executeCDP(app, cleanedExpression, awaitPromise, timeoutMs) {
|
|
249
|
+
const TIMEOUT_MS = timeoutMs;
|
|
250
|
+
const currentMessageId = getNextMessageId();
|
|
251
|
+
const wrappedExpression = `${GLOBAL_POLYFILL} ${cleanedExpression}`;
|
|
252
|
+
return new Promise((resolve) => {
|
|
253
|
+
const timeoutId = setTimeout(() => {
|
|
254
|
+
pendingExecutions.delete(currentMessageId);
|
|
255
|
+
const wsState = app.ws.readyState === WebSocket.OPEN ? "OPEN"
|
|
256
|
+
: app.ws.readyState === WebSocket.CLOSED ? "CLOSED"
|
|
257
|
+
: app.ws.readyState === WebSocket.CLOSING ? "CLOSING"
|
|
258
|
+
: "CONNECTING";
|
|
259
|
+
const deviceName = app.deviceInfo.deviceName || app.deviceInfo.title || "unknown";
|
|
260
|
+
const pageId = app.deviceInfo.id || "unknown";
|
|
261
|
+
const truncatedExpr = cleanedExpression.length > 100
|
|
262
|
+
? cleanedExpression.substring(0, 100) + "..."
|
|
263
|
+
: cleanedExpression;
|
|
264
|
+
const errorMessage = [
|
|
265
|
+
"Timeout: Expression took too long to evaluate.",
|
|
266
|
+
"",
|
|
267
|
+
`Connection state: ws=${wsState}, device="${deviceName}", platform=${app.platform}, pageId=${pageId}`,
|
|
268
|
+
`Expression (truncated): ${truncatedExpr}`,
|
|
269
|
+
"",
|
|
270
|
+
"This usually means the JavaScript execution context became unresponsive or the CDP page is stale.",
|
|
271
|
+
"",
|
|
272
|
+
"Recovery steps (try in order):",
|
|
273
|
+
"1. Call scan_metro to re-establish a fresh CDP connection",
|
|
274
|
+
"2. If scan_metro doesn't help, force-restart the app:",
|
|
275
|
+
" - iOS: ios_terminate_app then ios_launch_app",
|
|
276
|
+
" - Android: android_launch_app (restarts automatically)",
|
|
277
|
+
"3. After restarting, call scan_metro again to reconnect",
|
|
278
|
+
].join("\n");
|
|
279
|
+
resolve({ success: false, error: errorMessage });
|
|
280
|
+
}, TIMEOUT_MS);
|
|
281
|
+
pendingExecutions.set(currentMessageId, { resolve, timeoutId });
|
|
282
|
+
try {
|
|
283
|
+
app.ws.send(JSON.stringify({
|
|
284
|
+
id: currentMessageId,
|
|
285
|
+
method: "Runtime.evaluate",
|
|
286
|
+
params: {
|
|
287
|
+
expression: wrappedExpression,
|
|
288
|
+
returnByValue: true,
|
|
289
|
+
awaitPromise,
|
|
290
|
+
userGesture: true,
|
|
291
|
+
generatePreview: true
|
|
292
|
+
}
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
clearTimeout(timeoutId);
|
|
297
|
+
pendingExecutions.delete(currentMessageId);
|
|
298
|
+
resolve({
|
|
299
|
+
success: false,
|
|
300
|
+
error: `Failed to send: ${error instanceof Error ? error.message : String(error)}`
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Hermes workaround for awaitPromise: execute the expression, and if it
|
|
307
|
+
* returns a Promise, store the resolved/rejected value in a temp global
|
|
308
|
+
* and read it back with a small number of spaced-out retries.
|
|
309
|
+
*/
|
|
310
|
+
async function executeWithManualAwait(app, cleanedExpression, timeoutMs) {
|
|
311
|
+
const slotId = `__rn_dbg_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
312
|
+
// Wrap: run the expression, if result is thenable store resolved value in
|
|
313
|
+
// a temp global slot; otherwise store the sync value immediately.
|
|
314
|
+
const wrapperExpr = `(function(){
|
|
315
|
+
var __v=(${cleanedExpression});
|
|
316
|
+
if(__v&&typeof __v==='object'&&typeof __v.then==='function'){
|
|
317
|
+
globalThis['${slotId}']={s:'pending'};
|
|
318
|
+
__v.then(function(r){globalThis['${slotId}']={s:'ok',v:r}},function(e){globalThis['${slotId}']={s:'err',v:String(e)}});
|
|
319
|
+
return '__awaiting__'}
|
|
320
|
+
else{return __v}})()`;
|
|
321
|
+
const initial = await executeCDP(app, wrapperExpr, false, timeoutMs);
|
|
322
|
+
// If the expression didn't return a Promise, return the result directly
|
|
323
|
+
if (!initial.success || initial.result !== "__awaiting__") {
|
|
324
|
+
return initial;
|
|
325
|
+
}
|
|
326
|
+
// Read the settled value with a few spaced-out retries (not aggressive polling).
|
|
327
|
+
// Most Promises resolve within a microtask or a single event loop tick.
|
|
328
|
+
const RETRY_DELAYS_MS = [100, 300, 600, 1000, 2000, 3000];
|
|
329
|
+
const readExpr = `(function(){var s=globalThis['${slotId}'];if(!s||s.s==='pending')return '__pending__';delete globalThis['${slotId}'];return{status:s.s,value:s.v}})()`;
|
|
330
|
+
for (const delayMs of RETRY_DELAYS_MS) {
|
|
331
|
+
await new Promise((r) => setTimeout(r, delayMs));
|
|
332
|
+
const poll = await executeCDP(app, readExpr, false, 5000);
|
|
333
|
+
if (!poll.success)
|
|
334
|
+
return poll;
|
|
335
|
+
if (poll.result === "__pending__")
|
|
336
|
+
continue;
|
|
337
|
+
// The poll result comes through formatRemoteObject — objects are
|
|
338
|
+
// JSON.stringified, so we need to parse it back.
|
|
339
|
+
try {
|
|
340
|
+
const parsed = typeof poll.result === "string" ? JSON.parse(poll.result) : poll.result;
|
|
341
|
+
if (parsed?.status === "err") {
|
|
342
|
+
return { success: false, error: parsed.value || "Promise rejected" };
|
|
343
|
+
}
|
|
344
|
+
const value = parsed?.value;
|
|
345
|
+
return {
|
|
346
|
+
success: true,
|
|
347
|
+
result: value === undefined || value === null
|
|
348
|
+
? String(value)
|
|
349
|
+
: typeof value === "object"
|
|
350
|
+
? JSON.stringify(value, null, 2)
|
|
351
|
+
: String(value)
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
return poll;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// Cleanup on timeout
|
|
359
|
+
await executeCDP(app, `delete globalThis['${slotId}']`, false, 2000).catch(() => { });
|
|
360
|
+
return { success: false, error: "Timeout: Promise did not resolve within the time limit." };
|
|
361
|
+
}
|
|
362
|
+
// Execute JavaScript in the connected React Native app with retry logic
|
|
363
|
+
export async function executeInApp(expression, awaitPromise = true, options = {}, device) {
|
|
364
|
+
const { maxRetries = 2, retryDelayMs = 1000, autoReconnect = true, timeoutMs = 10000 } = options;
|
|
365
|
+
let lastError;
|
|
366
|
+
let preferredPort;
|
|
367
|
+
// Get preferred port from current connection if available
|
|
368
|
+
const currentApp = getConnectedAppByDevice(device);
|
|
369
|
+
if (currentApp) {
|
|
370
|
+
preferredPort = currentApp.port;
|
|
371
|
+
}
|
|
372
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
373
|
+
const app = getConnectedAppByDevice(device);
|
|
374
|
+
// No connection - try to reconnect if enabled
|
|
375
|
+
if (!app) {
|
|
376
|
+
if (autoReconnect && attempt < maxRetries) {
|
|
377
|
+
console.error(`[execbro] No connection, attempting reconnect (attempt ${attempt + 1}/${maxRetries})...`);
|
|
378
|
+
const reconnected = await attemptQuickReconnect(preferredPort);
|
|
379
|
+
if (reconnected) {
|
|
380
|
+
await delay(retryDelayMs);
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return { success: false, error: "No apps connected. Run 'scan_metro' first." };
|
|
385
|
+
}
|
|
386
|
+
// WebSocket not open - try to reconnect
|
|
387
|
+
if (app.ws.readyState !== WebSocket.OPEN) {
|
|
388
|
+
if (autoReconnect && attempt < maxRetries) {
|
|
389
|
+
console.error(`[execbro] WebSocket not open, attempting reconnect (attempt ${attempt + 1}/${maxRetries})...`);
|
|
390
|
+
// Close stale connection
|
|
391
|
+
const appKey = `${app.port}-${app.deviceInfo.id}`;
|
|
392
|
+
cancelReconnectionTimer(appKey);
|
|
393
|
+
try {
|
|
394
|
+
app.ws.close();
|
|
395
|
+
}
|
|
396
|
+
catch {
|
|
397
|
+
/* ignore */
|
|
398
|
+
}
|
|
399
|
+
connectedApps.delete(appKey);
|
|
400
|
+
const reconnected = await attemptQuickReconnect(app.port);
|
|
401
|
+
if (reconnected) {
|
|
402
|
+
await delay(retryDelayMs);
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return { success: false, error: "WebSocket connection is not open." };
|
|
407
|
+
}
|
|
408
|
+
// Execute the expression
|
|
409
|
+
const result = await executeExpressionCore(expression, awaitPromise, timeoutMs, app);
|
|
410
|
+
// Success - return result
|
|
411
|
+
if (result.success) {
|
|
412
|
+
return result;
|
|
413
|
+
}
|
|
414
|
+
lastError = result.error;
|
|
415
|
+
// Check if this is a context error that might be recoverable
|
|
416
|
+
if (isContextError(result.error)) {
|
|
417
|
+
if (autoReconnect && attempt < maxRetries) {
|
|
418
|
+
console.error(`[execbro] Context error detected, attempting reconnect (attempt ${attempt + 1}/${maxRetries})...`);
|
|
419
|
+
// Close and reconnect
|
|
420
|
+
const appKey = `${app.port}-${app.deviceInfo.id}`;
|
|
421
|
+
cancelReconnectionTimer(appKey);
|
|
422
|
+
try {
|
|
423
|
+
app.ws.close();
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
/* ignore */
|
|
427
|
+
}
|
|
428
|
+
connectedApps.delete(appKey);
|
|
429
|
+
const reconnected = await attemptQuickReconnect(app.port);
|
|
430
|
+
if (reconnected) {
|
|
431
|
+
await delay(retryDelayMs);
|
|
432
|
+
continue;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// Non-context error or no more retries - return error
|
|
437
|
+
return result;
|
|
438
|
+
}
|
|
439
|
+
return {
|
|
440
|
+
success: false,
|
|
441
|
+
error: lastError ?? [
|
|
442
|
+
"Execution failed after all retries. Connection may be stale.",
|
|
443
|
+
"",
|
|
444
|
+
"Recovery steps (try in order):",
|
|
445
|
+
"1. Call scan_metro to re-establish a fresh CDP connection",
|
|
446
|
+
"2. If scan_metro doesn't help, force-restart the app:",
|
|
447
|
+
" - iOS: ios_terminate_app then ios_launch_app",
|
|
448
|
+
" - Android: android_launch_app (restarts automatically)",
|
|
449
|
+
"3. After restarting, call scan_metro again to reconnect",
|
|
450
|
+
].join("\n")
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
//# sourceMappingURL=jsExecute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsExecute.js","sourceRoot":"","sources":["../../src/core/jsExecute.ts"],"names":[],"mappings":"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"}
|
package/build/core/ocr.d.ts
CHANGED
|
@@ -24,6 +24,14 @@ export interface OCROptions {
|
|
|
24
24
|
platform?: "ios" | "android";
|
|
25
25
|
/** Device pixel ratio for iOS coordinate conversion (default: 3 for @3x devices, use 2 for older/iPad) */
|
|
26
26
|
devicePixelRatio?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Optional cancellation signal. When aborted, recognizeText rejects
|
|
29
|
+
* immediately so callers (e.g. the OCR strategy in tap.ts) don't wait past
|
|
30
|
+
* their cap. The cloud fetch passes the signal directly; the local easyocr
|
|
31
|
+
* path can't kill the Python process inside node-easyocr, so the work
|
|
32
|
+
* continues in the background until the host process exits.
|
|
33
|
+
*/
|
|
34
|
+
signal?: AbortSignal;
|
|
27
35
|
}
|
|
28
36
|
export interface OCRLine {
|
|
29
37
|
text: string;
|
|
@@ -68,6 +76,11 @@ export declare function inferIOSDevicePixelRatio(width: number, height: number):
|
|
|
68
76
|
export declare function toTapCoord(ocrCoord: number, _scaleFactor: number): number;
|
|
69
77
|
/**
|
|
70
78
|
* Run OCR — tries cloud (Google Vision) first, falls back to local EasyOCR.
|
|
79
|
+
*
|
|
80
|
+
* If `options.signal` aborts, this rejects immediately so callers don't wait
|
|
81
|
+
* past their cap. Inflight cloud fetch aborts; local easyocr work continues
|
|
82
|
+
* in the background (node-easyocr offers no cancel hook) and is dropped on
|
|
83
|
+
* resolve.
|
|
71
84
|
*/
|
|
72
85
|
export declare function recognizeText(imageBuffer: Buffer, options?: OCROptions): Promise<OCRResult>;
|
|
73
86
|
export declare function terminateOCRWorker(): Promise<void>;
|
package/build/core/ocr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ocr.d.ts","sourceRoot":"","sources":["../../src/core/ocr.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACJ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,wEAAwE;IACxE,SAAS,EAAE;QACP,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACL;AAED,MAAM,WAAW,UAAU;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC7B,0GAA0G;IAC1G,gBAAgB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ocr.d.ts","sourceRoot":"","sources":["../../src/core/ocr.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACJ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,wEAAwE;IACxE,SAAS,EAAE;QACP,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACL;AAED,MAAM,WAAW,UAAU;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;IAC7B,0GAA0G;IAC1G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,EAAE;QACJ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,wEAAwE;IACxE,SAAS,EAAE;QACP,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;CACL;AAED,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;CAC/B;AA6GD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsB9E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEzE;AAyHD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAmBjG;AAgFD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUxD"}
|
package/build/core/ocr.js
CHANGED
|
@@ -152,15 +152,25 @@ async function recognizeTextCloud(imageBuffer, options) {
|
|
|
152
152
|
},
|
|
153
153
|
body,
|
|
154
154
|
};
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
const externalSignal = options?.signal;
|
|
156
|
+
const racedSignal = () => {
|
|
157
157
|
const controller = new AbortController();
|
|
158
158
|
const timeout = setTimeout(() => controller.abort(), OCR_TIMEOUT_MS);
|
|
159
|
+
const onExternalAbort = () => { clearTimeout(timeout); controller.abort(); };
|
|
160
|
+
if (externalSignal) {
|
|
161
|
+
if (externalSignal.aborted)
|
|
162
|
+
controller.abort();
|
|
163
|
+
else
|
|
164
|
+
externalSignal.addEventListener("abort", onExternalAbort, { once: true });
|
|
165
|
+
}
|
|
166
|
+
return controller.signal;
|
|
167
|
+
};
|
|
168
|
+
let response;
|
|
169
|
+
try {
|
|
159
170
|
response = await fetch(`${OCR_ENDPOINT}/ocr`, {
|
|
160
171
|
...fetchOptions,
|
|
161
|
-
signal:
|
|
172
|
+
signal: racedSignal(),
|
|
162
173
|
});
|
|
163
|
-
clearTimeout(timeout);
|
|
164
174
|
}
|
|
165
175
|
catch {
|
|
166
176
|
return null; // Network error or timeout — fall back to local
|
|
@@ -169,13 +179,10 @@ async function recognizeTextCloud(imageBuffer, options) {
|
|
|
169
179
|
if (response.status === 502) {
|
|
170
180
|
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
171
181
|
try {
|
|
172
|
-
const controller = new AbortController();
|
|
173
|
-
const timeout = setTimeout(() => controller.abort(), OCR_TIMEOUT_MS);
|
|
174
182
|
response = await fetch(`${OCR_ENDPOINT}/ocr`, {
|
|
175
183
|
...fetchOptions,
|
|
176
|
-
signal:
|
|
184
|
+
signal: racedSignal(),
|
|
177
185
|
});
|
|
178
|
-
clearTimeout(timeout);
|
|
179
186
|
}
|
|
180
187
|
catch {
|
|
181
188
|
return null;
|
|
@@ -222,15 +229,30 @@ async function recognizeTextCloud(imageBuffer, options) {
|
|
|
222
229
|
}
|
|
223
230
|
/**
|
|
224
231
|
* Run OCR — tries cloud (Google Vision) first, falls back to local EasyOCR.
|
|
232
|
+
*
|
|
233
|
+
* If `options.signal` aborts, this rejects immediately so callers don't wait
|
|
234
|
+
* past their cap. Inflight cloud fetch aborts; local easyocr work continues
|
|
235
|
+
* in the background (node-easyocr offers no cancel hook) and is dropped on
|
|
236
|
+
* resolve.
|
|
225
237
|
*/
|
|
226
238
|
export async function recognizeText(imageBuffer, options) {
|
|
227
|
-
|
|
228
|
-
const
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
239
|
+
const signal = options?.signal;
|
|
240
|
+
const abortPromise = signal
|
|
241
|
+
? new Promise((_, reject) => {
|
|
242
|
+
if (signal.aborted) {
|
|
243
|
+
reject(new Error("recognizeText aborted"));
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
signal.addEventListener("abort", () => reject(new Error("recognizeText aborted")), { once: true });
|
|
247
|
+
})
|
|
248
|
+
: null;
|
|
249
|
+
const work = (async () => {
|
|
250
|
+
const cloudResult = await recognizeTextCloud(imageBuffer, options);
|
|
251
|
+
if (cloudResult)
|
|
252
|
+
return cloudResult;
|
|
253
|
+
return recognizeTextLocal(imageBuffer, options);
|
|
254
|
+
})();
|
|
255
|
+
return abortPromise ? Promise.race([work, abortPromise]) : work;
|
|
234
256
|
}
|
|
235
257
|
/**
|
|
236
258
|
* Run OCR using local EasyOCR (fallback).
|
package/build/core/ocr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ocr.js","sourceRoot":"","sources":["../../src/core/ocr.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ocr.js","sourceRoot":"","sources":["../../src/core/ocr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../src/core/posthog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../src/core/posthog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC,wBAAgB,gBAAgB,IAAI,OAAO,GAAG,IAAI,CAcjD;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAmB1D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrD"}
|