execbro 1.10.24 → 1.11.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/README.md +1 -1
- package/build/__tests__/helpers/fake-cdp-server.d.ts +9 -0
- package/build/__tests__/helpers/fake-cdp-server.d.ts.map +1 -1
- package/build/__tests__/helpers/fake-cdp-server.js +20 -2
- package/build/__tests__/helpers/fake-cdp-server.js.map +1 -1
- package/build/__tests__/integration/connection-health.test.js +8 -1
- package/build/__tests__/integration/connection-health.test.js.map +1 -1
- package/build/__tests__/integration/native-logs.test.d.ts +2 -0
- package/build/__tests__/integration/native-logs.test.d.ts.map +1 -0
- package/build/__tests__/integration/native-logs.test.js +39 -0
- package/build/__tests__/integration/native-logs.test.js.map +1 -0
- package/build/__tests__/integration/socket-close-midflight.test.d.ts +2 -0
- package/build/__tests__/integration/socket-close-midflight.test.d.ts.map +1 -0
- package/build/__tests__/integration/socket-close-midflight.test.js +106 -0
- package/build/__tests__/integration/socket-close-midflight.test.js.map +1 -0
- package/build/__tests__/integration/stale-target-probe.test.d.ts +2 -0
- package/build/__tests__/integration/stale-target-probe.test.d.ts.map +1 -0
- package/build/__tests__/integration/stale-target-probe.test.js +85 -0
- package/build/__tests__/integration/stale-target-probe.test.js.map +1 -0
- package/build/__tests__/unit/clearLogsNative.test.d.ts +2 -0
- package/build/__tests__/unit/clearLogsNative.test.d.ts.map +1 -0
- package/build/__tests__/unit/clearLogsNative.test.js +43 -0
- package/build/__tests__/unit/clearLogsNative.test.js.map +1 -0
- package/build/__tests__/unit/componentFormatNaming.test.d.ts +2 -0
- package/build/__tests__/unit/componentFormatNaming.test.d.ts.map +1 -0
- package/build/__tests__/unit/componentFormatNaming.test.js +32 -0
- package/build/__tests__/unit/componentFormatNaming.test.js.map +1 -0
- package/build/__tests__/unit/deviceResolution.test.d.ts +2 -0
- package/build/__tests__/unit/deviceResolution.test.d.ts.map +1 -0
- package/build/__tests__/unit/deviceResolution.test.js +108 -0
- package/build/__tests__/unit/deviceResolution.test.js.map +1 -0
- package/build/__tests__/unit/executor.test.js +48 -12
- package/build/__tests__/unit/executor.test.js.map +1 -1
- package/build/__tests__/unit/getLogsEmptyContract.test.d.ts +2 -0
- package/build/__tests__/unit/getLogsEmptyContract.test.d.ts.map +1 -0
- package/build/__tests__/unit/getLogsEmptyContract.test.js +112 -0
- package/build/__tests__/unit/getLogsEmptyContract.test.js.map +1 -0
- package/build/__tests__/unit/getLogsNativeSource.test.d.ts +2 -0
- package/build/__tests__/unit/getLogsNativeSource.test.d.ts.map +1 -0
- package/build/__tests__/unit/getLogsNativeSource.test.js +138 -0
- package/build/__tests__/unit/getLogsNativeSource.test.js.map +1 -0
- package/build/__tests__/unit/jsLogEvents.test.d.ts +2 -0
- package/build/__tests__/unit/jsLogEvents.test.d.ts.map +1 -0
- package/build/__tests__/unit/jsLogEvents.test.js +58 -0
- package/build/__tests__/unit/jsLogEvents.test.js.map +1 -0
- package/build/__tests__/unit/logDiagnosis.test.d.ts +2 -0
- package/build/__tests__/unit/logDiagnosis.test.d.ts.map +1 -0
- package/build/__tests__/unit/logDiagnosis.test.js +81 -0
- package/build/__tests__/unit/logDiagnosis.test.js.map +1 -0
- package/build/__tests__/unit/logEventFormat.test.d.ts +2 -0
- package/build/__tests__/unit/logEventFormat.test.d.ts.map +1 -0
- package/build/__tests__/unit/logEventFormat.test.js +210 -0
- package/build/__tests__/unit/logEventFormat.test.js.map +1 -0
- package/build/__tests__/unit/logEvents.test.d.ts +2 -0
- package/build/__tests__/unit/logEvents.test.d.ts.map +1 -0
- package/build/__tests__/unit/logEvents.test.js +118 -0
- package/build/__tests__/unit/logEvents.test.js.map +1 -0
- package/build/__tests__/unit/logGrouping.test.d.ts +2 -0
- package/build/__tests__/unit/logGrouping.test.d.ts.map +1 -0
- package/build/__tests__/unit/logGrouping.test.js +104 -0
- package/build/__tests__/unit/logGrouping.test.js.map +1 -0
- package/build/__tests__/unit/logOwnership.test.d.ts +2 -0
- package/build/__tests__/unit/logOwnership.test.d.ts.map +1 -0
- package/build/__tests__/unit/logOwnership.test.js +118 -0
- package/build/__tests__/unit/logOwnership.test.js.map +1 -0
- package/build/__tests__/unit/logRelevance.test.d.ts +2 -0
- package/build/__tests__/unit/logRelevance.test.d.ts.map +1 -0
- package/build/__tests__/unit/logRelevance.test.js +30 -0
- package/build/__tests__/unit/logRelevance.test.js.map +1 -0
- package/build/__tests__/unit/logSourceAndroid.test.d.ts +2 -0
- package/build/__tests__/unit/logSourceAndroid.test.d.ts.map +1 -0
- package/build/__tests__/unit/logSourceAndroid.test.js +61 -0
- package/build/__tests__/unit/logSourceAndroid.test.js.map +1 -0
- package/build/__tests__/unit/logSourceIos.test.d.ts +2 -0
- package/build/__tests__/unit/logSourceIos.test.d.ts.map +1 -0
- package/build/__tests__/unit/logSourceIos.test.js +64 -0
- package/build/__tests__/unit/logSourceIos.test.js.map +1 -0
- package/build/__tests__/unit/logs.test.js +23 -0
- package/build/__tests__/unit/logs.test.js.map +1 -1
- package/build/__tests__/unit/nativeLogs.test.d.ts +2 -0
- package/build/__tests__/unit/nativeLogs.test.d.ts.map +1 -0
- package/build/__tests__/unit/nativeLogs.test.js +230 -0
- package/build/__tests__/unit/nativeLogs.test.js.map +1 -0
- package/build/__tests__/unit/pendingExecutions.test.d.ts +2 -0
- package/build/__tests__/unit/pendingExecutions.test.d.ts.map +1 -0
- package/build/__tests__/unit/pendingExecutions.test.js +70 -0
- package/build/__tests__/unit/pendingExecutions.test.js.map +1 -0
- package/build/__tests__/unit/reloadAppAutoConnect.test.d.ts +2 -0
- package/build/__tests__/unit/reloadAppAutoConnect.test.d.ts.map +1 -0
- package/build/__tests__/unit/reloadAppAutoConnect.test.js +63 -0
- package/build/__tests__/unit/reloadAppAutoConnect.test.js.map +1 -0
- package/build/__tests__/unit/toolsJson.test.js +11 -0
- package/build/__tests__/unit/toolsJson.test.js.map +1 -1
- package/build/__tests__/unit/transportClassify.test.js +108 -7
- package/build/__tests__/unit/transportClassify.test.js.map +1 -1
- package/build/core/componentSearch.d.ts +1 -1
- package/build/core/componentSearch.d.ts.map +1 -1
- package/build/core/componentSearch.js +8 -8
- package/build/core/componentSearch.js.map +1 -1
- package/build/core/componentTree.d.ts +1 -1
- package/build/core/componentTree.d.ts.map +1 -1
- package/build/core/componentTree.js +8 -8
- package/build/core/componentTree.js.map +1 -1
- package/build/core/connection.d.ts +30 -0
- package/build/core/connection.d.ts.map +1 -1
- package/build/core/connection.js +97 -28
- package/build/core/connection.js.map +1 -1
- package/build/core/debugGlobals.d.ts.map +1 -1
- package/build/core/debugGlobals.js +89 -32
- package/build/core/debugGlobals.js.map +1 -1
- package/build/core/errors.d.ts +7 -1
- package/build/core/errors.d.ts.map +1 -1
- package/build/core/errors.js +8 -1
- package/build/core/errors.js.map +1 -1
- package/build/core/guides.d.ts.map +1 -1
- package/build/core/guides.js +25 -0
- package/build/core/guides.js.map +1 -1
- package/build/core/index.d.ts +0 -2
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +0 -2
- package/build/core/index.js.map +1 -1
- package/build/core/jsExecute.d.ts +76 -1
- package/build/core/jsExecute.d.ts.map +1 -1
- package/build/core/jsExecute.js +193 -32
- package/build/core/jsExecute.js.map +1 -1
- package/build/core/jsLogEvents.d.ts +13 -0
- package/build/core/jsLogEvents.d.ts.map +1 -0
- package/build/core/jsLogEvents.js +65 -0
- package/build/core/jsLogEvents.js.map +1 -0
- package/build/core/logDiagnosis.d.ts +65 -0
- package/build/core/logDiagnosis.d.ts.map +1 -0
- package/build/core/logDiagnosis.js +51 -0
- package/build/core/logDiagnosis.js.map +1 -0
- package/build/core/logEventFormat.d.ts +14 -0
- package/build/core/logEventFormat.d.ts.map +1 -0
- package/build/core/logEventFormat.js +85 -0
- package/build/core/logEventFormat.js.map +1 -0
- package/build/core/logEvents.d.ts +115 -0
- package/build/core/logEvents.d.ts.map +1 -0
- package/build/core/logEvents.js +146 -0
- package/build/core/logEvents.js.map +1 -0
- package/build/core/logGrouping.d.ts +17 -0
- package/build/core/logGrouping.d.ts.map +1 -0
- package/build/core/logGrouping.js +134 -0
- package/build/core/logGrouping.js.map +1 -0
- package/build/core/logOwnership.d.ts +29 -0
- package/build/core/logOwnership.d.ts.map +1 -0
- package/build/core/logOwnership.js +83 -0
- package/build/core/logOwnership.js.map +1 -0
- package/build/core/logRelevance.d.ts +13 -0
- package/build/core/logRelevance.d.ts.map +1 -0
- package/build/core/logRelevance.js +23 -0
- package/build/core/logRelevance.js.map +1 -0
- package/build/core/logSourceAndroid.d.ts +27 -0
- package/build/core/logSourceAndroid.d.ts.map +1 -0
- package/build/core/logSourceAndroid.js +89 -0
- package/build/core/logSourceAndroid.js.map +1 -0
- package/build/core/logSourceIos.d.ts +26 -0
- package/build/core/logSourceIos.d.ts.map +1 -0
- package/build/core/logSourceIos.js +119 -0
- package/build/core/logSourceIos.js.map +1 -0
- package/build/core/logs.d.ts +5 -1
- package/build/core/logs.d.ts.map +1 -1
- package/build/core/logs.js +8 -1
- package/build/core/logs.js.map +1 -1
- package/build/core/nativeLogs.d.ts +75 -0
- package/build/core/nativeLogs.d.ts.map +1 -0
- package/build/core/nativeLogs.js +260 -0
- package/build/core/nativeLogs.js.map +1 -0
- package/build/core/register.d.ts.map +1 -1
- package/build/core/register.js +22 -6
- package/build/core/register.js.map +1 -1
- package/build/core/screenLayout.d.ts +1 -1
- package/build/core/screenLayout.d.ts.map +1 -1
- package/build/core/screenLayout.js +3 -3
- package/build/core/screenLayout.js.map +1 -1
- package/build/core/state.d.ts +10 -0
- package/build/core/state.d.ts.map +1 -1
- package/build/core/state.js +21 -0
- package/build/core/state.js.map +1 -1
- package/build/core/types.d.ts +11 -2
- package/build/core/types.d.ts.map +1 -1
- package/build/tools/componentTools.js +6 -6
- package/build/tools/componentTools.js.map +1 -1
- package/build/tools/connectionTools.d.ts.map +1 -1
- package/build/tools/connectionTools.js +7 -3
- package/build/tools/connectionTools.js.map +1 -1
- package/build/tools/executionTools.js +7 -7
- package/build/tools/executionTools.js.map +1 -1
- package/build/tools/logTools.d.ts +25 -0
- package/build/tools/logTools.d.ts.map +1 -1
- package/build/tools/logTools.js +316 -132
- package/build/tools/logTools.js.map +1 -1
- package/build/tools/networkTools.d.ts.map +1 -1
- package/build/tools/networkTools.js +65 -54
- package/build/tools/networkTools.js.map +1 -1
- package/package.json +5 -4
- package/tools.json +447 -0
- package/build/core/format.d.ts +0 -8
- package/build/core/format.d.ts.map +0 -1
- package/build/core/format.js +0 -34
- package/build/core/format.js.map +0 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tags whose lines are VERDICTS ABOUT an app rather than output FROM it.
|
|
3
|
+
*
|
|
4
|
+
* This allowlist is a hard gate, not a hint. Two measured traps make a bare
|
|
5
|
+
* "message contains the package name" rule wrong:
|
|
6
|
+
* - MMKV / nativeloader embed the package as a filesystem path
|
|
7
|
+
* - ActivityThread announces package changes from OTHER apps' pids
|
|
8
|
+
* Neither tag is listed, so the name check never runs for them.
|
|
9
|
+
*/
|
|
10
|
+
export const ANDROID_VERDICT_TAGS = new Set([
|
|
11
|
+
"ActivityManager",
|
|
12
|
+
"ActivityTaskManager",
|
|
13
|
+
"AndroidRuntime",
|
|
14
|
+
"DEBUG",
|
|
15
|
+
"lowmemorykiller",
|
|
16
|
+
"PackageManager",
|
|
17
|
+
"InputDispatcher",
|
|
18
|
+
]);
|
|
19
|
+
/** iOS equivalents: process termination and launch failure reporters. */
|
|
20
|
+
export const IOS_VERDICT_SUBSYSTEMS = new Set([
|
|
21
|
+
"com.apple.runningboard",
|
|
22
|
+
"com.apple.FrontBoard",
|
|
23
|
+
]);
|
|
24
|
+
/**
|
|
25
|
+
* Tags whose output is already carried by another source.
|
|
26
|
+
*
|
|
27
|
+
* React Native mirrors console.* into logcat under `ReactNativeJS`. Those lines
|
|
28
|
+
* are in the CDP console buffer too, so owning them here would double-report
|
|
29
|
+
* under source:"all" and bury crashes under ordinary app logging in
|
|
30
|
+
* source:"native". Keeping the two sources disjoint is what makes merging safe.
|
|
31
|
+
*/
|
|
32
|
+
const MIRRORED_TAGS = new Set(["ReactNativeJS"]);
|
|
33
|
+
function isVerdictSource(line, platform) {
|
|
34
|
+
if (platform === "android")
|
|
35
|
+
return ANDROID_VERDICT_TAGS.has(line.tag);
|
|
36
|
+
// iOS tags are "subsystem:category" — match on the subsystem half.
|
|
37
|
+
const subsystem = line.tag.split(":")[0];
|
|
38
|
+
return IOS_VERDICT_SUBSYSTEMS.has(subsystem);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Does the message name this package as a whole identifier?
|
|
42
|
+
*
|
|
43
|
+
* A bare `includes` would attribute `ANR in com.acme.app.dev` to
|
|
44
|
+
* `com.acme.app`. Debug and release variants differing only by a Gradle
|
|
45
|
+
* applicationIdSuffix are routinely installed side by side, so the shorter
|
|
46
|
+
* id being a prefix of the longer one is the normal case, not an edge case.
|
|
47
|
+
*/
|
|
48
|
+
function namesPackage(message, appId) {
|
|
49
|
+
const boundary = /[A-Za-z0-9_.]/;
|
|
50
|
+
let from = 0;
|
|
51
|
+
for (;;) {
|
|
52
|
+
const at = message.indexOf(appId, from);
|
|
53
|
+
if (at === -1)
|
|
54
|
+
return false;
|
|
55
|
+
const before = at === 0 ? "" : message[at - 1];
|
|
56
|
+
const after = message[at + appId.length] ?? "";
|
|
57
|
+
if (!boundary.test(before) && !boundary.test(after))
|
|
58
|
+
return true;
|
|
59
|
+
from = at + 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Decide whether a line belongs to the app under test. First match wins.
|
|
64
|
+
*
|
|
65
|
+
* Rule order matters: `declared` precedes `pid` because a tombstone is written
|
|
66
|
+
* by tombstoned's pid while naming the dead app as its subject, so pid
|
|
67
|
+
* matching would miss every crash — the exact case this feature exists for.
|
|
68
|
+
*/
|
|
69
|
+
export function isOwned(line, identity) {
|
|
70
|
+
if (MIRRORED_TAGS.has(line.tag))
|
|
71
|
+
return { owned: false };
|
|
72
|
+
if (line.subject && line.subject === identity.appId) {
|
|
73
|
+
return { owned: true, reason: "declared" };
|
|
74
|
+
}
|
|
75
|
+
if (identity.pid !== undefined && line.pid === identity.pid) {
|
|
76
|
+
return { owned: true, reason: "pid" };
|
|
77
|
+
}
|
|
78
|
+
if (isVerdictSource(line, identity.platform) && namesPackage(line.message, identity.appId)) {
|
|
79
|
+
return { owned: true, reason: "verdict" };
|
|
80
|
+
}
|
|
81
|
+
return { owned: false };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=logOwnership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logOwnership.js","sourceRoot":"","sources":["../../src/core/logOwnership.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IAC7D,iBAAiB;IACjB,qBAAqB;IACrB,gBAAgB;IAChB,OAAO;IACP,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;CACpB,CAAC,CAAC;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC;IAC/D,wBAAwB;IACxB,sBAAsB;CACzB,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;AAEtE,SAAS,eAAe,CAAC,IAAgB,EAAE,QAAiC;IACxE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtE,mEAAmE;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,OAAe,EAAE,KAAa;IAChD,MAAM,QAAQ,GAAG,eAAe,CAAC;IACjC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,SAAS,CAAC;QACN,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,EAAE,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjE,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;IAClB,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,IAAgB,EAAE,QAAqB;IAC3D,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,QAAQ,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC1D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type DraftEvent, type EventLevel } from "./logEvents.js";
|
|
2
|
+
/**
|
|
3
|
+
* Gate 2: is this event worth a row?
|
|
4
|
+
*
|
|
5
|
+
* Runs AFTER grouping, because it tests `kind` and only the grouper assigns
|
|
6
|
+
* that. The exemption matters: a backtrace's continuation lines carry no
|
|
7
|
+
* marker identifying them as part of a crash, so a floor applied to lines
|
|
8
|
+
* would shred exactly the events this feature exists to surface.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isRelevant(event: Pick<DraftEvent, "level" | "kind">, opts: {
|
|
11
|
+
minLevel: EventLevel;
|
|
12
|
+
}): boolean;
|
|
13
|
+
//# sourceMappingURL=logRelevance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logRelevance.d.ts","sourceRoot":"","sources":["../../src/core/logRelevance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,UAAU,EAAkB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAW9F;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACtB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,EACzC,IAAI,EAAE;IAAE,QAAQ,EAAE,UAAU,CAAA;CAAE,GAC/B,OAAO,CAGT"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LEVEL_RANK } from "./logEvents.js";
|
|
2
|
+
/**
|
|
3
|
+
* Kinds that are always worth a row, whatever their level.
|
|
4
|
+
*
|
|
5
|
+
* Typed by EventKind, not string: a typo here would silently disable the
|
|
6
|
+
* exemption that guarantees a severity floor can never filter out a crash,
|
|
7
|
+
* so it must fail the build rather than fail quietly.
|
|
8
|
+
*/
|
|
9
|
+
const ALWAYS = new Set(["crash", "anr"]);
|
|
10
|
+
/**
|
|
11
|
+
* Gate 2: is this event worth a row?
|
|
12
|
+
*
|
|
13
|
+
* Runs AFTER grouping, because it tests `kind` and only the grouper assigns
|
|
14
|
+
* that. The exemption matters: a backtrace's continuation lines carry no
|
|
15
|
+
* marker identifying them as part of a crash, so a floor applied to lines
|
|
16
|
+
* would shred exactly the events this feature exists to surface.
|
|
17
|
+
*/
|
|
18
|
+
export function isRelevant(event, opts) {
|
|
19
|
+
if (ALWAYS.has(event.kind))
|
|
20
|
+
return true;
|
|
21
|
+
return LEVEL_RANK[event.level] >= LEVEL_RANK[opts.minLevel];
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=logRelevance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logRelevance.js","sourceRoot":"","sources":["../../src/core/logRelevance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoD,MAAM,gBAAgB,CAAC;AAE9F;;;;;;GAMG;AACH,MAAM,MAAM,GAA2B,IAAI,GAAG,CAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAE5E;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACtB,KAAyC,EACzC,IAA8B;IAE9B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RawLogLine } from "./logEvents.js";
|
|
2
|
+
/**
|
|
3
|
+
* Build the logcat invocation.
|
|
4
|
+
*
|
|
5
|
+
* Filtering is pushed into adb rather than done in node: a full dump is
|
|
6
|
+
* 13.8 MB, and node's exec buffer is 1 MiB by default.
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildLogcatArgs(opts: {
|
|
9
|
+
serial?: string;
|
|
10
|
+
sinceTs?: Date;
|
|
11
|
+
pid?: number;
|
|
12
|
+
minPriority?: string;
|
|
13
|
+
/** Read ONLY the crash buffer — used when app identity is unknown. */
|
|
14
|
+
crashOnly?: boolean;
|
|
15
|
+
}): string;
|
|
16
|
+
export declare function parseLogcatEpoch(stdout: string): RawLogLine[];
|
|
17
|
+
export declare function fetchAndroidLines(opts: {
|
|
18
|
+
serial?: string;
|
|
19
|
+
sinceTs?: Date;
|
|
20
|
+
pid?: number;
|
|
21
|
+
minPriority?: string;
|
|
22
|
+
crashOnly?: boolean;
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
}): Promise<RawLogLine[]>;
|
|
25
|
+
/** Resolve the app's live pid, or undefined when it is not running. */
|
|
26
|
+
export declare function resolveAndroidPid(packageName: string, serial?: string, signal?: AbortSignal): Promise<number | undefined>;
|
|
27
|
+
//# sourceMappingURL=logSourceAndroid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logSourceAndroid.d.ts","sourceRoot":"","sources":["../../src/core/logSourceAndroid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAgC7D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,MAAM,CAWT;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAmB7D;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQxB;AAED,uEAAuE;AACvE,wBAAsB,iBAAiB,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAU7B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { execAsync, withCancelableTimeout } from "./exec.js";
|
|
2
|
+
/** A full dump is 13.8 MB; node's exec default is 1 MiB. */
|
|
3
|
+
const MAX_BUFFER = 32 * 1024 * 1024;
|
|
4
|
+
const FETCH_TIMEOUT_MS = 5000;
|
|
5
|
+
const PRIORITY = {
|
|
6
|
+
V: "debug",
|
|
7
|
+
D: "debug",
|
|
8
|
+
I: "info",
|
|
9
|
+
W: "warn",
|
|
10
|
+
E: "error",
|
|
11
|
+
F: "fatal",
|
|
12
|
+
};
|
|
13
|
+
// " 1785352265.203 1210 13886 I NearbyMediums: Wifi changed"
|
|
14
|
+
const LINE_RE = /^\s*(\d+\.\d+)\s+(\d+)\s+(\d+)\s+([VDIWEF])\s+([^:]*?)\s*:\s?(.*)$/;
|
|
15
|
+
const SUBJECT_PATTERNS = [
|
|
16
|
+
/^Cmdline:\s*(\S+)/,
|
|
17
|
+
/>>>\s*(\S+)\s*<<</,
|
|
18
|
+
/^Process:\s*([\w.]+)/,
|
|
19
|
+
];
|
|
20
|
+
function declaredSubject(message) {
|
|
21
|
+
for (const re of SUBJECT_PATTERNS) {
|
|
22
|
+
const m = message.match(re);
|
|
23
|
+
if (m)
|
|
24
|
+
return m[1];
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Build the logcat invocation.
|
|
30
|
+
*
|
|
31
|
+
* Filtering is pushed into adb rather than done in node: a full dump is
|
|
32
|
+
* 13.8 MB, and node's exec buffer is 1 MiB by default.
|
|
33
|
+
*/
|
|
34
|
+
export function buildLogcatArgs(opts) {
|
|
35
|
+
const parts = ["adb"];
|
|
36
|
+
if (opts.serial)
|
|
37
|
+
parts.push("-s", opts.serial);
|
|
38
|
+
// crash first: it is small, and it is where tombstones land.
|
|
39
|
+
parts.push("logcat", "-d", "-b", opts.crashOnly ? "crash" : "crash,main", "-v", "epoch");
|
|
40
|
+
if (opts.sinceTs) {
|
|
41
|
+
parts.push("-T", `'${(opts.sinceTs.getTime() / 1000).toFixed(3)}'`);
|
|
42
|
+
}
|
|
43
|
+
if (opts.pid !== undefined)
|
|
44
|
+
parts.push(`--pid=${opts.pid}`);
|
|
45
|
+
if (opts.minPriority)
|
|
46
|
+
parts.push(`'*:${opts.minPriority}'`);
|
|
47
|
+
return parts.join(" ");
|
|
48
|
+
}
|
|
49
|
+
export function parseLogcatEpoch(stdout) {
|
|
50
|
+
const out = [];
|
|
51
|
+
for (const raw of stdout.split("\n")) {
|
|
52
|
+
if (!raw.trim() || raw.startsWith("---------"))
|
|
53
|
+
continue;
|
|
54
|
+
const m = raw.match(LINE_RE);
|
|
55
|
+
if (!m)
|
|
56
|
+
continue;
|
|
57
|
+
const [, epoch, pid, tid, priority, tag, message] = m;
|
|
58
|
+
out.push({
|
|
59
|
+
ts: new Date(Math.round(parseFloat(epoch) * 1000)),
|
|
60
|
+
level: PRIORITY[priority] ?? "log",
|
|
61
|
+
pid: Number(pid),
|
|
62
|
+
tid: Number(tid),
|
|
63
|
+
tag: tag.trim(),
|
|
64
|
+
message,
|
|
65
|
+
subject: declaredSubject(message),
|
|
66
|
+
raw,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
export async function fetchAndroidLines(opts) {
|
|
72
|
+
const cmd = buildLogcatArgs(opts);
|
|
73
|
+
const { stdout } = await withCancelableTimeout((signal) => execAsync(cmd, { signal, maxBuffer: MAX_BUFFER }), FETCH_TIMEOUT_MS, `logcat (${opts.serial ?? "default device"})`);
|
|
74
|
+
return parseLogcatEpoch(stdout);
|
|
75
|
+
}
|
|
76
|
+
/** Resolve the app's live pid, or undefined when it is not running. */
|
|
77
|
+
export async function resolveAndroidPid(packageName, serial, signal) {
|
|
78
|
+
const target = serial ? `-s ${serial}` : "";
|
|
79
|
+
try {
|
|
80
|
+
const { stdout } = await execAsync(`adb ${target} shell pidof -s ${packageName}`, { signal });
|
|
81
|
+
const pid = Number(stdout.trim());
|
|
82
|
+
return Number.isFinite(pid) && pid > 0 ? pid : undefined;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Not running — expected after a crash, which is the main case.
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=logSourceAndroid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logSourceAndroid.js","sourceRoot":"","sources":["../../src/core/logSourceAndroid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RawLogLine } from "./logEvents.js";
|
|
2
|
+
/**
|
|
3
|
+
* Build the `log show` invocation.
|
|
4
|
+
*
|
|
5
|
+
* The predicate does the filtering inside the OS: a 30-minute app-scoped read
|
|
6
|
+
* is 42 KB, where an unscoped one is orders of magnitude larger.
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildLogShowCommand(opts: {
|
|
9
|
+
udid: string;
|
|
10
|
+
processName?: string;
|
|
11
|
+
sinceTs?: Date;
|
|
12
|
+
/** "error" keeps error+fault; "fault" keeps fault only. */
|
|
13
|
+
minMessageType?: "error" | "fault";
|
|
14
|
+
}): string;
|
|
15
|
+
export declare function parseLogShowNdjson(stdout: string): RawLogLine[];
|
|
16
|
+
export declare function fetchIosLines(opts: {
|
|
17
|
+
udid: string;
|
|
18
|
+
processName?: string;
|
|
19
|
+
sinceTs?: Date;
|
|
20
|
+
minMessageType?: "error" | "fault";
|
|
21
|
+
signal?: AbortSignal;
|
|
22
|
+
}): Promise<RawLogLine[]>;
|
|
23
|
+
export declare function resolveIosProcessName(udid: string, bundleId: string, signal?: AbortSignal): Promise<string | undefined>;
|
|
24
|
+
/** Test-only. */
|
|
25
|
+
export declare function __resetIosProcessNameCache(): void;
|
|
26
|
+
//# sourceMappingURL=logSourceIos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logSourceIos.d.ts","sourceRoot":"","sources":["../../src/core/logSourceIos.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA4B7D;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CACtC,GAAG,MAAM,CAqBT;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CA+B/D;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAQxB;AAUD,wBAAsB,qBAAqB,CACvC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAe7B;AAED,iBAAiB;AACjB,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { execAsync, withCancelableTimeout } from "./exec.js";
|
|
2
|
+
const MAX_BUFFER = 32 * 1024 * 1024;
|
|
3
|
+
const FETCH_TIMEOUT_MS = 8000;
|
|
4
|
+
const MESSAGE_TYPE = {
|
|
5
|
+
Fault: "fatal",
|
|
6
|
+
Error: "error",
|
|
7
|
+
Default: "log",
|
|
8
|
+
Info: "info",
|
|
9
|
+
Debug: "debug",
|
|
10
|
+
};
|
|
11
|
+
const IOS_SUBJECT_RE = /\b([a-z0-9]+(?:\.[A-Za-z0-9-]+){2,})\b/;
|
|
12
|
+
/**
|
|
13
|
+
* `log show --start` parses a bare timestamp as DEVICE-LOCAL time, and rejects
|
|
14
|
+
* an explicit UTC offset (verified against a live simulator). Emitting UTC
|
|
15
|
+
* would therefore shift the window by the host's offset: over-fetching hours
|
|
16
|
+
* of logs east of UTC, and silently MISSING events — crashes included — west
|
|
17
|
+
* of it. The simulator shares the host clock, so local components are correct.
|
|
18
|
+
*/
|
|
19
|
+
function localStamp(d) {
|
|
20
|
+
const p = (n) => String(n).padStart(2, "0");
|
|
21
|
+
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ` +
|
|
22
|
+
`${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Build the `log show` invocation.
|
|
26
|
+
*
|
|
27
|
+
* The predicate does the filtering inside the OS: a 30-minute app-scoped read
|
|
28
|
+
* is 42 KB, where an unscoped one is orders of magnitude larger.
|
|
29
|
+
*/
|
|
30
|
+
export function buildLogShowCommand(opts) {
|
|
31
|
+
const predicates = [];
|
|
32
|
+
if (opts.processName)
|
|
33
|
+
predicates.push(`process == "${opts.processName}"`);
|
|
34
|
+
// Enumerated explicitly — the predicate language has no ordering over
|
|
35
|
+
// messageType, so a ">=" comparison silently matches nothing.
|
|
36
|
+
if (opts.minMessageType === "fault") {
|
|
37
|
+
predicates.push("messageType == fault");
|
|
38
|
+
}
|
|
39
|
+
else if (opts.minMessageType === "error") {
|
|
40
|
+
predicates.push("(messageType == error OR messageType == fault)");
|
|
41
|
+
}
|
|
42
|
+
const parts = [`xcrun simctl spawn ${opts.udid} log show --style ndjson`];
|
|
43
|
+
if (opts.sinceTs) {
|
|
44
|
+
parts.push(`--start '${localStamp(opts.sinceTs)}'`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
parts.push("--last 30m");
|
|
48
|
+
}
|
|
49
|
+
if (predicates.length > 0) {
|
|
50
|
+
parts.push(`--predicate '${predicates.join(" AND ")}'`);
|
|
51
|
+
}
|
|
52
|
+
return parts.join(" ");
|
|
53
|
+
}
|
|
54
|
+
export function parseLogShowNdjson(stdout) {
|
|
55
|
+
const out = [];
|
|
56
|
+
for (const raw of stdout.split("\n")) {
|
|
57
|
+
const trimmed = raw.trim();
|
|
58
|
+
if (!trimmed)
|
|
59
|
+
continue;
|
|
60
|
+
let rec;
|
|
61
|
+
try {
|
|
62
|
+
rec = JSON.parse(trimmed);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
continue; // banner or partial line
|
|
66
|
+
}
|
|
67
|
+
// The stream ends with a {count, finished} summary object.
|
|
68
|
+
if (typeof rec.eventMessage !== "string")
|
|
69
|
+
continue;
|
|
70
|
+
const subsystem = typeof rec.subsystem === "string" ? rec.subsystem : "";
|
|
71
|
+
const category = typeof rec.category === "string" ? rec.category : "";
|
|
72
|
+
const message = rec.eventMessage;
|
|
73
|
+
const messageType = typeof rec.messageType === "string" ? rec.messageType : "Default";
|
|
74
|
+
out.push({
|
|
75
|
+
ts: new Date(String(rec.timestamp).replace(" ", "T").replace(/([+-]\d{2})(\d{2})$/, "$1:$2")),
|
|
76
|
+
level: MESSAGE_TYPE[messageType] ?? "log",
|
|
77
|
+
pid: Number(rec.processID ?? 0),
|
|
78
|
+
tid: rec.threadID === undefined ? undefined : Number(rec.threadID),
|
|
79
|
+
tag: subsystem || category ? `${subsystem}:${category}` : "default",
|
|
80
|
+
message,
|
|
81
|
+
subject: message.match(IOS_SUBJECT_RE)?.[1],
|
|
82
|
+
raw: trimmed,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
export async function fetchIosLines(opts) {
|
|
88
|
+
const cmd = buildLogShowCommand(opts);
|
|
89
|
+
const { stdout } = await withCancelableTimeout((signal) => execAsync(cmd, { signal, maxBuffer: MAX_BUFFER }), FETCH_TIMEOUT_MS, `log show (${opts.udid})`);
|
|
90
|
+
return parseLogShowNdjson(stdout);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Map a bundle id to the `process ==` value the predicate needs.
|
|
94
|
+
*
|
|
95
|
+
* The predicate matches the executable name, not the bundle id — verified:
|
|
96
|
+
* org.reactjs.native.example.RnDebuggerTestApp -> RnDebuggerTestApp.
|
|
97
|
+
*/
|
|
98
|
+
const processNameCache = new Map();
|
|
99
|
+
export async function resolveIosProcessName(udid, bundleId, signal) {
|
|
100
|
+
const key = `${udid}:${bundleId}`;
|
|
101
|
+
const cached = processNameCache.get(key);
|
|
102
|
+
if (cached)
|
|
103
|
+
return cached;
|
|
104
|
+
try {
|
|
105
|
+
const { stdout } = await execAsync(`xcrun simctl get_app_container ${udid} ${bundleId} app`, { signal });
|
|
106
|
+
const name = stdout.trim().split("/").pop()?.replace(/\.app$/, "");
|
|
107
|
+
if (name)
|
|
108
|
+
processNameCache.set(key, name);
|
|
109
|
+
return name || undefined;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Test-only. */
|
|
116
|
+
export function __resetIosProcessNameCache() {
|
|
117
|
+
processNameCache.clear();
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=logSourceIos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logSourceIos.js","sourceRoot":"","sources":["../../src/core/logSourceIos.ts"],"names":[],"mappings":"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"}
|
package/build/core/logs.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { LogEntry, LogLevel } from "./types.js";
|
|
2
|
+
/** Test-only: reset the sequence so assertions are not order-dependent. */
|
|
3
|
+
export declare function __resetLogSeq(): void;
|
|
2
4
|
export declare class LogBuffer {
|
|
3
5
|
private logs;
|
|
4
6
|
private maxSize;
|
|
5
7
|
constructor(maxSize?: number);
|
|
6
|
-
add(entry: LogEntry
|
|
8
|
+
add(entry: Omit<LogEntry, "seq"> & {
|
|
9
|
+
seq?: number;
|
|
10
|
+
}): void;
|
|
7
11
|
get(count?: number, level?: string, startFromText?: string): LogEntry[];
|
|
8
12
|
search(text: string, maxResults?: number): LogEntry[];
|
|
9
13
|
clear(): number;
|
package/build/core/logs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/core/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/core/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKhD,2EAA2E;AAC3E,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAGD,qBAAa,SAAS;IAClB,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAa;IAIlC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQ1D,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IA4BvE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE;IAUrD,KAAK,IAAI,MAAM;IAMf,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAMlC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,MAAM,IAAI,QAAQ,EAAE;CAGvB;AAGD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAc9D;AAGD,MAAM,WAAW,iBAAiB;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,wBAAgB,UAAU,CACtB,IAAI,EAAE,QAAQ,EAAE,EAChB,OAAO,GAAE,iBAAsB,GAChC,MAAM,CAqBR;AAGD,wBAAgB,OAAO,CACnB,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE;IACL,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CAChB,GACP;IAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQxD;AAGD,wBAAgB,UAAU,CACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IACL,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CAChB,GACP;IAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQxD;AAGD,wBAAgB,aAAa,CACzB,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACxB,GACP,MAAM,CAoCR"}
|
package/build/core/logs.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
// Process-global so ids never collide across per-device buffers.
|
|
2
|
+
let nextSeq = 1;
|
|
3
|
+
/** Test-only: reset the sequence so assertions are not order-dependent. */
|
|
4
|
+
export function __resetLogSeq() {
|
|
5
|
+
nextSeq = 1;
|
|
6
|
+
}
|
|
1
7
|
// Circular buffer for storing logs
|
|
2
8
|
export class LogBuffer {
|
|
3
9
|
logs = [];
|
|
@@ -6,7 +12,8 @@ export class LogBuffer {
|
|
|
6
12
|
this.maxSize = maxSize;
|
|
7
13
|
}
|
|
8
14
|
add(entry) {
|
|
9
|
-
|
|
15
|
+
const stamped = { ...entry, seq: entry.seq ?? nextSeq++ };
|
|
16
|
+
this.logs.push(stamped);
|
|
10
17
|
if (this.logs.length > this.maxSize) {
|
|
11
18
|
this.logs.shift();
|
|
12
19
|
}
|
package/build/core/logs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/core/logs.ts"],"names":[],"mappings":"AAEA,mCAAmC;AACnC,MAAM,OAAO,SAAS;IACV,IAAI,GAAe,EAAE,CAAC;IACtB,OAAO,CAAS;IAExB,YAAY,UAAkB,IAAI;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/core/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type AppIdentity, type LogEvent, type EventLevel, type RawLogLine } from "./logEvents.js";
|
|
2
|
+
import type { ConnectedApp } from "./types.js";
|
|
3
|
+
/** simulatorUdid ?? adbSerial. Never deviceName — two sims can share a name. */
|
|
4
|
+
export declare function deviceKeyOf(app: ConnectedApp): string | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* Build identity for a connected app. iOS bundle ids and Android package names
|
|
7
|
+
* differ for the same product, so this is always per-device and never global.
|
|
8
|
+
*
|
|
9
|
+
* `deviceKeyOverride` covers apps found via `matchAndroidAppBySerial`: their
|
|
10
|
+
* OWN `adbSerial` is exactly the null value that made the direct lookup miss
|
|
11
|
+
* in the first place, so `deviceKeyOf(app)` would still fail here — the
|
|
12
|
+
* caller passes the discovered device's serial instead, which is what the
|
|
13
|
+
* native buffer is actually keyed by.
|
|
14
|
+
*/
|
|
15
|
+
export declare function identityFromApp(app: ConnectedApp, deviceKeyOverride?: string): AppIdentity | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Last-known identity for a device that is no longer connected — the crash
|
|
18
|
+
* case, where there is no ConnectedApp to read appId from.
|
|
19
|
+
*
|
|
20
|
+
* Residual limitation: this can only find an appId that was previously
|
|
21
|
+
* recorded under `deviceKey` or `deviceName`. `resolveLogTargets` writes the
|
|
22
|
+
* live identity under `deviceKey` (the udid / adb serial) via `recordDevice`
|
|
23
|
+
* while the app is connected, which is what makes this succeed after a
|
|
24
|
+
* crash — but if the app has never been connected on this device in this
|
|
25
|
+
* project, there is nothing to find. That is a designed degradation, not a
|
|
26
|
+
* bug: the device still runs in crash-buffer-only mode, and crashes still
|
|
27
|
+
* surface with their declared owner.
|
|
28
|
+
*/
|
|
29
|
+
export declare function identityFromMemory(deviceKey: string, platform: "ios" | "android", deviceName?: string): AppIdentity | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* ownership -> grouping -> relevance -> ingest.
|
|
32
|
+
*
|
|
33
|
+
* Relevance runs after grouping because it tests `kind`, which the grouper
|
|
34
|
+
* assigns; a floor applied to raw lines would shred backtrace continuations.
|
|
35
|
+
*/
|
|
36
|
+
export declare function runNativePipeline(lines: RawLogLine[], identity: AppIdentity, deviceName: string, opts: {
|
|
37
|
+
minLevel: EventLevel;
|
|
38
|
+
}): {
|
|
39
|
+
events: LogEvent[];
|
|
40
|
+
};
|
|
41
|
+
export interface LogTarget {
|
|
42
|
+
/** simulatorUdid (iOS) | adb serial (Android). The buffer key. */
|
|
43
|
+
deviceKey: string;
|
|
44
|
+
deviceName: string;
|
|
45
|
+
platform: "ios" | "android";
|
|
46
|
+
/** Android only — what `adb -s` accepts. */
|
|
47
|
+
adbSerial?: string;
|
|
48
|
+
/** Absent when the app has never connected on this device. */
|
|
49
|
+
identity?: AppIdentity;
|
|
50
|
+
/** Where `identity` came from — memory-sourced ids can be stale. */
|
|
51
|
+
identitySource?: "live" | "memory";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Every device we could read logs from — NOT just connected ones.
|
|
55
|
+
*
|
|
56
|
+
* A crashed app has no CDP connection, so connectedApps is empty exactly when
|
|
57
|
+
* this feature is most needed. Discovery is the source of truth for "which
|
|
58
|
+
* devices exist"; connectedApps and projectMemory only enrich them with
|
|
59
|
+
* identity. Shutdown simulators and stopped emulators are excluded — there is
|
|
60
|
+
* no log stream to read.
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveLogTargets(device?: string): Promise<LogTarget[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Fan out across every device in parallel. A device that fails degrades to a
|
|
65
|
+
* note; the others still answer.
|
|
66
|
+
*/
|
|
67
|
+
export declare function collectNativeEvents(opts: {
|
|
68
|
+
device?: string;
|
|
69
|
+
minLevel: EventLevel;
|
|
70
|
+
since?: Date;
|
|
71
|
+
}): Promise<{
|
|
72
|
+
events: LogEvent[];
|
|
73
|
+
notes: string[];
|
|
74
|
+
}>;
|
|
75
|
+
//# sourceMappingURL=nativeLogs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeLogs.d.ts","sourceRoot":"","sources":["../../src/core/nativeLogs.ts"],"names":[],"mappings":"AAIA,OAAO,EAEH,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,UAAU,EAClB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC3B,GAAG,EAAE,YAAY,EACjB,iBAAiB,CAAC,EAAE,MAAM,GAC3B,WAAW,GAAG,SAAS,CAIzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,KAAK,GAAG,SAAS,EAC3B,UAAU,CAAC,EAAE,MAAM,GACpB,WAAW,GAAG,SAAS,CAYzB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC7B,KAAK,EAAE,UAAU,EAAE,EACnB,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IAAE,QAAQ,EAAE,UAAU,CAAA;CAAE,GAC/B;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;CAAE,CASxB;AAED,MAAM,WAAW,SAAS;IACtB,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CACtC;AAiCD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA2E7E;AAoDD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,CAAC,EAAE,IAAI,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsBnD"}
|