react-native-ai-devtools 1.4.12 → 1.4.13
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/build/__tests__/integration/connection-health.test.js +12 -6
- package/build/__tests__/integration/connection-health.test.js.map +1 -1
- package/build/__tests__/unit/connection-health.test.js +26 -16
- package/build/__tests__/unit/connection-health.test.js.map +1 -1
- package/build/__tests__/unit/logs.test.js +9 -0
- package/build/__tests__/unit/logs.test.js.map +1 -1
- package/build/core/connection.d.ts +23 -2
- package/build/core/connection.d.ts.map +1 -1
- package/build/core/connection.js +177 -24
- package/build/core/connection.js.map +1 -1
- package/build/core/index.d.ts +3 -3
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +2 -2
- package/build/core/index.js.map +1 -1
- package/build/core/logs.d.ts +1 -0
- package/build/core/logs.d.ts.map +1 -1
- package/build/core/logs.js +5 -0
- package/build/core/logs.js.map +1 -1
- package/build/core/state.d.ts +16 -2
- package/build/core/state.d.ts.map +1 -1
- package/build/core/state.js +34 -6
- package/build/core/state.js.map +1 -1
- package/build/core/telemetry.d.ts +4 -1
- package/build/core/telemetry.d.ts.map +1 -1
- package/build/core/telemetry.js +51 -2
- package/build/core/telemetry.js.map +1 -1
- package/build/index.js +106 -12
- package/build/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jest, describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from "@jest/globals";
|
|
2
2
|
import { connectToDevice } from "../../core/connection.js";
|
|
3
3
|
import { checkAndEnsureConnection, getPassiveConnectionStatus } from "../../core/connection.js";
|
|
4
|
-
import { connectedApps, pendingExecutions, updateLastCDPMessageTime } from "../../core/state.js";
|
|
4
|
+
import { connectedApps, pendingExecutions, updateLastCDPMessageTime, clearAllCDPMessageTimes } from "../../core/state.js";
|
|
5
5
|
import { FakeCDPServer } from "../helpers/fake-cdp-server.js";
|
|
6
6
|
describe("Connection health (integration)", () => {
|
|
7
7
|
let server;
|
|
@@ -20,7 +20,7 @@ describe("Connection health (integration)", () => {
|
|
|
20
20
|
connectedApps.delete(key);
|
|
21
21
|
}
|
|
22
22
|
pendingExecutions.clear();
|
|
23
|
-
|
|
23
|
+
clearAllCDPMessageTimes();
|
|
24
24
|
});
|
|
25
25
|
afterEach(async () => {
|
|
26
26
|
const closePromises = [];
|
|
@@ -68,7 +68,7 @@ describe("Connection health (integration)", () => {
|
|
|
68
68
|
reconnectionConfig: { enabled: false, maxAttempts: 0, initialDelayMs: 0, maxDelayMs: 0, backoffMultiplier: 1 },
|
|
69
69
|
});
|
|
70
70
|
// Simulate recent CDP activity
|
|
71
|
-
updateLastCDPMessageTime(new Date());
|
|
71
|
+
updateLastCDPMessageTime(`${port}-test-device`, new Date());
|
|
72
72
|
const status = getPassiveConnectionStatus();
|
|
73
73
|
expect(status.connected).toBe(true);
|
|
74
74
|
expect(status.reason).toBe("ok");
|
|
@@ -89,12 +89,18 @@ describe("Connection health (integration)", () => {
|
|
|
89
89
|
reconnectionConfig: { enabled: false, maxAttempts: 0, initialDelayMs: 0, maxDelayMs: 0, backoffMultiplier: 1 },
|
|
90
90
|
});
|
|
91
91
|
// Set last activity to 60 seconds ago
|
|
92
|
-
updateLastCDPMessageTime(new Date(Date.now() - 60_000));
|
|
92
|
+
updateLastCDPMessageTime(`${port}-test-device`, new Date(Date.now() - 60_000));
|
|
93
93
|
const status = getPassiveConnectionStatus();
|
|
94
94
|
expect(status.connected).toBe(true);
|
|
95
95
|
expect(status.needsPing).toBe(true);
|
|
96
96
|
expect(status.reason).toBe("activity_stale");
|
|
97
97
|
});
|
|
98
|
+
it("checks specific device when appKey is provided", () => {
|
|
99
|
+
// With no connections, should return no_connection regardless of appKey
|
|
100
|
+
const result = getPassiveConnectionStatus("8081-somedevice");
|
|
101
|
+
expect(result.connected).toBe(false);
|
|
102
|
+
expect(result.reason).toBe("no_connection");
|
|
103
|
+
});
|
|
98
104
|
it("returns no_activity when connected but no CDP messages ever received", async () => {
|
|
99
105
|
server = new FakeCDPServer();
|
|
100
106
|
const port = await server.start();
|
|
@@ -112,7 +118,7 @@ describe("Connection health (integration)", () => {
|
|
|
112
118
|
});
|
|
113
119
|
// Note: handleCDPMessage will fire for enable responses, which updates timestamp
|
|
114
120
|
// Reset it to null to simulate the "never received" case
|
|
115
|
-
|
|
121
|
+
clearAllCDPMessageTimes();
|
|
116
122
|
const status = getPassiveConnectionStatus();
|
|
117
123
|
expect(status.connected).toBe(false);
|
|
118
124
|
expect(status.reason).toBe("no_activity");
|
|
@@ -140,7 +146,7 @@ describe("Connection health (integration)", () => {
|
|
|
140
146
|
await connectToDevice(device, port, {
|
|
141
147
|
reconnectionConfig: { enabled: false, maxAttempts: 0, initialDelayMs: 0, maxDelayMs: 0, backoffMultiplier: 1 },
|
|
142
148
|
});
|
|
143
|
-
updateLastCDPMessageTime(new Date());
|
|
149
|
+
updateLastCDPMessageTime(`${port}-test-device`, new Date());
|
|
144
150
|
const result = await checkAndEnsureConnection();
|
|
145
151
|
expect(result.connected).toBe(true);
|
|
146
152
|
expect(result.wasReconnected).toBe(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-health.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/connection-health.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"connection-health.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/connection-health.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach } from "@jest/globals";
|
|
2
|
-
import { getLastCDPMessageTime, updateLastCDPMessageTime } from "../../core/state.js";
|
|
3
|
-
describe("lastCDPMessageAt tracking", () => {
|
|
2
|
+
import { getLastCDPMessageTime, updateLastCDPMessageTime, clearLastCDPMessageTime, clearAllCDPMessageTimes, } from "../../core/state.js";
|
|
3
|
+
describe("lastCDPMessageAt tracking (per-device)", () => {
|
|
4
4
|
beforeEach(() => {
|
|
5
|
-
|
|
5
|
+
clearAllCDPMessageTimes();
|
|
6
6
|
});
|
|
7
|
-
it("
|
|
7
|
+
it("returns null for unknown appKey", () => {
|
|
8
|
+
expect(getLastCDPMessageTime("8081-device1")).toBeNull();
|
|
9
|
+
});
|
|
10
|
+
it("returns null when called with no appKey (global fallback)", () => {
|
|
8
11
|
expect(getLastCDPMessageTime()).toBeNull();
|
|
9
12
|
});
|
|
10
|
-
it("updates
|
|
13
|
+
it("updates per appKey", () => {
|
|
11
14
|
const now = new Date();
|
|
12
|
-
updateLastCDPMessageTime(now);
|
|
13
|
-
expect(getLastCDPMessageTime()).toBe(now);
|
|
15
|
+
updateLastCDPMessageTime("8081-device1", now);
|
|
16
|
+
expect(getLastCDPMessageTime("8081-device1")).toBe(now);
|
|
17
|
+
expect(getLastCDPMessageTime("8081-device2")).toBeNull();
|
|
18
|
+
});
|
|
19
|
+
it("global fallback returns most recent across all devices", () => {
|
|
20
|
+
const older = new Date("2026-01-01");
|
|
21
|
+
const newer = new Date("2026-01-02");
|
|
22
|
+
updateLastCDPMessageTime("8081-device1", older);
|
|
23
|
+
updateLastCDPMessageTime("8081-device2", newer);
|
|
24
|
+
expect(getLastCDPMessageTime()).toEqual(newer);
|
|
14
25
|
});
|
|
15
|
-
it("
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
updateLastCDPMessageTime(second);
|
|
20
|
-
expect(getLastCDPMessageTime()).toBe(second);
|
|
26
|
+
it("clearLastCDPMessageTime removes a specific device", () => {
|
|
27
|
+
updateLastCDPMessageTime("8081-device1", new Date());
|
|
28
|
+
clearLastCDPMessageTime("8081-device1");
|
|
29
|
+
expect(getLastCDPMessageTime("8081-device1")).toBeNull();
|
|
21
30
|
});
|
|
22
|
-
it("
|
|
23
|
-
updateLastCDPMessageTime(new Date());
|
|
24
|
-
updateLastCDPMessageTime(
|
|
31
|
+
it("clearAllCDPMessageTimes removes all entries", () => {
|
|
32
|
+
updateLastCDPMessageTime("8081-device1", new Date());
|
|
33
|
+
updateLastCDPMessageTime("8081-device2", new Date());
|
|
34
|
+
clearAllCDPMessageTimes();
|
|
25
35
|
expect(getLastCDPMessageTime()).toBeNull();
|
|
26
36
|
});
|
|
27
37
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-health.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/connection-health.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"connection-health.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/connection-health.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EACH,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACpD,UAAU,CAAC,GAAG,EAAE;QACZ,uBAAuB,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,wBAAwB,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC9C,MAAM,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,MAAM,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,wBAAwB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAChD,wBAAwB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,wBAAwB,CAAC,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,uBAAuB,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,wBAAwB,CAAC,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,wBAAwB,CAAC,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,uBAAuB,EAAE,CAAC;QAC1B,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -69,6 +69,15 @@ describe("LogBuffer", () => {
|
|
|
69
69
|
expect(cleared).toBe(2);
|
|
70
70
|
expect(buffer.size).toBe(0);
|
|
71
71
|
});
|
|
72
|
+
it("removeByText removes matching entries", () => {
|
|
73
|
+
buffer.add(makeLog("normal log"));
|
|
74
|
+
buffer.add(makeLog("__rn_devtools_health_12345"));
|
|
75
|
+
buffer.add(makeLog("another log"));
|
|
76
|
+
const removed = buffer.removeByText("__rn_devtools_health_");
|
|
77
|
+
expect(removed).toBe(1);
|
|
78
|
+
expect(buffer.size).toBe(2);
|
|
79
|
+
expect(buffer.getAll().every(l => !l.message.includes("__rn_devtools_health_"))).toBe(true);
|
|
80
|
+
});
|
|
72
81
|
});
|
|
73
82
|
describe("mapConsoleType", () => {
|
|
74
83
|
it("maps error to error", () => expect(mapConsoleType("error")).toBe("error"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/logs.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/logs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,27 @@ export declare function hasConnectedApp(): boolean;
|
|
|
30
30
|
* Returns true if the context can execute code, false otherwise
|
|
31
31
|
*/
|
|
32
32
|
export declare function runQuickHealthCheck(app: ConnectedApp): Promise<boolean>;
|
|
33
|
+
export interface LogPipelineResult {
|
|
34
|
+
ok: boolean;
|
|
35
|
+
recovered: boolean;
|
|
36
|
+
message: string | null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* End-to-end log pipeline verification with automatic recovery.
|
|
40
|
+
*
|
|
41
|
+
* 1. Injects a sentinel console.log via CDP and verifies it appears in the buffer.
|
|
42
|
+
* 2. If the marker doesn't arrive, attempts recovery:
|
|
43
|
+
* a. Re-sends Runtime.enable + Log.enable (fixes missing domain subscription)
|
|
44
|
+
* b. Retries the marker once
|
|
45
|
+
* 3. If still broken, force-reconnects via ensureConnection and retries.
|
|
46
|
+
*
|
|
47
|
+
* Returns { ok, recovered, message } — the caller decides what to show.
|
|
48
|
+
*/
|
|
49
|
+
export declare function verifyLogPipeline(app: ConnectedApp): Promise<LogPipelineResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Check if a log message is a health check marker (for filtering from output).
|
|
52
|
+
*/
|
|
53
|
+
export declare function isHealthCheckMarker(message: string): boolean;
|
|
33
54
|
/**
|
|
34
55
|
* Ensure a healthy connection to a React Native app
|
|
35
56
|
* This will verify or establish a connection, optionally running a health check
|
|
@@ -44,6 +65,6 @@ export interface PassiveConnectionStatus {
|
|
|
44
65
|
needsPing: boolean;
|
|
45
66
|
reason: "ok" | "no_connection" | "context_stale" | "no_activity" | "activity_stale";
|
|
46
67
|
}
|
|
47
|
-
export declare function getPassiveConnectionStatus(): PassiveConnectionStatus;
|
|
48
|
-
export declare function checkAndEnsureConnection(): Promise<ConnectionCheckResult>;
|
|
68
|
+
export declare function getPassiveConnectionStatus(targetAppKey?: string): PassiveConnectionStatus;
|
|
69
|
+
export declare function checkAndEnsureConnection(device?: string): Promise<ConnectionCheckResult>;
|
|
49
70
|
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/core/connection.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAoB,YAAY,EAAkB,cAAc,EAAsB,sBAAsB,EAAmB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAqC1M;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AA4BD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4B/D;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/core/connection.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAoB,YAAY,EAAkB,cAAc,EAAsB,sBAAsB,EAAmB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAqC1M;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/D;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AA4BD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4B/D;AA2RD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,SAAS,GAAG,IAAI,CAoR3G;AAGD,wBAAsB,eAAe,CACjC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAmB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAoPjB;AAkFD,wBAAgB,gBAAgB,IAAI,KAAK,CAAC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,YAAY,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACxB,CAAC,CAMD;AAGD,wBAAgB,oBAAoB,IAAI,YAAY,GAAG,IAAI,CAW1D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CA2B5E;AAGD,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CA4C7E;AAqCD,MAAM,WAAW,iBAAiB;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsErF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5D;AAUD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,GAAE;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAmJvC;AAED,MAAM,WAAW,uBAAuB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,IAAI,GAAG,eAAe,GAAG,eAAe,GAAG,aAAa,GAAG,gBAAgB,CAAC;CACvF;AAED,wBAAgB,0BAA0B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAmDzF;AAED,wBAAsB,wBAAwB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgD9F"}
|
package/build/core/connection.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import WebSocket from "ws";
|
|
2
|
-
import { connectedApps, pendingExecutions, getNextMessageId, getLogBuffer, getNetworkBuffer, setActiveSimulatorUdid, clearActiveSimulatorIfSource, updateLastCDPMessageTime, getLastCDPMessageTime } from "./state.js";
|
|
2
|
+
import { connectedApps, pendingExecutions, getNextMessageId, getLogBuffer, getNetworkBuffer, setActiveSimulatorUdid, clearActiveSimulatorIfSource, updateLastCDPMessageTime, getLastCDPMessageTime, clearLastCDPMessageTime } from "./state.js";
|
|
3
3
|
import { mapConsoleType } from "./logs.js";
|
|
4
4
|
import { injectNetworkInterceptor, sendNetworkEnable, isInterceptorEvent, applyInterceptedEvent } from "./networkInterceptor.js";
|
|
5
5
|
import { findSimulatorByName } from "./ios.js";
|
|
@@ -171,6 +171,10 @@ function formatPreview(preview) {
|
|
|
171
171
|
}
|
|
172
172
|
// Format a single CDP console argument (sync — without object resolution)
|
|
173
173
|
function formatConsoleArg(arg) {
|
|
174
|
+
// Explicit undefined (matches browser: console.log(undefined) → "undefined")
|
|
175
|
+
if (arg.type === "undefined") {
|
|
176
|
+
return "undefined";
|
|
177
|
+
}
|
|
174
178
|
// Primitives
|
|
175
179
|
if (arg.type === "string" || arg.type === "number" || arg.type === "boolean") {
|
|
176
180
|
return String(arg.value);
|
|
@@ -187,7 +191,11 @@ function formatConsoleArg(arg) {
|
|
|
187
191
|
if (arg.description) {
|
|
188
192
|
return arg.description;
|
|
189
193
|
}
|
|
190
|
-
|
|
194
|
+
// Object without any resolved data
|
|
195
|
+
if (arg.type === "object") {
|
|
196
|
+
return "[Object]";
|
|
197
|
+
}
|
|
198
|
+
return `[${arg.type || "unknown"}]`;
|
|
191
199
|
}
|
|
192
200
|
// Fetch object properties via CDP Runtime.getProperties
|
|
193
201
|
function fetchObjectProperties(ws, objectId, depth = 2) {
|
|
@@ -307,8 +315,11 @@ async function resolveConsoleArgs(ws, args) {
|
|
|
307
315
|
}
|
|
308
316
|
// Handle CDP messages
|
|
309
317
|
export function handleCDPMessage(message, device, ws) {
|
|
310
|
-
// Track last CDP activity for connection liveness detection
|
|
311
|
-
|
|
318
|
+
// Track last CDP activity for connection liveness detection (per-device)
|
|
319
|
+
const cdpAppKey = findAppKeyForDevice(device);
|
|
320
|
+
if (cdpAppKey) {
|
|
321
|
+
updateLastCDPMessageTime(cdpAppKey, new Date());
|
|
322
|
+
}
|
|
312
323
|
const deviceName = device.deviceName || device.title || "unknown";
|
|
313
324
|
// Handle responses to our requests (e.g., Runtime.evaluate)
|
|
314
325
|
if (typeof message.id === "number") {
|
|
@@ -387,25 +398,21 @@ export function handleCDPMessage(message, device, ws) {
|
|
|
387
398
|
if (hasObjectArgs) {
|
|
388
399
|
// Resolve object args asynchronously via CDP
|
|
389
400
|
resolveConsoleArgs(ws, args).then((messageText) => {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
});
|
|
397
|
-
}
|
|
401
|
+
getLogBuffer(deviceName).add({
|
|
402
|
+
timestamp: new Date(),
|
|
403
|
+
level,
|
|
404
|
+
message: messageText || "[console call with empty resolution]",
|
|
405
|
+
args: args.map((a) => a.value)
|
|
406
|
+
});
|
|
398
407
|
}).catch(() => {
|
|
399
408
|
// Fallback to sync formatting on error
|
|
400
409
|
const messageText = args.map(formatConsoleArg).join(" ");
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
});
|
|
408
|
-
}
|
|
410
|
+
getLogBuffer(deviceName).add({
|
|
411
|
+
timestamp: new Date(),
|
|
412
|
+
level,
|
|
413
|
+
message: messageText || "[console call with unresolvable args]",
|
|
414
|
+
args: args.map((a) => a.value)
|
|
415
|
+
});
|
|
409
416
|
});
|
|
410
417
|
}
|
|
411
418
|
else {
|
|
@@ -654,6 +661,7 @@ export async function connectToDevice(device, port, options = {}) {
|
|
|
654
661
|
// Release connection lock if still held
|
|
655
662
|
connectionLocks.delete(appKey);
|
|
656
663
|
connectedApps.delete(appKey);
|
|
664
|
+
clearLastCDPMessageTime(appKey);
|
|
657
665
|
// Clear active simulator UDID if this connection set it
|
|
658
666
|
clearActiveSimulatorIfSource(appKey);
|
|
659
667
|
// Keep log and network buffers across reconnections
|
|
@@ -692,6 +700,7 @@ export async function connectToDevice(device, port, options = {}) {
|
|
|
692
700
|
// Cancel any pending reconnection timer to prevent orphaned loops
|
|
693
701
|
cancelReconnectionTimer(appKey);
|
|
694
702
|
connectedApps.delete(appKey);
|
|
703
|
+
clearLastCDPMessageTime(appKey);
|
|
695
704
|
// Clear active simulator UDID if this connection set it
|
|
696
705
|
clearActiveSimulatorIfSource(appKey);
|
|
697
706
|
// Extract error message safely - some WebSocket errors may not have a message
|
|
@@ -887,6 +896,115 @@ export async function runQuickHealthCheck(app) {
|
|
|
887
896
|
}
|
|
888
897
|
});
|
|
889
898
|
}
|
|
899
|
+
const LOG_PIPELINE_MARKER_PREFIX = "__rn_devtools_health_";
|
|
900
|
+
/**
|
|
901
|
+
* Inject a sentinel console.log via CDP and wait for it to appear in the log buffer.
|
|
902
|
+
* Returns true if the marker arrives within TIMEOUT_MS.
|
|
903
|
+
*/
|
|
904
|
+
async function sendAndWaitForMarker(app, buffer) {
|
|
905
|
+
const marker = `${LOG_PIPELINE_MARKER_PREFIX}${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
906
|
+
const TIMEOUT_MS = 3000;
|
|
907
|
+
try {
|
|
908
|
+
app.ws.send(JSON.stringify({
|
|
909
|
+
id: getNextMessageId(),
|
|
910
|
+
method: "Runtime.evaluate",
|
|
911
|
+
params: { expression: `console.log("${marker}")`, returnByValue: true },
|
|
912
|
+
}));
|
|
913
|
+
}
|
|
914
|
+
catch {
|
|
915
|
+
return false;
|
|
916
|
+
}
|
|
917
|
+
// Poll the buffer for the marker (check every 50ms, up to TIMEOUT_MS)
|
|
918
|
+
const startTime = Date.now();
|
|
919
|
+
while (Date.now() - startTime < TIMEOUT_MS) {
|
|
920
|
+
if (buffer.getAll().some(entry => entry.message.includes(marker))) {
|
|
921
|
+
buffer.removeByText(marker);
|
|
922
|
+
return true;
|
|
923
|
+
}
|
|
924
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
925
|
+
}
|
|
926
|
+
return false;
|
|
927
|
+
}
|
|
928
|
+
/**
|
|
929
|
+
* End-to-end log pipeline verification with automatic recovery.
|
|
930
|
+
*
|
|
931
|
+
* 1. Injects a sentinel console.log via CDP and verifies it appears in the buffer.
|
|
932
|
+
* 2. If the marker doesn't arrive, attempts recovery:
|
|
933
|
+
* a. Re-sends Runtime.enable + Log.enable (fixes missing domain subscription)
|
|
934
|
+
* b. Retries the marker once
|
|
935
|
+
* 3. If still broken, force-reconnects via ensureConnection and retries.
|
|
936
|
+
*
|
|
937
|
+
* Returns { ok, recovered, message } — the caller decides what to show.
|
|
938
|
+
*/
|
|
939
|
+
export async function verifyLogPipeline(app) {
|
|
940
|
+
const deviceName = app.deviceInfo.deviceName || app.deviceInfo.title || "unknown";
|
|
941
|
+
const buffer = getLogBuffer(deviceName);
|
|
942
|
+
// --- Attempt 1: quick check ---
|
|
943
|
+
if (await sendAndWaitForMarker(app, buffer)) {
|
|
944
|
+
return { ok: true, recovered: false, message: null };
|
|
945
|
+
}
|
|
946
|
+
// --- Attempt 2: re-enable Runtime/Log domains and retry ---
|
|
947
|
+
try {
|
|
948
|
+
app.ws.send(JSON.stringify({ id: getNextMessageId(), method: "Runtime.enable" }));
|
|
949
|
+
app.ws.send(JSON.stringify({ id: getNextMessageId(), method: "Log.enable" }));
|
|
950
|
+
}
|
|
951
|
+
catch {
|
|
952
|
+
// WS send failed — fall through to reconnect
|
|
953
|
+
}
|
|
954
|
+
// Brief pause for domain activation
|
|
955
|
+
await new Promise(resolve => setTimeout(resolve, 300));
|
|
956
|
+
if (await sendAndWaitForMarker(app, buffer)) {
|
|
957
|
+
return { ok: true, recovered: true, message: "[CONNECTION] Log pipeline was stale — re-enabled CDP domains. Logs are flowing again." };
|
|
958
|
+
}
|
|
959
|
+
// --- Attempt 3: force reconnect and retry ---
|
|
960
|
+
const appKey = `${app.port}-${app.deviceInfo.id}`;
|
|
961
|
+
const port = app.port;
|
|
962
|
+
cancelReconnectionTimer(appKey);
|
|
963
|
+
try {
|
|
964
|
+
app.ws.close();
|
|
965
|
+
}
|
|
966
|
+
catch { /* ignore */ }
|
|
967
|
+
connectedApps.delete(appKey);
|
|
968
|
+
const result = await ensureConnection({ port, forceRefresh: false, healthCheck: true });
|
|
969
|
+
if (!result.connected || !result.healthCheckPassed) {
|
|
970
|
+
return {
|
|
971
|
+
ok: false,
|
|
972
|
+
recovered: false,
|
|
973
|
+
message: "[CONNECTION] Log pipeline broken and reconnection failed. Ensure the app is running, then call scan_metro.",
|
|
974
|
+
};
|
|
975
|
+
}
|
|
976
|
+
// Wait for the new connection to settle
|
|
977
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
978
|
+
// Get the fresh app reference after reconnection
|
|
979
|
+
const freshApp = getFirstConnectedApp();
|
|
980
|
+
if (!freshApp) {
|
|
981
|
+
return {
|
|
982
|
+
ok: false,
|
|
983
|
+
recovered: false,
|
|
984
|
+
message: "[CONNECTION] Reconnected but no app available. Call scan_metro.",
|
|
985
|
+
};
|
|
986
|
+
}
|
|
987
|
+
const freshDeviceName = freshApp.deviceInfo.deviceName || freshApp.deviceInfo.title || "unknown";
|
|
988
|
+
const freshBuffer = getLogBuffer(freshDeviceName);
|
|
989
|
+
if (await sendAndWaitForMarker(freshApp, freshBuffer)) {
|
|
990
|
+
return {
|
|
991
|
+
ok: true,
|
|
992
|
+
recovered: true,
|
|
993
|
+
message: "[CONNECTION] Log pipeline was broken — reconnected and verified. Logs are flowing again.",
|
|
994
|
+
};
|
|
995
|
+
}
|
|
996
|
+
return {
|
|
997
|
+
ok: false,
|
|
998
|
+
recovered: false,
|
|
999
|
+
message: "[WARNING] Log pipeline verification failed after reconnection. Console events are not reaching the buffer. Try reload_app or scan_metro.",
|
|
1000
|
+
};
|
|
1001
|
+
}
|
|
1002
|
+
/**
|
|
1003
|
+
* Check if a log message is a health check marker (for filtering from output).
|
|
1004
|
+
*/
|
|
1005
|
+
export function isHealthCheckMarker(message) {
|
|
1006
|
+
return message.includes(LOG_PIPELINE_MARKER_PREFIX);
|
|
1007
|
+
}
|
|
890
1008
|
/**
|
|
891
1009
|
* Find the first available Metro port
|
|
892
1010
|
*/
|
|
@@ -1038,7 +1156,28 @@ export async function ensureConnection(options = {}) {
|
|
|
1038
1156
|
}),
|
|
1039
1157
|
};
|
|
1040
1158
|
}
|
|
1041
|
-
export function getPassiveConnectionStatus() {
|
|
1159
|
+
export function getPassiveConnectionStatus(targetAppKey) {
|
|
1160
|
+
if (targetAppKey) {
|
|
1161
|
+
// Check a specific device's connection
|
|
1162
|
+
const app = connectedApps.get(targetAppKey);
|
|
1163
|
+
if (!app || app.ws.readyState !== WebSocket.OPEN) {
|
|
1164
|
+
return { connected: false, needsPing: false, reason: "no_connection" };
|
|
1165
|
+
}
|
|
1166
|
+
const health = getContextHealth(targetAppKey);
|
|
1167
|
+
if (health?.isStale) {
|
|
1168
|
+
return { connected: false, needsPing: false, reason: "context_stale" };
|
|
1169
|
+
}
|
|
1170
|
+
const lastMessage = getLastCDPMessageTime(targetAppKey);
|
|
1171
|
+
if (!lastMessage) {
|
|
1172
|
+
return { connected: false, needsPing: false, reason: "no_activity" };
|
|
1173
|
+
}
|
|
1174
|
+
const elapsed = Date.now() - lastMessage.getTime();
|
|
1175
|
+
if (elapsed > STALE_ACTIVITY_THRESHOLD_MS) {
|
|
1176
|
+
return { connected: true, needsPing: true, reason: "activity_stale" };
|
|
1177
|
+
}
|
|
1178
|
+
return { connected: true, needsPing: false, reason: "ok" };
|
|
1179
|
+
}
|
|
1180
|
+
// Default: check first connected app (backwards compatible)
|
|
1042
1181
|
if (!hasConnectedApp()) {
|
|
1043
1182
|
return { connected: false, needsPing: false, reason: "no_connection" };
|
|
1044
1183
|
}
|
|
@@ -1060,13 +1199,27 @@ export function getPassiveConnectionStatus() {
|
|
|
1060
1199
|
}
|
|
1061
1200
|
return { connected: true, needsPing: false, reason: "ok" };
|
|
1062
1201
|
}
|
|
1063
|
-
export async function checkAndEnsureConnection() {
|
|
1064
|
-
|
|
1202
|
+
export async function checkAndEnsureConnection(device) {
|
|
1203
|
+
// Resolve targeted device to appKey if specified
|
|
1204
|
+
let targetAppKey;
|
|
1205
|
+
let targetApp = null;
|
|
1206
|
+
if (device) {
|
|
1207
|
+
try {
|
|
1208
|
+
targetApp = getConnectedAppByDevice(device);
|
|
1209
|
+
if (targetApp) {
|
|
1210
|
+
targetAppKey = `${targetApp.port}-${targetApp.deviceInfo.id}`;
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
catch {
|
|
1214
|
+
// Device not found — fall through to reconnection
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
const passive = getPassiveConnectionStatus(targetAppKey);
|
|
1065
1218
|
if (passive.connected && !passive.needsPing) {
|
|
1066
1219
|
return { connected: true, wasReconnected: false, message: null };
|
|
1067
1220
|
}
|
|
1068
1221
|
if (passive.connected && passive.needsPing) {
|
|
1069
|
-
const app = getFirstConnectedApp();
|
|
1222
|
+
const app = targetApp ?? getFirstConnectedApp();
|
|
1070
1223
|
if (app) {
|
|
1071
1224
|
const healthy = await runQuickHealthCheck(app);
|
|
1072
1225
|
if (healthy) {
|