@rn-probe/cli 0.1.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/LICENSE +21 -0
- package/README.md +75 -0
- package/SKILL.md +146 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +164 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon/devtools.d.ts +21 -0
- package/dist/daemon/devtools.d.ts.map +1 -0
- package/dist/daemon/devtools.js +227 -0
- package/dist/daemon/devtools.js.map +1 -0
- package/dist/daemon/index.d.ts +7 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +124 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/metro.d.ts +16 -0
- package/dist/daemon/metro.d.ts.map +1 -0
- package/dist/daemon/metro.js +118 -0
- package/dist/daemon/metro.js.map +1 -0
- package/dist/daemon/simulator.d.ts +15 -0
- package/dist/daemon/simulator.d.ts.map +1 -0
- package/dist/daemon/simulator.js +134 -0
- package/dist/daemon/simulator.js.map +1 -0
- package/dist/daemon/state.d.ts +13 -0
- package/dist/daemon/state.d.ts.map +1 -0
- package/dist/daemon/state.js +10 -0
- package/dist/daemon/state.js.map +1 -0
- package/dist/ipc.d.ts +27 -0
- package/dist/ipc.d.ts.map +1 -0
- package/dist/ipc.js +78 -0
- package/dist/ipc.js.map +1 -0
- package/dist/spawn.d.ts +2 -0
- package/dist/spawn.d.ts.map +1 -0
- package/dist/spawn.js +28 -0
- package/dist/spawn.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import WebSocket from "ws";
|
|
2
|
+
import { state } from "./state.js";
|
|
3
|
+
const DEVTOOLS_PORT = 8097;
|
|
4
|
+
const RECONNECT_DELAY_MS = 2000;
|
|
5
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
6
|
+
// ── DevToolsBridge ────────────────────────────────────────────────────────────
|
|
7
|
+
export class DevToolsBridge {
|
|
8
|
+
ws = null;
|
|
9
|
+
connected = false;
|
|
10
|
+
pendingRequests = new Map();
|
|
11
|
+
componentTree = new Map();
|
|
12
|
+
networkLog = [];
|
|
13
|
+
perfEvents = [];
|
|
14
|
+
async connect() {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
this.tryConnect(resolve);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
tryConnect(onFirstConnect) {
|
|
20
|
+
const ws = new WebSocket(`ws://localhost:${DEVTOOLS_PORT}`);
|
|
21
|
+
this.ws = ws;
|
|
22
|
+
ws.on("open", () => {
|
|
23
|
+
// Introduce ourselves as a DevTools frontend
|
|
24
|
+
ws.send(JSON.stringify({ type: "react-devtools-inject-backend" }));
|
|
25
|
+
this.connected = true;
|
|
26
|
+
state.devtoolsConnected = true;
|
|
27
|
+
onFirstConnect?.();
|
|
28
|
+
});
|
|
29
|
+
ws.on("message", (data) => {
|
|
30
|
+
this.handleMessage(JSON.parse(data.toString()));
|
|
31
|
+
});
|
|
32
|
+
ws.on("close", () => {
|
|
33
|
+
this.connected = false;
|
|
34
|
+
state.devtoolsConnected = false;
|
|
35
|
+
// Reconnect after delay
|
|
36
|
+
setTimeout(() => this.tryConnect(), RECONNECT_DELAY_MS);
|
|
37
|
+
});
|
|
38
|
+
ws.on("error", () => {
|
|
39
|
+
// Will trigger close which handles reconnect
|
|
40
|
+
onFirstConnect?.(); // resolve connect() even if DevTools unavailable
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
disconnect() {
|
|
44
|
+
this.ws?.close();
|
|
45
|
+
this.ws = null;
|
|
46
|
+
this.connected = false;
|
|
47
|
+
state.devtoolsConnected = false;
|
|
48
|
+
}
|
|
49
|
+
// ── Message dispatch ─────────────────────────────────────────────────────────
|
|
50
|
+
handleMessage(msg) {
|
|
51
|
+
// Resolve pending request if response matches
|
|
52
|
+
if (msg.type === "inspectElement" || msg.type === "getComponentTree") {
|
|
53
|
+
const pending = this.pendingRequests.get(msg.type);
|
|
54
|
+
if (pending) {
|
|
55
|
+
this.pendingRequests.delete(msg.type);
|
|
56
|
+
pending.resolve(msg.payload);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Update component tree cache
|
|
60
|
+
if (msg.type === "operations" && msg.payload) {
|
|
61
|
+
this.applyTreeOperations(msg.payload);
|
|
62
|
+
}
|
|
63
|
+
// Capture network events
|
|
64
|
+
if (msg.type === "network-request-received" && msg.payload) {
|
|
65
|
+
const req = msg.payload;
|
|
66
|
+
const existing = this.networkLog.findIndex((r) => r.id === req.id);
|
|
67
|
+
if (existing >= 0) {
|
|
68
|
+
this.networkLog[existing] = { ...this.networkLog[existing], ...req };
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.networkLog.push(req);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Capture perf events
|
|
75
|
+
if (msg.type === "performance" && msg.payload) {
|
|
76
|
+
const p = msg.payload;
|
|
77
|
+
this.perfEvents.push({ ts: Date.now(), jsFps: p.jsFps, uiFps: p.uiFps });
|
|
78
|
+
if (this.perfEvents.length > 100)
|
|
79
|
+
this.perfEvents.shift();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
applyTreeOperations(ops) {
|
|
83
|
+
// The React DevTools "operations" message encodes tree mutations as a flat
|
|
84
|
+
// integer array. For simplicity we rebuild from full snapshots sent by
|
|
85
|
+
// getComponentTree and only use this to detect staleness.
|
|
86
|
+
// A full operations parser is a future improvement.
|
|
87
|
+
void ops;
|
|
88
|
+
}
|
|
89
|
+
// ── Request helper ───────────────────────────────────────────────────────────
|
|
90
|
+
request(type, payload) {
|
|
91
|
+
if (!this.connected || !this.ws) {
|
|
92
|
+
throw new Error("RN DevTools not connected. Is your app running with dev mode enabled?");
|
|
93
|
+
}
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
const timer = setTimeout(() => {
|
|
96
|
+
this.pendingRequests.delete(type);
|
|
97
|
+
reject(new Error(`DevTools request '${type}' timed out`));
|
|
98
|
+
}, REQUEST_TIMEOUT_MS);
|
|
99
|
+
this.pendingRequests.set(type, {
|
|
100
|
+
resolve: (v) => { clearTimeout(timer); resolve(v); },
|
|
101
|
+
reject: (e) => { clearTimeout(timer); reject(e); },
|
|
102
|
+
});
|
|
103
|
+
this.ws.send(JSON.stringify({ type, payload }));
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// ── Tree ─────────────────────────────────────────────────────────────────────
|
|
107
|
+
async getTree() {
|
|
108
|
+
// Request a fresh snapshot
|
|
109
|
+
const snapshot = await this.request("getComponentTree", { rendererID: 1 });
|
|
110
|
+
const nodes = new Map();
|
|
111
|
+
for (const n of snapshot.nodes)
|
|
112
|
+
nodes.set(n.id, n);
|
|
113
|
+
const roots = snapshot.nodes.filter((n) => {
|
|
114
|
+
// Root nodes are not referenced as a child by any other node
|
|
115
|
+
const allChildIds = new Set(snapshot.nodes.flatMap((x) => x.children));
|
|
116
|
+
return !allChildIds.has(n.id);
|
|
117
|
+
});
|
|
118
|
+
const lines = [];
|
|
119
|
+
const walk = (id, depth) => {
|
|
120
|
+
const node = nodes.get(id);
|
|
121
|
+
if (!node)
|
|
122
|
+
return;
|
|
123
|
+
lines.push(`${" ".repeat(depth)}[${id}] ${node.displayName ?? "(anonymous)"}`);
|
|
124
|
+
for (const childId of node.children)
|
|
125
|
+
walk(childId, depth + 1);
|
|
126
|
+
};
|
|
127
|
+
for (const root of roots)
|
|
128
|
+
walk(root.id, 0);
|
|
129
|
+
return lines.join("\n") || "(empty tree)";
|
|
130
|
+
}
|
|
131
|
+
// ── Inspect ──────────────────────────────────────────────────────────────────
|
|
132
|
+
async inspect(id) {
|
|
133
|
+
const result = await this.request("inspectElement", { id: Number(id), rendererID: 1, path: null });
|
|
134
|
+
if (!result)
|
|
135
|
+
return `Component ${id} not found.`;
|
|
136
|
+
const el = result.value;
|
|
137
|
+
const lines = [];
|
|
138
|
+
lines.push(`Component: ${el.displayName ?? "(anonymous)"}`);
|
|
139
|
+
if (el.source)
|
|
140
|
+
lines.push(`Source: ${el.source.fileName}:${el.source.lineNumber}`);
|
|
141
|
+
if (el.props && Object.keys(el.props).length > 0) {
|
|
142
|
+
lines.push("Props:");
|
|
143
|
+
for (const [k, v] of Object.entries(el.props)) {
|
|
144
|
+
lines.push(` ${k}: ${JSON.stringify(v)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (el.state !== null && el.state !== undefined) {
|
|
148
|
+
lines.push(`State: ${JSON.stringify(el.state, null, 2)}`);
|
|
149
|
+
}
|
|
150
|
+
if (el.hooks && el.hooks.length > 0) {
|
|
151
|
+
lines.push("Hooks:");
|
|
152
|
+
for (const h of el.hooks) {
|
|
153
|
+
lines.push(` ${h.name}: ${JSON.stringify(h.value)}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return lines.join("\n");
|
|
157
|
+
}
|
|
158
|
+
// ── Find ─────────────────────────────────────────────────────────────────────
|
|
159
|
+
async find(name) {
|
|
160
|
+
const snapshot = await this.request("getComponentTree", { rendererID: 1 });
|
|
161
|
+
const lower = name.toLowerCase();
|
|
162
|
+
const matches = snapshot.nodes.filter((n) => (n.displayName ?? "").toLowerCase().includes(lower));
|
|
163
|
+
if (matches.length === 0)
|
|
164
|
+
return `No components matching "${name}" found.`;
|
|
165
|
+
return matches
|
|
166
|
+
.map((n) => `[${n.id}] ${n.displayName ?? "(anonymous)"}`)
|
|
167
|
+
.join("\n");
|
|
168
|
+
}
|
|
169
|
+
// ── Eval ─────────────────────────────────────────────────────────────────────
|
|
170
|
+
async evaluate(script) {
|
|
171
|
+
// Use CDP evaluateOnCallFrame via DevTools bridge
|
|
172
|
+
const result = await this.request("evaluateOnCallFrame", { expression: script, callFrameId: "0" });
|
|
173
|
+
if (result.exceptionDetails) {
|
|
174
|
+
throw new Error(result.exceptionDetails.exception?.description ?? result.exceptionDetails.text);
|
|
175
|
+
}
|
|
176
|
+
return JSON.stringify(result.result, null, 2);
|
|
177
|
+
}
|
|
178
|
+
// ── Network ──────────────────────────────────────────────────────────────────
|
|
179
|
+
network(idx) {
|
|
180
|
+
if (this.networkLog.length === 0) {
|
|
181
|
+
return "No network requests captured.\nNote: Network inspection requires Hermes with network inspection enabled.";
|
|
182
|
+
}
|
|
183
|
+
if (idx !== undefined) {
|
|
184
|
+
const req = this.networkLog[idx];
|
|
185
|
+
if (!req)
|
|
186
|
+
return `No request at index ${idx}.`;
|
|
187
|
+
const lines = [
|
|
188
|
+
`[${idx}] ${req.method} ${req.url}`,
|
|
189
|
+
`Status: ${req.status ?? "pending"}`,
|
|
190
|
+
`Duration: ${req.duration !== undefined ? `${req.duration}ms` : "—"}`,
|
|
191
|
+
];
|
|
192
|
+
if (req.requestHeaders) {
|
|
193
|
+
lines.push("Request Headers:");
|
|
194
|
+
for (const [k, v] of Object.entries(req.requestHeaders))
|
|
195
|
+
lines.push(` ${k}: ${v}`);
|
|
196
|
+
}
|
|
197
|
+
if (req.requestBody)
|
|
198
|
+
lines.push(`Request Body:\n${req.requestBody}`);
|
|
199
|
+
if (req.responseHeaders) {
|
|
200
|
+
lines.push("Response Headers:");
|
|
201
|
+
for (const [k, v] of Object.entries(req.responseHeaders))
|
|
202
|
+
lines.push(` ${k}: ${v}`);
|
|
203
|
+
}
|
|
204
|
+
if (req.responseBody)
|
|
205
|
+
lines.push(`Response Body:\n${req.responseBody}`);
|
|
206
|
+
return lines.join("\n");
|
|
207
|
+
}
|
|
208
|
+
return this.networkLog
|
|
209
|
+
.map((r, i) => `[${i}] ${r.method} ${r.url} — ${r.status ?? "pending"} (${r.duration !== undefined ? `${r.duration}ms` : "—"})`)
|
|
210
|
+
.join("\n");
|
|
211
|
+
}
|
|
212
|
+
// ── Perf ─────────────────────────────────────────────────────────────────────
|
|
213
|
+
getPerfMetrics() {
|
|
214
|
+
if (this.perfEvents.length === 0)
|
|
215
|
+
return "No performance events captured yet.";
|
|
216
|
+
const recent = this.perfEvents.slice(-10);
|
|
217
|
+
const avgJs = Math.round(recent.reduce((s, e) => s + e.jsFps, 0) / recent.length);
|
|
218
|
+
const avgUi = Math.round(recent.reduce((s, e) => s + e.uiFps, 0) / recent.length);
|
|
219
|
+
const slow = this.perfEvents.filter((e) => e.jsFps < 30 || e.uiFps < 30).length;
|
|
220
|
+
return [
|
|
221
|
+
`JS Thread FPS (avg): ${avgJs}`,
|
|
222
|
+
`UI Thread FPS (avg): ${avgUi}`,
|
|
223
|
+
`Slow frames (<30fps): ${slow}`,
|
|
224
|
+
].join("\n");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=devtools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools.js","sourceRoot":"","sources":["../../src/daemon/devtools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MetroBridge } from "./metro.js";
|
|
2
|
+
import { DevToolsBridge } from "./devtools.js";
|
|
3
|
+
import { SimulatorBridge } from "./simulator.js";
|
|
4
|
+
export declare const metro: MetroBridge;
|
|
5
|
+
export declare const devtools: DevToolsBridge;
|
|
6
|
+
export declare const simulator: SimulatorBridge;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAajD,eAAO,MAAM,KAAK,aAAoB,CAAC;AACvC,eAAO,MAAM,QAAQ,gBAAuB,CAAC;AAC7C,eAAO,MAAM,SAAS,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import net from "node:net";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { SOCKET_PATH } from "../ipc.js";
|
|
4
|
+
import { state } from "./state.js";
|
|
5
|
+
import { MetroBridge } from "./metro.js";
|
|
6
|
+
import { DevToolsBridge } from "./devtools.js";
|
|
7
|
+
import { SimulatorBridge } from "./simulator.js";
|
|
8
|
+
const handlers = new Map();
|
|
9
|
+
function register(method, fn) {
|
|
10
|
+
handlers.set(method, fn);
|
|
11
|
+
}
|
|
12
|
+
// ── Bridges ───────────────────────────────────────────────────────────────────
|
|
13
|
+
export const metro = new MetroBridge();
|
|
14
|
+
export const devtools = new DevToolsBridge();
|
|
15
|
+
export const simulator = new SimulatorBridge();
|
|
16
|
+
// ── Lifecycle handlers ────────────────────────────────────────────────────────
|
|
17
|
+
register("open", async (params) => {
|
|
18
|
+
if (params.metroUrl)
|
|
19
|
+
state.metroUrl = params.metroUrl;
|
|
20
|
+
if (params.expoMode)
|
|
21
|
+
state.expoMode = params.expoMode;
|
|
22
|
+
if (params.platform)
|
|
23
|
+
state.platform = params.platform;
|
|
24
|
+
if (params.targetUdid)
|
|
25
|
+
state.targetUdid = params.targetUdid;
|
|
26
|
+
metro.connect(state.metroUrl);
|
|
27
|
+
await devtools.connect();
|
|
28
|
+
return {
|
|
29
|
+
metroUrl: state.metroUrl,
|
|
30
|
+
expoMode: state.expoMode,
|
|
31
|
+
platform: state.platform,
|
|
32
|
+
metroConnected: state.metroConnected,
|
|
33
|
+
devtoolsConnected: state.devtoolsConnected,
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
register("close", async () => {
|
|
37
|
+
metro.disconnect();
|
|
38
|
+
devtools.disconnect();
|
|
39
|
+
cleanup();
|
|
40
|
+
process.exit(0);
|
|
41
|
+
});
|
|
42
|
+
// ── Metro handlers ────────────────────────────────────────────────────────────
|
|
43
|
+
register("bundle-status", async () => metro.getBundleStatus());
|
|
44
|
+
register("errors", async () => metro.getErrors());
|
|
45
|
+
register("logs", async (p) => metro.getLogs(Number(p.lines ?? 50)));
|
|
46
|
+
register("reload", async () => metro.reload());
|
|
47
|
+
register("restart-metro", async () => metro.restart());
|
|
48
|
+
// ── DevTools handlers ─────────────────────────────────────────────────────────
|
|
49
|
+
register("tree", async () => devtools.getTree());
|
|
50
|
+
register("inspect", async (p) => devtools.inspect(p.id));
|
|
51
|
+
register("find", async (p) => devtools.find(p.name));
|
|
52
|
+
register("eval", async (p) => devtools.evaluate(p.script));
|
|
53
|
+
register("network", async (p) => devtools.network(p.idx !== undefined ? Number(p.idx) : undefined));
|
|
54
|
+
register("logs-perf", async () => devtools.getPerfMetrics());
|
|
55
|
+
// ── Simulator handlers ────────────────────────────────────────────────────────
|
|
56
|
+
register("screenshot", async (p) => simulator.screenshot(p.udid));
|
|
57
|
+
register("tap", async (p) => simulator.tap(Number(p.x), Number(p.y), p.udid));
|
|
58
|
+
register("swipe", async (p) => simulator.swipe(Number(p.x1), Number(p.y1), Number(p.x2), Number(p.y2), p.udid));
|
|
59
|
+
register("viewport", async (p) => simulator.viewport(p.size, p.udid));
|
|
60
|
+
register("goto", async (p) => simulator.goto(p.screen, state.expoMode, p.scheme, p.udid));
|
|
61
|
+
register("back", async (p) => simulator.back(p.udid));
|
|
62
|
+
register("logs-native", async (p) => simulator.logsNative(state.bundleId ?? "com.example.app", p.udid));
|
|
63
|
+
register("type", async (p) => simulator.type(p.text, p.udid));
|
|
64
|
+
// ── IPC server ────────────────────────────────────────────────────────────────
|
|
65
|
+
function cleanup() {
|
|
66
|
+
try {
|
|
67
|
+
fs.unlinkSync(SOCKET_PATH);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// already gone
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
process.on("SIGTERM", () => { cleanup(); process.exit(0); });
|
|
74
|
+
process.on("SIGINT", () => { cleanup(); process.exit(0); });
|
|
75
|
+
process.on("exit", cleanup);
|
|
76
|
+
process.on("uncaughtException", (err) => {
|
|
77
|
+
console.error("[daemon] uncaught:", err);
|
|
78
|
+
cleanup();
|
|
79
|
+
process.exit(1);
|
|
80
|
+
});
|
|
81
|
+
// Remove stale socket from a previous crash
|
|
82
|
+
cleanup();
|
|
83
|
+
const server = net.createServer((socket) => {
|
|
84
|
+
let buffer = "";
|
|
85
|
+
socket.on("data", (chunk) => {
|
|
86
|
+
buffer += chunk.toString();
|
|
87
|
+
const lines = buffer.split("\n");
|
|
88
|
+
buffer = lines.pop() ?? "";
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
if (!line.trim())
|
|
91
|
+
continue;
|
|
92
|
+
handleRequest(socket, line);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
socket.on("error", () => socket.destroy());
|
|
96
|
+
});
|
|
97
|
+
async function handleRequest(socket, raw) {
|
|
98
|
+
let req;
|
|
99
|
+
try {
|
|
100
|
+
req = JSON.parse(raw);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const handler = handlers.get(req.method);
|
|
106
|
+
if (!handler) {
|
|
107
|
+
const err = { id: req.id, error: { message: `Unknown method: ${req.method}` } };
|
|
108
|
+
socket.write(JSON.stringify(err) + "\n");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const result = await handler(req.params ?? {});
|
|
113
|
+
const res = { id: req.id, result };
|
|
114
|
+
socket.write(JSON.stringify(res) + "\n");
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
const err = { id: req.id, error: { message: e.message } };
|
|
118
|
+
socket.write(JSON.stringify(err) + "\n");
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
server.listen(SOCKET_PATH, () => {
|
|
122
|
+
console.log(`[daemon] listening on ${SOCKET_PATH}`);
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function appendMetroLog(line: string): void;
|
|
2
|
+
export declare class MetroBridge {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private metroProcess;
|
|
5
|
+
connect(metroUrl: string): void;
|
|
6
|
+
disconnect(): void;
|
|
7
|
+
getBundleStatus(): Promise<string>;
|
|
8
|
+
getErrors(): Promise<string>;
|
|
9
|
+
getLogs(lines: number): string;
|
|
10
|
+
reload(): Promise<string>;
|
|
11
|
+
restart(): Promise<string>;
|
|
12
|
+
private waitForMetro;
|
|
13
|
+
private get;
|
|
14
|
+
private post;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=metro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metro.d.ts","sourceRoot":"","sources":["../../src/daemon/metro.ts"],"names":[],"mappings":"AAeA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,QAG1C;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,YAAY,CAA0D;IAE9E,OAAO,CAAC,QAAQ,EAAE,MAAM;IAKxB,UAAU;IAMJ,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAelC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAkBlC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOxB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;YAyBlB,YAAY;IAY1B,OAAO,CAAC,GAAG;IAUX,OAAO,CAAC,IAAI;CAab"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import { state } from "./state.js";
|
|
3
|
+
// ── Ring buffer for Metro stdout ──────────────────────────────────────────────
|
|
4
|
+
const LOG_BUFFER_SIZE = 500;
|
|
5
|
+
const logBuffer = [];
|
|
6
|
+
export function appendMetroLog(line) {
|
|
7
|
+
if (logBuffer.length >= LOG_BUFFER_SIZE)
|
|
8
|
+
logBuffer.shift();
|
|
9
|
+
logBuffer.push(line);
|
|
10
|
+
}
|
|
11
|
+
// ── MetroBridge ───────────────────────────────────────────────────────────────
|
|
12
|
+
export class MetroBridge {
|
|
13
|
+
baseUrl = "http://localhost:8081";
|
|
14
|
+
metroProcess = null;
|
|
15
|
+
connect(metroUrl) {
|
|
16
|
+
this.baseUrl = metroUrl;
|
|
17
|
+
state.metroConnected = true;
|
|
18
|
+
}
|
|
19
|
+
disconnect() {
|
|
20
|
+
state.metroConnected = false;
|
|
21
|
+
}
|
|
22
|
+
// ── GET /status ─────────────────────────────────────────────────────────────
|
|
23
|
+
async getBundleStatus() {
|
|
24
|
+
const data = await this.get("/status").catch(() => null);
|
|
25
|
+
if (data === null) {
|
|
26
|
+
throw new Error(`Metro not reachable at ${this.baseUrl}. Is your dev server running?`);
|
|
27
|
+
}
|
|
28
|
+
const parsed = JSON.parse(data);
|
|
29
|
+
const lines = [];
|
|
30
|
+
lines.push(`Metro URL: ${this.baseUrl}`);
|
|
31
|
+
lines.push(`Bundle type: ${parsed.type ?? "unknown"}`);
|
|
32
|
+
lines.push(`Status: ${parsed.bundleStatus ?? JSON.stringify(parsed)}`);
|
|
33
|
+
return lines.join("\n");
|
|
34
|
+
}
|
|
35
|
+
// ── Errors ──────────────────────────────────────────────────────────────────
|
|
36
|
+
async getErrors() {
|
|
37
|
+
// Metro surfaces errors via /status (type=BundleTransformError) or cached error events.
|
|
38
|
+
// We check /status first, then fall back to the stored DevTools error list.
|
|
39
|
+
const data = await this.get("/status").catch(() => null);
|
|
40
|
+
if (data === null) {
|
|
41
|
+
throw new Error(`Metro not reachable at ${this.baseUrl}. Is your dev server running?`);
|
|
42
|
+
}
|
|
43
|
+
const parsed = JSON.parse(data);
|
|
44
|
+
if (parsed.type === "BundleTransformError") {
|
|
45
|
+
return `Build Error:\n${JSON.stringify(parsed, null, 2)}`;
|
|
46
|
+
}
|
|
47
|
+
return "No errors.";
|
|
48
|
+
}
|
|
49
|
+
// ── Logs ────────────────────────────────────────────────────────────────────
|
|
50
|
+
getLogs(lines) {
|
|
51
|
+
const tail = logBuffer.slice(-lines);
|
|
52
|
+
return tail.length > 0 ? tail.join("\n") : "(no Metro logs captured yet)";
|
|
53
|
+
}
|
|
54
|
+
// ── Reload ──────────────────────────────────────────────────────────────────
|
|
55
|
+
async reload() {
|
|
56
|
+
// Metro accepts a POST to /reload or a WebSocket message; try HTTP first.
|
|
57
|
+
await this.post("/reload", "").catch(() => {
|
|
58
|
+
// silent — Metro may not return 200 but still process it
|
|
59
|
+
});
|
|
60
|
+
return "Reload triggered.";
|
|
61
|
+
}
|
|
62
|
+
// ── Restart Metro ───────────────────────────────────────────────────────────
|
|
63
|
+
async restart() {
|
|
64
|
+
if (this.metroProcess) {
|
|
65
|
+
this.metroProcess.kill("SIGTERM");
|
|
66
|
+
this.metroProcess = null;
|
|
67
|
+
}
|
|
68
|
+
const { execa } = await import("execa");
|
|
69
|
+
const child = execa("npx", ["react-native", "start", "--reset-cache"], {
|
|
70
|
+
detached: false,
|
|
71
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
72
|
+
});
|
|
73
|
+
child.stdout?.on("data", (chunk) => {
|
|
74
|
+
for (const line of chunk.toString().split("\n")) {
|
|
75
|
+
if (line.trim())
|
|
76
|
+
appendMetroLog(line);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
this.metroProcess = child;
|
|
80
|
+
// Wait up to 20s for Metro to be ready
|
|
81
|
+
await this.waitForMetro(20_000);
|
|
82
|
+
return "Metro restarted.";
|
|
83
|
+
}
|
|
84
|
+
async waitForMetro(timeoutMs) {
|
|
85
|
+
const deadline = Date.now() + timeoutMs;
|
|
86
|
+
while (Date.now() < deadline) {
|
|
87
|
+
const ok = await this.get("/status").then(() => true).catch(() => false);
|
|
88
|
+
if (ok)
|
|
89
|
+
return;
|
|
90
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
91
|
+
}
|
|
92
|
+
throw new Error("Metro did not become ready within timeout.");
|
|
93
|
+
}
|
|
94
|
+
// ── HTTP helpers ─────────────────────────────────────────────────────────────
|
|
95
|
+
get(path) {
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
http.get(`${this.baseUrl}${path}`, (res) => {
|
|
98
|
+
let data = "";
|
|
99
|
+
res.on("data", (c) => { data += c.toString(); });
|
|
100
|
+
res.on("end", () => resolve(data));
|
|
101
|
+
}).on("error", reject);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
post(path, body) {
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
const url = new URL(`${this.baseUrl}${path}`);
|
|
107
|
+
const req = http.request({ hostname: url.hostname, port: url.port, path: url.pathname, method: "POST" }, (res) => {
|
|
108
|
+
let data = "";
|
|
109
|
+
res.on("data", (c) => { data += c.toString(); });
|
|
110
|
+
res.on("end", () => resolve(data));
|
|
111
|
+
});
|
|
112
|
+
req.on("error", reject);
|
|
113
|
+
req.write(body);
|
|
114
|
+
req.end();
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=metro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metro.js","sourceRoot":"","sources":["../../src/daemon/metro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ExpoMode } from "./state.js";
|
|
2
|
+
export declare class SimulatorBridge {
|
|
3
|
+
private get platform();
|
|
4
|
+
screenshot(udid?: string): Promise<string>;
|
|
5
|
+
tap(x: number, y: number, udid?: string): Promise<string>;
|
|
6
|
+
swipe(x1: number, y1: number, x2: number, y2: number, udid?: string): Promise<string>;
|
|
7
|
+
viewport(size?: string, udid?: string): Promise<string>;
|
|
8
|
+
goto(screen: string, expoMode: ExpoMode, scheme?: string, udid?: string): Promise<string>;
|
|
9
|
+
private buildDeepLink;
|
|
10
|
+
back(udid?: string): Promise<string>;
|
|
11
|
+
logsNative(bundleId: string, udid?: string): Promise<string>;
|
|
12
|
+
type(text: string, udid?: string): Promise<string>;
|
|
13
|
+
private adbDevice;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=simulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator.d.ts","sourceRoot":"","sources":["../../src/daemon/simulator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAS,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI7C,qBAAa,eAAe;IAC1B,OAAO,KAAK,QAAQ,GAA6B;IAI3C,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1C,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWzD,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAerF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BvD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW/F,OAAO,CAAC,aAAa;IAcf,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYpC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAa5D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAc1C,SAAS;CAMxB"}
|