@farmslot/adapter-rn 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +48 -10
  3. package/bridge-runtime/bridge-core.cjs +1481 -0
  4. package/bridge-runtime/console-forwarder.cjs +485 -0
  5. package/bridge-runtime/lib/bridge-errors.cjs +108 -0
  6. package/bridge-runtime/lib/cdp-eval.cjs +118 -0
  7. package/bridge-runtime/lib/config.cjs +68 -0
  8. package/bridge-runtime/lib/console-format.cjs +54 -0
  9. package/bridge-runtime/lib/devtools-proxy.cjs +169 -0
  10. package/bridge-runtime/lib/issue-capture.cjs +86 -0
  11. package/bridge-runtime/lib/match-bridge-target.cjs +89 -0
  12. package/bridge-runtime/lib/target-discovery.cjs +436 -0
  13. package/bridge-runtime/lib/ws-client.cjs +119 -0
  14. package/dist/cli.js +1 -1
  15. package/dist/cli.js.map +1 -1
  16. package/dist/devices.d.ts +16 -0
  17. package/dist/devices.d.ts.map +1 -0
  18. package/dist/devices.js +131 -0
  19. package/dist/devices.js.map +1 -0
  20. package/dist/doctor.js +1 -1
  21. package/dist/doctor.js.map +1 -1
  22. package/dist/fingerprint-baseline.d.ts +8 -0
  23. package/dist/fingerprint-baseline.d.ts.map +1 -0
  24. package/dist/fingerprint-baseline.js +68 -0
  25. package/dist/fingerprint-baseline.js.map +1 -0
  26. package/dist/frame-metrics.d.ts +26 -0
  27. package/dist/frame-metrics.d.ts.map +1 -0
  28. package/dist/frame-metrics.js +134 -0
  29. package/dist/frame-metrics.js.map +1 -0
  30. package/dist/index.d.ts +7 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +6 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/metro-env.d.ts +11 -0
  35. package/dist/metro-env.d.ts.map +1 -0
  36. package/dist/metro-env.js +29 -0
  37. package/dist/metro-env.js.map +1 -0
  38. package/dist/source-freshness.d.ts +11 -0
  39. package/dist/source-freshness.d.ts.map +1 -0
  40. package/dist/source-freshness.js +98 -0
  41. package/dist/source-freshness.js.map +1 -0
  42. package/dist/tool-paths.d.ts +13 -0
  43. package/dist/tool-paths.d.ts.map +1 -0
  44. package/dist/tool-paths.js +125 -0
  45. package/dist/tool-paths.js.map +1 -0
  46. package/dist/video-recorder.d.ts +7 -0
  47. package/dist/video-recorder.d.ts.map +1 -0
  48. package/dist/video-recorder.js +250 -0
  49. package/dist/video-recorder.js.map +1 -0
  50. package/metro/coalesce-metro-log.cjs +28 -0
  51. package/metro/launch-metro.cjs +84 -0
  52. package/metro/metro-config.cjs +92 -0
  53. package/metro/metro-log-generation.cjs +116 -0
  54. package/package.json +27 -7
@@ -0,0 +1,436 @@
1
+ 'use strict';
2
+
3
+ const http = require('node:http');
4
+ const {
5
+ loadSimulatorName,
6
+ loadAndroidDevice,
7
+ loadAndroidTargetDeviceName,
8
+ } = require('./config.cjs');
9
+ const { createWSClient } = require('./ws-client.cjs');
10
+ const { BRIDGE_ERROR_CODES, coded } = require('./bridge-errors.cjs');
11
+
12
+ const FETCH_TIMEOUT_MS = Number.parseInt(process.env.CDP_TIMEOUT || '30000', 10);
13
+ const DISCOVERY_RETRY_DELAY_MS = 500;
14
+ const FETCH_RETRIES = Number.parseInt(
15
+ process.env.CDP_DISCOVERY_RETRIES ||
16
+ String(Math.max(3, Math.ceil(FETCH_TIMEOUT_MS / DISCOVERY_RETRY_DELAY_MS))),
17
+ 10,
18
+ );
19
+
20
+ /** Fetch JSON from a URL (http only, no external deps) */
21
+ function fetchJSONOnce(url) {
22
+ return new Promise((resolve, reject) => {
23
+ const req = http.get(url, (res) => {
24
+ let data = '';
25
+ res.on('data', (chunk) => (data += chunk));
26
+ res.on('end', () => {
27
+ try {
28
+ resolve(JSON.parse(data));
29
+ } catch (e) {
30
+ reject(new Error(`Failed to parse JSON from ${url}: ${e.message}`));
31
+ }
32
+ });
33
+ });
34
+ req.on('error', reject);
35
+ req.setTimeout(FETCH_TIMEOUT_MS, () => {
36
+ req.destroy();
37
+ reject(new Error(`Timeout fetching ${url} after ${FETCH_TIMEOUT_MS}ms`));
38
+ });
39
+ });
40
+ }
41
+
42
+ async function fetchJSON(url, acceptResponse) {
43
+ let lastError;
44
+ let lastResponse;
45
+ for (let attempt = 1; attempt <= FETCH_RETRIES; attempt++) {
46
+ try {
47
+ const response = await fetchJSONOnce(url);
48
+ lastError = undefined;
49
+ lastResponse = response;
50
+ if (!acceptResponse || (await acceptResponse(response))) return response;
51
+ } catch (error) {
52
+ lastError = error;
53
+ }
54
+ if (attempt === FETCH_RETRIES) break;
55
+ await new Promise((resolve) => setTimeout(resolve, DISCOVERY_RETRY_DELAY_MS));
56
+ }
57
+ if (lastError !== undefined) throw lastError;
58
+ if (lastResponse !== undefined) return lastResponse;
59
+ throw lastError;
60
+ }
61
+
62
+ /**
63
+ * Quick probe: connect to a CDP target, evaluate `__DEV__`, disconnect.
64
+ * Returns true if __AGENTIC__ is installed, false otherwise.
65
+ */
66
+ async function probeTarget(wsUrl) {
67
+ return (await probeTargetDetailed(wsUrl)) === 'agentic';
68
+ }
69
+
70
+ /**
71
+ * Three-state probe so callers can tell a pre-__AGENTIC__ build apart from a
72
+ * dead target:
73
+ * 'agentic' — JS runtime answered and __AGENTIC__ is installed.
74
+ * 'responsive' — the target evaluated JS but has no __AGENTIC__ (an app build
75
+ * that predates the bridge, or a non-runtime page).
76
+ * 'unreachable' — connect/eval failed.
77
+ */
78
+ async function probeTargetDetailed(wsUrl) {
79
+ try {
80
+ const client = await createWSClient(wsUrl, 3000);
81
+ try {
82
+ const result = await client.send('Runtime.evaluate', {
83
+ expression: '(function(){ return typeof globalThis.__AGENTIC__; })()',
84
+ returnByValue: true,
85
+ awaitPromise: false,
86
+ });
87
+ return result?.result?.value === 'object' ? 'agentic' : 'responsive';
88
+ } finally {
89
+ client.close();
90
+ }
91
+ } catch {
92
+ // Connection failed — target is not usable at all
93
+ return 'unreachable';
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Filter Metro /json/list targets to debugger-capable RN/Hermes pages and rank
99
+ * them JS-runtime-first. Pre-RN-0.81 titles say "React Native"/"Hermes";
100
+ * RN 0.81+ Bridgeless titles are bundle-id-only (e.g. "io.metamask.MetaMask
101
+ * (mm-5)") with the runtime kind in `description`. Each device exposes
102
+ * multiple pages — page 1 is the native C++ runtime; the JS runtime (console,
103
+ * __AGENTIC__) has a higher page number, so after the sort the first candidate
104
+ * per device is its JS runtime.
105
+ */
106
+ function rankRuntimeCandidates(targets) {
107
+ const candidates = (Array.isArray(targets) ? targets : []).filter(
108
+ (t) =>
109
+ t.webSocketDebuggerUrl &&
110
+ ((t.title && (/react/i.test(t.title) || /hermes/i.test(t.title))) ||
111
+ /bridgeless|hermes/i.test(t.description || '')),
112
+ );
113
+ candidates.sort((a, b) => {
114
+ const aPage = Number.parseInt((a.id || '').split('-').pop() || '0', 10);
115
+ const bPage = Number.parseInt((b.id || '').split('-').pop() || '0', 10);
116
+ return bPage - aPage;
117
+ });
118
+ return candidates;
119
+ }
120
+
121
+ function targetDeviceIdentity(target) {
122
+ try {
123
+ const device = new URL(target.webSocketDebuggerUrl).searchParams.get('device');
124
+ if (device) return device;
125
+ } catch {
126
+ // Fall back to Metro's display identity when the debugger URL is malformed.
127
+ }
128
+ // Without Metro's device id there is no safe way to collapse same-name pages
129
+ // into one physical device. Keep each debugger target distinct and fail closed
130
+ // on ambiguity instead of silently choosing between devices.
131
+ return target.webSocketDebuggerUrl || target.deviceName || '';
132
+ }
133
+
134
+ /**
135
+ * Discover the Hermes CDP WebSocket URL from Metro's /json/list endpoint.
136
+ *
137
+ * Multi-simulator support:
138
+ * - When IOS_SIMULATOR is set, filters targets by deviceName
139
+ * - With Hermes bridgeless mode, there are multiple pages per device:
140
+ * page 1 = native C++ runtime, page 2+ = JS runtime (where __AGENTIC__ lives)
141
+ * - We probe candidates to find the one with __AGENTIC__ installed
142
+ */
143
+ async function discoverTarget(port, { probe = true } = {}) {
144
+ const listUrl = `http://127.0.0.1:${port}/json/list`;
145
+ const androidTargetName = loadAndroidTargetDeviceName();
146
+ const androidDevice = loadAndroidDevice();
147
+ const adbSerial = process.env.ADB_SERIAL || process.env.ANDROID_SERIAL || '';
148
+ const androidPinned = Boolean(androidTargetName || androidDevice);
149
+ const simName = loadSimulatorName();
150
+ const iosPinned =
151
+ process.env.RECIPE_RN_EXPLICIT_PLATFORM === 'ios' || Boolean(process.env.SIM_UDID);
152
+ const matchesAndroidPin = (target) =>
153
+ androidTargetName
154
+ ? target.deviceName !== simName &&
155
+ (target.deviceName === androidTargetName ||
156
+ (target.deviceName != null && target.deviceName.startsWith(androidTargetName)))
157
+ : target.deviceName === androidDevice;
158
+ let acceptedPinnedCandidate;
159
+ let targets;
160
+ try {
161
+ targets = await fetchJSON(listUrl, async (response) => {
162
+ const runtimeCandidates = rankRuntimeCandidates(response);
163
+ if (runtimeCandidates.length === 0) return false;
164
+ if (androidPinned) {
165
+ const pinnedCandidates = runtimeCandidates.filter(matchesAndroidPin);
166
+ for (const candidate of pinnedCandidates) {
167
+ if (!probe || (await probeTarget(candidate.webSocketDebuggerUrl))) {
168
+ acceptedPinnedCandidate = candidate;
169
+ return true;
170
+ }
171
+ }
172
+ return false;
173
+ }
174
+ if (iosPinned && simName) {
175
+ const pinnedCandidates = runtimeCandidates.filter(
176
+ (candidate) => candidate.deviceName === simName,
177
+ );
178
+ for (const candidate of pinnedCandidates) {
179
+ if (!probe || (await probeTarget(candidate.webSocketDebuggerUrl))) {
180
+ acceptedPinnedCandidate = candidate;
181
+ return true;
182
+ }
183
+ }
184
+ return false;
185
+ }
186
+ return true;
187
+ });
188
+ } catch (e) {
189
+ throw coded(
190
+ new Error(`Cannot reach Metro at ${listUrl}. Is Metro running?\n ${e.message}`),
191
+ BRIDGE_ERROR_CODES.METRO_UNREACHABLE,
192
+ );
193
+ }
194
+
195
+ if (!Array.isArray(targets) || targets.length === 0) {
196
+ throw coded(new Error(`No debug targets found at ${listUrl}`), BRIDGE_ERROR_CODES.NO_TARGET);
197
+ }
198
+
199
+ // Filter to React Native / Hermes targets with a WebSocket URL
200
+ let candidates = rankRuntimeCandidates(targets);
201
+
202
+ // Android pin identities (loaded before the simulator filter so an explicit
203
+ // android pin can take precedence over an ambient simulator name):
204
+ // ANDROID_TARGET_DEVICE_NAME — Metro-compatible model prefix resolved by bridge.mjs
205
+ // from the adb serial via `adb -s <serial> shell getprop ro.product.model`.
206
+ // Example: "Pixel 6" matches Metro deviceName "Pixel 6 - 16 - API 36".
207
+ // ANDROID_DEVICE — exact user-specified Metro deviceName.
208
+ // Filter by simulator name if IOS_SIMULATOR is set — but never when an android
209
+ // pin is present: dual-platform slots carry an ambient IOS_SIMULATOR in their
210
+ // context, and letting it win here sends a pinned android action to the iOS
211
+ // target. No-match keeps the full candidate set (ambient sim configs tolerate a
212
+ // sim that is not currently attached).
213
+ if (simName && !androidPinned) {
214
+ const deviceFiltered = candidates.filter((t) => t.deviceName === simName);
215
+ if (deviceFiltered.length > 0) {
216
+ candidates = deviceFiltered;
217
+ } else if (iosPinned) {
218
+ throw coded(
219
+ new Error(`Pinned iOS simulator '${simName}' did not match any Metro target.`),
220
+ BRIDGE_ERROR_CODES.NO_TARGET,
221
+ );
222
+ }
223
+ }
224
+
225
+ // Android pin enforcement — at ANY candidate count. A pin gated on
226
+ // candidates.length > 1 silently accepted a single WRONG candidate (observed
227
+ // live: the pinned Pixel's target dropped off Metro while the iOS target
228
+ // remained; the pin was ignored and the recipe drove the simulator). When a
229
+ // device is pinned, we MUST NOT silently fall back to another target; an
230
+ // unmatchable pin fails fast with diagnostics.
231
+ if (androidPinned) {
232
+ let androidFiltered = [];
233
+
234
+ if (androidTargetName) {
235
+ // Model prefix match: "Pixel 6" matches "Pixel 6 - 16 - API 36". Metro's
236
+ // /json/list has no explicit platform field, so scope the ANDROID pin by
237
+ // excluding the one iOS identity we do know (the pinned simulator name) —
238
+ // a simulator named to shadow a model string must not satisfy an android pin.
239
+ androidFiltered = candidates.filter(matchesAndroidPin);
240
+ const matchingDeviceIdentities = [...new Set(androidFiltered.map(targetDeviceIdentity))];
241
+ if (matchingDeviceIdentities.length > 1) {
242
+ // Two same-model devices produce identical Metro model prefixes — the pin
243
+ // is genuinely ambiguous. Native + JS pages share the same Metro device
244
+ // identity and must remain available for probing.
245
+ const ambiguousList = androidFiltered
246
+ .map(
247
+ (target) =>
248
+ ` deviceName=${JSON.stringify(target.deviceName || '')} ws=${target.webSocketDebuggerUrl || ''}`,
249
+ )
250
+ .join('\n');
251
+ throw coded(
252
+ new Error(
253
+ `Pinned Android device is ambiguous: model '${androidTargetName}' matches ${matchingDeviceIdentities.length} Metro devices.\n` +
254
+ ` Requested --device (ADB_SERIAL): ${adbSerial || '(not set)'}\n` +
255
+ ` Matching Metro targets:\n${ambiguousList}\n` +
256
+ ` Set ANDROID_DEVICE to the exact Metro deviceName to disambiguate.`,
257
+ ),
258
+ BRIDGE_ERROR_CODES.NO_TARGET,
259
+ );
260
+ }
261
+ if (androidFiltered.length === 0) {
262
+ // Pinned device could not be matched — never silently pick another target.
263
+ const candidateList = targets
264
+ .map(
265
+ (t) =>
266
+ ` deviceName=${JSON.stringify(t.deviceName || '')} ws=${t.webSocketDebuggerUrl || ''}`,
267
+ )
268
+ .join('\n');
269
+ throw coded(
270
+ new Error(
271
+ `Pinned Android device did not match any Metro target.\n` +
272
+ ` Requested --device (ADB_SERIAL): ${adbSerial || '(not set)'}\n` +
273
+ ` Resolved model (ANDROID_TARGET_DEVICE_NAME): ${androidTargetName}\n` +
274
+ ` ANDROID_DEVICE: ${androidDevice || '(not set)'}\n` +
275
+ ` Metro /json/list candidates:\n${candidateList}`,
276
+ ),
277
+ BRIDGE_ERROR_CODES.NO_TARGET,
278
+ );
279
+ }
280
+ candidates = androidFiltered;
281
+ } else if (androidDevice) {
282
+ // Exact Metro deviceName match when the user set ANDROID_DEVICE directly.
283
+ androidFiltered = candidates.filter(matchesAndroidPin);
284
+ if (androidFiltered.length === 0) {
285
+ // Pinned by exact Metro name but no candidate matched — fail fast.
286
+ const candidateList = targets
287
+ .map(
288
+ (t) =>
289
+ ` deviceName=${JSON.stringify(t.deviceName || '')} ws=${t.webSocketDebuggerUrl || ''}`,
290
+ )
291
+ .join('\n');
292
+ throw coded(
293
+ new Error(
294
+ `Pinned Android device (ANDROID_DEVICE='${androidDevice}') did not match any Metro target.\n` +
295
+ ` ADB_SERIAL: ${adbSerial || '(not set)'}\n` +
296
+ ` Metro /json/list candidates:\n${candidateList}`,
297
+ ),
298
+ BRIDGE_ERROR_CODES.NO_TARGET,
299
+ );
300
+ }
301
+ candidates = androidFiltered;
302
+ }
303
+ }
304
+
305
+ if (candidates.length === 0) {
306
+ candidates = targets.filter((t) => t.webSocketDebuggerUrl);
307
+ }
308
+
309
+ if (candidates.length === 0) {
310
+ throw coded(
311
+ new Error(`No suitable debug target found. Targets:\n${JSON.stringify(targets, null, 2)}`),
312
+ BRIDGE_ERROR_CODES.NO_TARGET,
313
+ );
314
+ }
315
+
316
+ if (acceptedPinnedCandidate) {
317
+ for (const candidate of candidates) {
318
+ if (candidate.webSocketDebuggerUrl === acceptedPinnedCandidate.webSocketDebuggerUrl) {
319
+ return {
320
+ id: acceptedPinnedCandidate.id || '',
321
+ wsUrl: acceptedPinnedCandidate.webSocketDebuggerUrl,
322
+ deviceName: acceptedPinnedCandidate.deviceName || '',
323
+ };
324
+ }
325
+ }
326
+ }
327
+
328
+ // The persistent console forwarder already owns and validates brokered CDP
329
+ // sessions. Re-probing here would evict that debugger; preserve the normal
330
+ // platform/device filtering and select the highest-ranked runtime instead.
331
+ if (!probe) {
332
+ return {
333
+ id: candidates[0].id || '',
334
+ wsUrl: candidates[0].webSocketDebuggerUrl,
335
+ deviceName: candidates[0].deviceName || '',
336
+ };
337
+ }
338
+
339
+ // Sort by page number descending (JS runtime has higher page number than C++
340
+ // native). rankRuntimeCandidates output arrives pre-sorted; this re-sort is
341
+ // load-bearing only when the raw targets.filter() fallback above repopulated
342
+ // the candidate list.
343
+ candidates.sort((a, b) => {
344
+ const aPage = Number.parseInt((a.id || '').split('-').pop() || '0', 10);
345
+ const bPage = Number.parseInt((b.id || '').split('-').pop() || '0', 10);
346
+ return bPage - aPage;
347
+ });
348
+
349
+ // Probe candidates to find the one with __AGENTIC__ installed (the JS runtime)
350
+ for (const candidate of candidates) {
351
+ const hasAgentic = await probeTarget(candidate.webSocketDebuggerUrl);
352
+ if (hasAgentic) {
353
+ return {
354
+ id: candidate.id || '',
355
+ wsUrl: candidate.webSocketDebuggerUrl,
356
+ deviceName: candidate.deviceName || '',
357
+ };
358
+ }
359
+ }
360
+
361
+ if (androidPinned || iosPinned) {
362
+ const candidateList = candidates
363
+ .map(
364
+ (target) =>
365
+ ` deviceName=${JSON.stringify(target.deviceName || '')} ws=${target.webSocketDebuggerUrl || ''}`,
366
+ )
367
+ .join('\n');
368
+ throw coded(
369
+ new Error(
370
+ `Pinned ${androidPinned ? 'Android device' : `iOS simulator '${simName || process.env.SIM_UDID || '(unknown)'}'`} has no responding __AGENTIC__ JS runtime after ${FETCH_RETRIES} discovery attempt(s).\n` +
371
+ (androidPinned
372
+ ? ` Requested --device (ADB_SERIAL): ${adbSerial || '(not set)'}\n`
373
+ : '') +
374
+ ` Matching non-agentic targets:\n${candidateList}\n` +
375
+ ` The native C++ page is not a valid recipe target; wait for Hermes to re-register or relaunch the pinned app.`,
376
+ ),
377
+ BRIDGE_ERROR_CODES.NO_TARGET,
378
+ );
379
+ }
380
+
381
+ // Fallback: return highest page number (most likely the JS runtime)
382
+ return {
383
+ id: candidates[0].id || '',
384
+ wsUrl: candidates[0].webSocketDebuggerUrl,
385
+ deviceName: candidates[0].deviceName || '',
386
+ };
387
+ }
388
+
389
+ /**
390
+ * Discover ALL Hermes targets with __AGENTIC__ installed (one per platform/device).
391
+ * Groups by deviceName so each device returns at most one target.
392
+ */
393
+ async function discoverAllTargets(port) {
394
+ const listUrl = `http://127.0.0.1:${port}/json/list`;
395
+ let targets;
396
+ try {
397
+ targets = await fetchJSON(listUrl);
398
+ } catch (e) {
399
+ throw coded(
400
+ new Error(`Cannot reach Metro at ${listUrl}. Is Metro running?\n ${e.message}`),
401
+ BRIDGE_ERROR_CODES.METRO_UNREACHABLE,
402
+ );
403
+ }
404
+
405
+ const candidates = rankRuntimeCandidates(targets);
406
+
407
+ // Group by deviceName, probe each to find the JS runtime target. Prefer the
408
+ // device's __AGENTIC__-bearing target; when a device has none, keep its first
409
+ // RESPONSIVE candidate (candidates are sorted JS-runtime-first) so a build
410
+ // that predates the bridge still surfaces — the status consumer reports it as
411
+ // bridge-absent instead of the device silently vanishing from discovery.
412
+ // Known ambiguity: when a device's JS runtime is attached-but-busy while its
413
+ // native C++ Hermes page answers, that page is also 'responsive' (no
414
+ // __AGENTIC__ in the native context), so the device reports bridge-absent even
415
+ // though the app build may carry the bridge. Low probability, and the degraded
416
+ // report is informative rather than harmful.
417
+ const agenticByDevice = new Map();
418
+ const responsiveByDevice = new Map();
419
+ for (const candidate of candidates) {
420
+ const device = candidate.deviceName || candidate.id || candidate.webSocketDebuggerUrl;
421
+ if (agenticByDevice.has(device)) continue;
422
+ const state = await probeTargetDetailed(candidate.webSocketDebuggerUrl);
423
+ if (state === 'agentic') {
424
+ agenticByDevice.set(device, { wsUrl: candidate.webSocketDebuggerUrl, deviceName: device });
425
+ } else if (state === 'responsive' && !responsiveByDevice.has(device)) {
426
+ responsiveByDevice.set(device, { wsUrl: candidate.webSocketDebuggerUrl, deviceName: device });
427
+ }
428
+ }
429
+ const results = [...agenticByDevice.values()];
430
+ for (const [device, entry] of responsiveByDevice) {
431
+ if (!agenticByDevice.has(device)) results.push(entry);
432
+ }
433
+ return results;
434
+ }
435
+
436
+ module.exports = { discoverTarget, discoverAllTargets, rankRuntimeCandidates };
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ const { BRIDGE_ERROR_CODES, coded } = require('./bridge-errors.cjs');
4
+ const WebSocket = require('ws');
5
+
6
+ function createInspectorWebSocket(wsUrl) {
7
+ const origin = new URL(wsUrl).origin.replace(/^ws/, 'http');
8
+ return new WebSocket(wsUrl, { origin });
9
+ }
10
+
11
+ /**
12
+ * Minimal CDP client that supplies the debugger Origin required by Metro.
13
+ */
14
+ function createWSClient(wsUrl, timeout) {
15
+ return new Promise((resolve, reject) => {
16
+ const ws = createInspectorWebSocket(wsUrl);
17
+ let msgId = 0;
18
+ const pending = new Map();
19
+ const eventHandlers = new Map();
20
+
21
+ const timer = setTimeout(() => {
22
+ ws.close();
23
+ reject(
24
+ coded(
25
+ new Error(`CDP connection timeout after ${timeout}ms`),
26
+ BRIDGE_ERROR_CODES.CDP_TIMEOUT,
27
+ ),
28
+ );
29
+ }, timeout);
30
+
31
+ ws.onopen = () => {
32
+ clearTimeout(timer);
33
+ resolve({
34
+ /** Send a CDP command and wait for the response */
35
+ send(method, params = {}, msgTimeout = timeout) {
36
+ return new Promise((res, rej) => {
37
+ const id = ++msgId;
38
+ const timer = setTimeout(() => {
39
+ pending.delete(id);
40
+ rej(
41
+ coded(
42
+ new Error(`CDP message timeout after ${msgTimeout}ms for ${method}`),
43
+ BRIDGE_ERROR_CODES.CDP_TIMEOUT,
44
+ ),
45
+ );
46
+ }, msgTimeout);
47
+ pending.set(id, {
48
+ resolve: (v) => {
49
+ clearTimeout(timer);
50
+ res(v);
51
+ },
52
+ reject: (e) => {
53
+ clearTimeout(timer);
54
+ rej(e);
55
+ },
56
+ });
57
+ const msg = JSON.stringify({ id, method, params });
58
+ ws.send(msg);
59
+ });
60
+ },
61
+ on(method, handler) {
62
+ const handlers = eventHandlers.get(method) || new Set();
63
+ handlers.add(handler);
64
+ eventHandlers.set(method, handlers);
65
+ return () => {
66
+ handlers.delete(handler);
67
+ if (handlers.size === 0) eventHandlers.delete(method);
68
+ };
69
+ },
70
+ close() {
71
+ ws.close();
72
+ },
73
+ });
74
+ };
75
+
76
+ ws.onmessage = (evt) => {
77
+ const data = typeof evt.data === 'string' ? evt.data : evt.data.toString();
78
+ let msg;
79
+ try {
80
+ msg = JSON.parse(data);
81
+ } catch {
82
+ // Non-JSON frame — ignore
83
+ return;
84
+ }
85
+ if (msg.id && pending.has(msg.id)) {
86
+ const { resolve: res, reject: rej } = pending.get(msg.id);
87
+ pending.delete(msg.id);
88
+ if (msg.error) {
89
+ rej(new Error(`CDP error: ${JSON.stringify(msg.error)}`));
90
+ } else {
91
+ res(msg.result);
92
+ }
93
+ return;
94
+ }
95
+ if (!msg.method) return;
96
+ for (const handler of eventHandlers.get(msg.method) || []) {
97
+ handler(msg.params || {});
98
+ }
99
+ };
100
+
101
+ ws.onerror = (err) => {
102
+ clearTimeout(timer);
103
+ reject(
104
+ coded(new Error(`WebSocket error: ${err.message || err}`), BRIDGE_ERROR_CODES.WS_CLOSED),
105
+ );
106
+ };
107
+
108
+ ws.onclose = () => {
109
+ clearTimeout(timer);
110
+ for (const [, { reject: rej }] of pending) {
111
+ rej(coded(new Error('WebSocket closed'), BRIDGE_ERROR_CODES.WS_CLOSED));
112
+ }
113
+ pending.clear();
114
+ eventHandlers.clear();
115
+ };
116
+ });
117
+ }
118
+
119
+ module.exports = { createWSClient, createInspectorWebSocket };
package/dist/cli.js CHANGED
@@ -164,6 +164,6 @@ function printRunResult(result) {
164
164
  console.log(`Artifacts: ${result.artifactManifestPath}`);
165
165
  }
166
166
  function printUsage() {
167
- console.log(`Farmslot Expo Recipe\n\nUsage:\n farmslot-adapter-rn init [--project-root <dir>] [--force] [--with-bridge]\n farmslot-adapter-rn manifest [--project-root <dir>] [--manifest <path>]\n farmslot-adapter-rn doctor [--project-root <dir>] [--manifest <path>] [--json]\n farmslot-adapter-rn validate [recipe] [--param key=value] [--project-root <dir>] [--manifest <path>] [--json]\n farmslot-adapter-rn run [recipe] [--param key=value] [--project-root <dir>] [--manifest <path>] [--artifacts-dir <dir>] [--dry-run] [--json] [--record-video[=full-run]] [--record-pid <pid>|--record-window-id <id>|--record-app-name <name> --record-window-name <title>]\n`);
167
+ console.log(`Farmslot React Native adapter\n\nUsage:\n farmslot-adapter-rn init [--project-root <dir>] [--force] [--with-bridge]\n farmslot-adapter-rn manifest [--project-root <dir>] [--manifest <path>]\n farmslot-adapter-rn doctor [--project-root <dir>] [--manifest <path>] [--json]\n farmslot-adapter-rn validate [recipe] [--param key=value] [--project-root <dir>] [--manifest <path>] [--json]\n farmslot-adapter-rn run [recipe] [--param key=value] [--project-root <dir>] [--manifest <path>] [--artifacts-dir <dir>] [--dry-run] [--json] [--record-video[=full-run]] [--record-pid <pid>|--record-window-id <id>|--record-app-name <name> --record-window-name <title>]\n`);
168
168
  }
169
169
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type DevicePlatform = 'ios' | 'android';
2
+ export interface ConnectedDevice {
3
+ platform: DevicePlatform;
4
+ id: string;
5
+ name?: string;
6
+ state: string;
7
+ }
8
+ export interface DeviceDiscoveryError {
9
+ platform: DevicePlatform;
10
+ message: string;
11
+ userAction: string;
12
+ probeCode?: string | number;
13
+ }
14
+ export declare function listConnectedDevices(platform?: DevicePlatform, errors?: DeviceDiscoveryError[]): ConnectedDevice[];
15
+ export declare function findAvailableIosSimulatorById(id: string, errors?: DeviceDiscoveryError[]): ConnectedDevice | undefined;
16
+ //# sourceMappingURL=devices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../src/devices.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,cAAc,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAuBD,wBAAgB,oBAAoB,CAClC,QAAQ,CAAC,EAAE,cAAc,EACzB,MAAM,GAAE,oBAAoB,EAAO,GAClC,eAAe,EAAE,CAKnB;AAKD,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,MAAM,EACV,MAAM,GAAE,oBAAoB,EAAO,GAClC,eAAe,GAAG,SAAS,CAK7B"}