@buoy-gg/js-top 7.0.3
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 +58 -0
- package/README.md +56 -0
- package/lib/commonjs/index.js +97 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/js-top/components/BusySparkline.js +56 -0
- package/lib/commonjs/js-top/components/BusySparkline.js.map +1 -0
- package/lib/commonjs/js-top/components/JsTopHudOverlay.js +79 -0
- package/lib/commonjs/js-top/components/JsTopHudOverlay.js.map +1 -0
- package/lib/commonjs/js-top/components/JsTopModal.js +347 -0
- package/lib/commonjs/js-top/components/JsTopModal.js.map +1 -0
- package/lib/commonjs/js-top/components/TaskDetailView.js +329 -0
- package/lib/commonjs/js-top/components/TaskDetailView.js.map +1 -0
- package/lib/commonjs/js-top/components/TaskTable.js +360 -0
- package/lib/commonjs/js-top/components/TaskTable.js.map +1 -0
- package/lib/commonjs/js-top/engine/JsTopController.js +350 -0
- package/lib/commonjs/js-top/engine/JsTopController.js.map +1 -0
- package/lib/commonjs/js-top/engine/aggregator.js +148 -0
- package/lib/commonjs/js-top/engine/aggregator.js.map +1 -0
- package/lib/commonjs/js-top/engine/busyProbe.js +101 -0
- package/lib/commonjs/js-top/engine/busyProbe.js.map +1 -0
- package/lib/commonjs/js-top/engine/frameStack.js +133 -0
- package/lib/commonjs/js-top/engine/frameStack.js.map +1 -0
- package/lib/commonjs/js-top/engine/longtasks.js +141 -0
- package/lib/commonjs/js-top/engine/longtasks.js.map +1 -0
- package/lib/commonjs/js-top/engine/now.js +38 -0
- package/lib/commonjs/js-top/engine/now.js.map +1 -0
- package/lib/commonjs/js-top/engine/originRegistry.js +402 -0
- package/lib/commonjs/js-top/engine/originRegistry.js.map +1 -0
- package/lib/commonjs/js-top/engine/patches/bridge.js +60 -0
- package/lib/commonjs/js-top/engine/patches/bridge.js.map +1 -0
- package/lib/commonjs/js-top/engine/patches/microtasks.js +27 -0
- package/lib/commonjs/js-top/engine/patches/microtasks.js.map +1 -0
- package/lib/commonjs/js-top/engine/patches/promises.js +65 -0
- package/lib/commonjs/js-top/engine/patches/promises.js.map +1 -0
- package/lib/commonjs/js-top/engine/patches/timers.js +66 -0
- package/lib/commonjs/js-top/engine/patches/timers.js.map +1 -0
- package/lib/commonjs/js-top/engine/state.js +63 -0
- package/lib/commonjs/js-top/engine/state.js.map +1 -0
- package/lib/commonjs/js-top/engine/symbolicate.js +95 -0
- package/lib/commonjs/js-top/engine/symbolicate.js.map +1 -0
- package/lib/commonjs/js-top/sync/jsTopSyncAdapter.js +74 -0
- package/lib/commonjs/js-top/sync/jsTopSyncAdapter.js.map +1 -0
- package/lib/commonjs/js-top/types/index.js +46 -0
- package/lib/commonjs/js-top/types/index.js.map +1 -0
- package/lib/commonjs/js-top/utils/preferences.js +39 -0
- package/lib/commonjs/js-top/utils/preferences.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/preset.js +75 -0
- package/lib/commonjs/preset.js.map +1 -0
- package/lib/module/index.js +47 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/js-top/components/BusySparkline.js +52 -0
- package/lib/module/js-top/components/BusySparkline.js.map +1 -0
- package/lib/module/js-top/components/JsTopHudOverlay.js +75 -0
- package/lib/module/js-top/components/JsTopHudOverlay.js.map +1 -0
- package/lib/module/js-top/components/JsTopModal.js +343 -0
- package/lib/module/js-top/components/JsTopModal.js.map +1 -0
- package/lib/module/js-top/components/TaskDetailView.js +325 -0
- package/lib/module/js-top/components/TaskDetailView.js.map +1 -0
- package/lib/module/js-top/components/TaskTable.js +353 -0
- package/lib/module/js-top/components/TaskTable.js.map +1 -0
- package/lib/module/js-top/engine/JsTopController.js +347 -0
- package/lib/module/js-top/engine/JsTopController.js.map +1 -0
- package/lib/module/js-top/engine/aggregator.js +136 -0
- package/lib/module/js-top/engine/aggregator.js.map +1 -0
- package/lib/module/js-top/engine/busyProbe.js +94 -0
- package/lib/module/js-top/engine/busyProbe.js.map +1 -0
- package/lib/module/js-top/engine/frameStack.js +126 -0
- package/lib/module/js-top/engine/frameStack.js.map +1 -0
- package/lib/module/js-top/engine/longtasks.js +133 -0
- package/lib/module/js-top/engine/longtasks.js.map +1 -0
- package/lib/module/js-top/engine/now.js +33 -0
- package/lib/module/js-top/engine/now.js.map +1 -0
- package/lib/module/js-top/engine/originRegistry.js +388 -0
- package/lib/module/js-top/engine/originRegistry.js.map +1 -0
- package/lib/module/js-top/engine/patches/bridge.js +56 -0
- package/lib/module/js-top/engine/patches/bridge.js.map +1 -0
- package/lib/module/js-top/engine/patches/microtasks.js +23 -0
- package/lib/module/js-top/engine/patches/microtasks.js.map +1 -0
- package/lib/module/js-top/engine/patches/promises.js +62 -0
- package/lib/module/js-top/engine/patches/promises.js.map +1 -0
- package/lib/module/js-top/engine/patches/timers.js +62 -0
- package/lib/module/js-top/engine/patches/timers.js.map +1 -0
- package/lib/module/js-top/engine/state.js +54 -0
- package/lib/module/js-top/engine/state.js.map +1 -0
- package/lib/module/js-top/engine/symbolicate.js +91 -0
- package/lib/module/js-top/engine/symbolicate.js.map +1 -0
- package/lib/module/js-top/sync/jsTopSyncAdapter.js +70 -0
- package/lib/module/js-top/sync/jsTopSyncAdapter.js.map +1 -0
- package/lib/module/js-top/types/index.js +42 -0
- package/lib/module/js-top/types/index.js.map +1 -0
- package/lib/module/js-top/utils/preferences.js +34 -0
- package/lib/module/js-top/utils/preferences.js.map +1 -0
- package/lib/module/preset.js +71 -0
- package/lib/module/preset.js.map +1 -0
- package/lib/typescript/index.d.ts +21 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/js-top/components/BusySparkline.d.ts +8 -0
- package/lib/typescript/js-top/components/BusySparkline.d.ts.map +1 -0
- package/lib/typescript/js-top/components/JsTopHudOverlay.d.ts +8 -0
- package/lib/typescript/js-top/components/JsTopHudOverlay.d.ts.map +1 -0
- package/lib/typescript/js-top/components/JsTopModal.d.ts +39 -0
- package/lib/typescript/js-top/components/JsTopModal.d.ts.map +1 -0
- package/lib/typescript/js-top/components/TaskDetailView.d.ts +15 -0
- package/lib/typescript/js-top/components/TaskDetailView.d.ts.map +1 -0
- package/lib/typescript/js-top/components/TaskTable.d.ts +38 -0
- package/lib/typescript/js-top/components/TaskTable.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/JsTopController.d.ts +78 -0
- package/lib/typescript/js-top/engine/JsTopController.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/__tests__/engine.test.d.ts +9 -0
- package/lib/typescript/js-top/engine/__tests__/engine.test.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/aggregator.d.ts +33 -0
- package/lib/typescript/js-top/engine/aggregator.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/busyProbe.d.ts +25 -0
- package/lib/typescript/js-top/engine/busyProbe.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/frameStack.d.ts +44 -0
- package/lib/typescript/js-top/engine/frameStack.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/longtasks.d.ts +37 -0
- package/lib/typescript/js-top/engine/longtasks.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/now.d.ts +9 -0
- package/lib/typescript/js-top/engine/now.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/originRegistry.d.ts +82 -0
- package/lib/typescript/js-top/engine/originRegistry.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/patches/bridge.d.ts +17 -0
- package/lib/typescript/js-top/engine/patches/bridge.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/patches/microtasks.d.ts +6 -0
- package/lib/typescript/js-top/engine/patches/microtasks.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/patches/promises.d.ts +18 -0
- package/lib/typescript/js-top/engine/patches/promises.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/patches/timers.d.ts +11 -0
- package/lib/typescript/js-top/engine/patches/timers.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/state.d.ts +35 -0
- package/lib/typescript/js-top/engine/state.d.ts.map +1 -0
- package/lib/typescript/js-top/engine/symbolicate.d.ts +16 -0
- package/lib/typescript/js-top/engine/symbolicate.d.ts.map +1 -0
- package/lib/typescript/js-top/sync/jsTopSyncAdapter.d.ts +43 -0
- package/lib/typescript/js-top/sync/jsTopSyncAdapter.d.ts.map +1 -0
- package/lib/typescript/js-top/types/index.d.ts +130 -0
- package/lib/typescript/js-top/types/index.d.ts.map +1 -0
- package/lib/typescript/js-top/utils/preferences.d.ts +13 -0
- package/lib/typescript/js-top/utils/preferences.d.ts.map +1 -0
- package/lib/typescript/preset.d.ts +49 -0
- package/lib/typescript/preset.d.ts.map +1 -0
- package/package.json +67 -0
- package/src/index.tsx +69 -0
- package/src/js-top/components/BusySparkline.tsx +59 -0
- package/src/js-top/components/JsTopHudOverlay.tsx +78 -0
- package/src/js-top/components/JsTopModal.tsx +421 -0
- package/src/js-top/components/TaskDetailView.tsx +349 -0
- package/src/js-top/components/TaskTable.tsx +365 -0
- package/src/js-top/engine/JsTopController.ts +401 -0
- package/src/js-top/engine/__tests__/engine.test.ts +337 -0
- package/src/js-top/engine/aggregator.ts +148 -0
- package/src/js-top/engine/busyProbe.ts +100 -0
- package/src/js-top/engine/frameStack.ts +142 -0
- package/src/js-top/engine/longtasks.ts +137 -0
- package/src/js-top/engine/now.ts +33 -0
- package/src/js-top/engine/originRegistry.ts +495 -0
- package/src/js-top/engine/patches/bridge.ts +69 -0
- package/src/js-top/engine/patches/microtasks.ts +25 -0
- package/src/js-top/engine/patches/promises.ts +57 -0
- package/src/js-top/engine/patches/timers.ts +80 -0
- package/src/js-top/engine/state.ts +66 -0
- package/src/js-top/engine/symbolicate.ts +109 -0
- package/src/js-top/sync/jsTopSyncAdapter.ts +72 -0
- package/src/js-top/types/index.ts +144 -0
- package/src/js-top/utils/preferences.ts +35 -0
- package/src/preset.tsx +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["memo","useState","ScrollView","StyleSheet","Text","TouchableOpacity","View","macOSColors","jsx","_jsx","jsxs","_jsxs","SORT_OPTIONS","key","title","API_BADGE","timeout","text","color","prefix","interval","immediate","raf","microtask","then","bridge","unattributed","other","badgeFor","api","displayName","row","name","label","startsWith","slice","length","replace","trim","fmt","n","Math","round","toFixed","statsLine","calls","avgMs","maxMs","totalMs","TaskRow","rank","onPress","badge","Wrapper","style","rowStyles","activeOpacity","children","topLine","borderColor","backgroundColor","badgeText","numberOfLines","freezes","freezeBadge","worstFreezeMs","freezeBadgeSevere","windowMs","pctOfBusy","semantic","error","warning","unit","pct","pctMuted","subLine","barTrack","barFill","width","min","stats","prev","next","TaskTable","rows","onSelectRow","sortKey","setSortKey","sorted","sort","a","b","styles","root","sortRow","sortLabel","map","o","sortChip","sortChipOn","sortChipText","sortChipTextOn","body","i","empty","create","flex","minHeight","flexDirection","alignItems","gap","paddingHorizontal","paddingVertical","borderBottomWidth","borderBottomColor","border","default","background","card","muted","fontSize","fontWeight","letterSpacing","marginRight","borderWidth","borderRadius","info","fontVariant","textAlign","hairlineWidth","primary","secondary","paddingLeft","height","input","overflow","opacity"],"sourceRoot":"../../../../src","sources":["js-top/components/TaskTable.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* JsTopController — singleton orchestrating the task-accounting engine.
|
|
5
|
+
*
|
|
6
|
+
* Lifecycle mirrors PerfMonitorController: the engine runs only while
|
|
7
|
+
* someone is looking (snapshot subscribers — the HUD/modal — or a desktop
|
|
8
|
+
* dashboard's silent remote sampling). Patches install once on first start
|
|
9
|
+
* and stay installed; stopping just clears the `active` gate and the probe,
|
|
10
|
+
* so a closed tool costs one boolean per schedule and nothing else.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { AppState } from "react-native";
|
|
14
|
+
import { BUCKET_MS, WINDOW_BUCKETS, SNAPSHOT_ROWS } from "../types";
|
|
15
|
+
import { now } from "./now";
|
|
16
|
+
import { setActive, isActive } from "./state";
|
|
17
|
+
import { installTimerPatches } from "./patches/timers";
|
|
18
|
+
import { installMicrotaskPatches } from "./patches/microtasks";
|
|
19
|
+
import { busyHistory, resetAggregator, windowAttributedMs, windowBusyMs, windowResidualBuckets } from "./aggregator";
|
|
20
|
+
import { buildRows, getOriginDetailBase, resetOrigins } from "./originRegistry";
|
|
21
|
+
import { startBusyProbe, stopBusyProbe, suppressNextGap } from "./busyProbe";
|
|
22
|
+
import { getOriginals } from "./state";
|
|
23
|
+
import { loadJsTopPrefs, saveJsTopPrefs } from "../utils/preferences";
|
|
24
|
+
const NOTIFY_INTERVAL_MS = BUCKET_MS;
|
|
25
|
+
class JsTopControllerImpl {
|
|
26
|
+
enabled = false;
|
|
27
|
+
enabledLoaded = false;
|
|
28
|
+
paused = false;
|
|
29
|
+
remoteSampling = false;
|
|
30
|
+
engineRunning = false;
|
|
31
|
+
tiers = {
|
|
32
|
+
timers: false,
|
|
33
|
+
promises: false,
|
|
34
|
+
bridge: false,
|
|
35
|
+
longtask: false
|
|
36
|
+
};
|
|
37
|
+
notifyHandle = null;
|
|
38
|
+
appStateSub = null;
|
|
39
|
+
snapshot = this.buildSnapshot();
|
|
40
|
+
subscribers = new Set();
|
|
41
|
+
enabledSubscribers = new Set();
|
|
42
|
+
/** Phase-2 seam: extra tier installers (promises/bridge/longtasks) register
|
|
43
|
+
* here so the controller stays ignorant of their internals. */
|
|
44
|
+
tierInstallers = [];
|
|
45
|
+
longtaskProvider = null;
|
|
46
|
+
freezeStatsProvider = null;
|
|
47
|
+
clearHooks = [];
|
|
48
|
+
constructor() {
|
|
49
|
+
void loadJsTopPrefs().then(prefs => {
|
|
50
|
+
this.enabledLoaded = true;
|
|
51
|
+
if (prefs.enabled && !this.enabled) this.setEnabled(true);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ── observation lifecycle ────────────────────────────────────────────────
|
|
56
|
+
|
|
57
|
+
subscribe(fn) {
|
|
58
|
+
this.subscribers.add(fn);
|
|
59
|
+
this.syncEngineState();
|
|
60
|
+
fn(this.snapshot);
|
|
61
|
+
return () => {
|
|
62
|
+
this.subscribers.delete(fn);
|
|
63
|
+
this.syncEngineState();
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
subscribeEnabled(fn) {
|
|
67
|
+
this.enabledSubscribers.add(fn);
|
|
68
|
+
fn(this.enabled);
|
|
69
|
+
return () => {
|
|
70
|
+
this.enabledSubscribers.delete(fn);
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** HUD visibility toggle (persisted). Not required for the engine to run —
|
|
75
|
+
* the modal or a desktop watcher subscribing is what starts sampling. */
|
|
76
|
+
setEnabled(on) {
|
|
77
|
+
if (this.enabled === on) return;
|
|
78
|
+
this.enabled = on;
|
|
79
|
+
if (this.enabledLoaded) void saveJsTopPrefs({
|
|
80
|
+
enabled: on
|
|
81
|
+
});
|
|
82
|
+
this.enabledSubscribers.forEach(fn => {
|
|
83
|
+
try {
|
|
84
|
+
fn(on);
|
|
85
|
+
} catch (err) {
|
|
86
|
+
if (__DEV__) {
|
|
87
|
+
// eslint-disable-next-line no-console
|
|
88
|
+
console.error("[js-top] enabled subscriber threw", err);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
this.syncEngineState();
|
|
93
|
+
}
|
|
94
|
+
isEnabled() {
|
|
95
|
+
return this.enabled;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Silent sampling for a desktop viewer — engine runs, device HUD stays
|
|
99
|
+
* hidden (same contract as perf-monitor's setRemoteSampling). */
|
|
100
|
+
setRemoteSampling(on) {
|
|
101
|
+
if (this.remoteSampling === on) return;
|
|
102
|
+
this.remoteSampling = on;
|
|
103
|
+
this.syncEngineState();
|
|
104
|
+
}
|
|
105
|
+
isRemoteSampling() {
|
|
106
|
+
return this.remoteSampling;
|
|
107
|
+
}
|
|
108
|
+
getStatus() {
|
|
109
|
+
if (!this.engineRunning) return "disabled";
|
|
110
|
+
return this.paused ? "paused" : "running";
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ── controls ─────────────────────────────────────────────────────────────
|
|
114
|
+
|
|
115
|
+
pause() {
|
|
116
|
+
if (this.paused) return;
|
|
117
|
+
this.paused = true;
|
|
118
|
+
setActive(false);
|
|
119
|
+
stopBusyProbe();
|
|
120
|
+
this.emitSnapshot();
|
|
121
|
+
}
|
|
122
|
+
resume() {
|
|
123
|
+
if (!this.paused) return;
|
|
124
|
+
this.paused = false;
|
|
125
|
+
if (this.engineRunning) {
|
|
126
|
+
setActive(true);
|
|
127
|
+
startBusyProbe();
|
|
128
|
+
}
|
|
129
|
+
this.emitSnapshot();
|
|
130
|
+
}
|
|
131
|
+
clear() {
|
|
132
|
+
resetOrigins();
|
|
133
|
+
resetAggregator();
|
|
134
|
+
for (const hook of this.clearHooks) {
|
|
135
|
+
try {
|
|
136
|
+
hook();
|
|
137
|
+
} catch {
|
|
138
|
+
// ignore
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
this.emitSnapshot();
|
|
142
|
+
}
|
|
143
|
+
registerClearHook(fn) {
|
|
144
|
+
this.clearHooks.push(fn);
|
|
145
|
+
}
|
|
146
|
+
getSnapshot() {
|
|
147
|
+
return this.snapshot;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Full detail for one origin (tap-through view). Returns null when the
|
|
152
|
+
* origin was evicted or never existed. The pinned "unattributed" row gets
|
|
153
|
+
* a synthetic detail built from the probe residuals.
|
|
154
|
+
*/
|
|
155
|
+
getOriginDetail(key) {
|
|
156
|
+
const t = now();
|
|
157
|
+
const busy = windowBusyMs(t);
|
|
158
|
+
const freezeStats = this.freezeStatsProvider?.(Date.now());
|
|
159
|
+
const freezes = freezeStats?.byOrigin[key];
|
|
160
|
+
if (key === "unattributed") {
|
|
161
|
+
const buckets = windowResidualBuckets(t);
|
|
162
|
+
const windowMs = Math.round(buckets.reduce((sum, ms) => sum + ms, 0) * 10) / 10;
|
|
163
|
+
return {
|
|
164
|
+
key,
|
|
165
|
+
label: "unattributed (events / React / native call-ins)",
|
|
166
|
+
api: "unattributed",
|
|
167
|
+
promoted: false,
|
|
168
|
+
scheduleCount: 0,
|
|
169
|
+
calls: 0,
|
|
170
|
+
totalMs: 0,
|
|
171
|
+
avgMs: 0,
|
|
172
|
+
maxMs: 0,
|
|
173
|
+
windowMs,
|
|
174
|
+
pctOfBusy: busy > 0 ? Math.min(100, Math.round(windowMs / busy * 1000) / 10) : 0,
|
|
175
|
+
lastSeenAgoMs: 0,
|
|
176
|
+
buckets,
|
|
177
|
+
freezes: freezes?.count ?? 0,
|
|
178
|
+
worstFreezeMs: Math.round(freezes?.maxMs ?? 0)
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
const base = getOriginDetailBase(key, t, busy);
|
|
182
|
+
if (!base) return null;
|
|
183
|
+
return {
|
|
184
|
+
...base,
|
|
185
|
+
freezes: freezes?.count ?? 0,
|
|
186
|
+
worstFreezeMs: Math.round(freezes?.maxMs ?? 0)
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Phase-2 registration seam for additional patch tiers. */
|
|
191
|
+
registerTierInstaller(install) {
|
|
192
|
+
this.tierInstallers.push(install);
|
|
193
|
+
if (this.engineRunning) {
|
|
194
|
+
Object.assign(this.tiers, this.runInstaller(install));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
registerLongtaskProvider(fn) {
|
|
198
|
+
this.longtaskProvider = fn;
|
|
199
|
+
}
|
|
200
|
+
registerFreezeStatsProvider(fn) {
|
|
201
|
+
this.freezeStatsProvider = fn;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ── engine ───────────────────────────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
shouldRun() {
|
|
207
|
+
return this.subscribers.size > 0 || this.remoteSampling;
|
|
208
|
+
}
|
|
209
|
+
syncEngineState() {
|
|
210
|
+
const want = this.shouldRun();
|
|
211
|
+
if (want && !this.engineRunning) this.startEngine();else if (!want && this.engineRunning) this.stopEngine();
|
|
212
|
+
}
|
|
213
|
+
runInstaller(install) {
|
|
214
|
+
try {
|
|
215
|
+
return install();
|
|
216
|
+
} catch (err) {
|
|
217
|
+
if (__DEV__) {
|
|
218
|
+
// eslint-disable-next-line no-console
|
|
219
|
+
console.error("[js-top] tier installer threw", err);
|
|
220
|
+
}
|
|
221
|
+
return {};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
startEngine() {
|
|
225
|
+
this.engineRunning = true;
|
|
226
|
+
installTimerPatches();
|
|
227
|
+
installMicrotaskPatches();
|
|
228
|
+
this.tiers = {
|
|
229
|
+
timers: true,
|
|
230
|
+
promises: false,
|
|
231
|
+
bridge: false,
|
|
232
|
+
longtask: false
|
|
233
|
+
};
|
|
234
|
+
for (const install of this.tierInstallers) {
|
|
235
|
+
Object.assign(this.tiers, this.runInstaller(install));
|
|
236
|
+
}
|
|
237
|
+
setActive(!this.paused);
|
|
238
|
+
if (!this.paused) startBusyProbe();
|
|
239
|
+
try {
|
|
240
|
+
this.appStateSub = AppState.addEventListener("change", () => {
|
|
241
|
+
suppressNextGap();
|
|
242
|
+
});
|
|
243
|
+
} catch {
|
|
244
|
+
this.appStateSub = null;
|
|
245
|
+
}
|
|
246
|
+
// The notify tick uses the pre-patch setInterval: the engine must never
|
|
247
|
+
// list its own heartbeat as a task.
|
|
248
|
+
this.notifyHandle = getOriginals().setInterval(() => this.emitSnapshot(), NOTIFY_INTERVAL_MS);
|
|
249
|
+
this.emitSnapshot();
|
|
250
|
+
}
|
|
251
|
+
stopEngine() {
|
|
252
|
+
this.engineRunning = false;
|
|
253
|
+
setActive(false);
|
|
254
|
+
stopBusyProbe();
|
|
255
|
+
if (this.notifyHandle != null) {
|
|
256
|
+
getOriginals().clearInterval(this.notifyHandle);
|
|
257
|
+
this.notifyHandle = null;
|
|
258
|
+
}
|
|
259
|
+
if (this.appStateSub) {
|
|
260
|
+
try {
|
|
261
|
+
this.appStateSub.remove();
|
|
262
|
+
} catch {
|
|
263
|
+
// ignore
|
|
264
|
+
}
|
|
265
|
+
this.appStateSub = null;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
buildSnapshot() {
|
|
269
|
+
const t = now();
|
|
270
|
+
const busy = windowBusyMs(t);
|
|
271
|
+
const attributed = windowAttributedMs(t);
|
|
272
|
+
const unattributed = Math.max(0, busy - attributed);
|
|
273
|
+
const rows = buildRows(t, busy, SNAPSHOT_ROWS);
|
|
274
|
+
if (unattributed >= 1) {
|
|
275
|
+
rows.push({
|
|
276
|
+
key: "unattributed",
|
|
277
|
+
label: "unattributed (events / React / native call-ins)",
|
|
278
|
+
api: "unattributed",
|
|
279
|
+
windowMs: Math.round(unattributed * 10) / 10,
|
|
280
|
+
pctOfBusy: busy > 0 ? Math.min(100, Math.round(unattributed / busy * 1000) / 10) : 0,
|
|
281
|
+
totalMs: 0,
|
|
282
|
+
calls: 0,
|
|
283
|
+
avgMs: 0,
|
|
284
|
+
maxMs: 0,
|
|
285
|
+
lastSeenAgoMs: 0,
|
|
286
|
+
freezes: 0,
|
|
287
|
+
worstFreezeMs: 0
|
|
288
|
+
});
|
|
289
|
+
rows.sort((a, b) => b.windowMs - a.windowMs || b.totalMs - a.totalMs);
|
|
290
|
+
}
|
|
291
|
+
// Decorate rows with freeze badges (unattributed freezes land on the
|
|
292
|
+
// pinned "unattributed" row, whose key matches SYSTEM_FREEZE_KEY).
|
|
293
|
+
const freezeStats = this.freezeStatsProvider?.(Date.now()) ?? {
|
|
294
|
+
count: 0,
|
|
295
|
+
worstMs: 0,
|
|
296
|
+
byOrigin: {}
|
|
297
|
+
};
|
|
298
|
+
for (const row of rows) {
|
|
299
|
+
const s = freezeStats.byOrigin[row.key];
|
|
300
|
+
if (s) {
|
|
301
|
+
row.freezes = s.count;
|
|
302
|
+
row.worstFreezeMs = Math.round(s.maxMs);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const windowSpanMs = WINDOW_BUCKETS * BUCKET_MS;
|
|
306
|
+
return {
|
|
307
|
+
ts: Date.now(),
|
|
308
|
+
paused: this.paused,
|
|
309
|
+
busyPct: Math.min(100, Math.round(busy / windowSpanMs * 1000) / 10),
|
|
310
|
+
busyHistory: busyHistory(t),
|
|
311
|
+
tiers: {
|
|
312
|
+
...this.tiers
|
|
313
|
+
},
|
|
314
|
+
rows,
|
|
315
|
+
totals: {
|
|
316
|
+
attributedWindowMs: Math.round(attributed * 10) / 10,
|
|
317
|
+
unattributedWindowMs: Math.round(unattributed * 10) / 10,
|
|
318
|
+
windowMs: windowSpanMs
|
|
319
|
+
},
|
|
320
|
+
freezeSummary: {
|
|
321
|
+
count: freezeStats.count,
|
|
322
|
+
worstMs: Math.round(freezeStats.worstMs)
|
|
323
|
+
},
|
|
324
|
+
longtasks: this.longtaskProvider ? this.longtaskProvider() : []
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
emitSnapshot() {
|
|
328
|
+
this.snapshot = this.buildSnapshot();
|
|
329
|
+
this.subscribers.forEach(fn => {
|
|
330
|
+
try {
|
|
331
|
+
fn(this.snapshot);
|
|
332
|
+
} catch (err) {
|
|
333
|
+
if (__DEV__) {
|
|
334
|
+
// eslint-disable-next-line no-console
|
|
335
|
+
console.error("[js-top] snapshot subscriber threw", err);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/** Engine active state, for diagnostics/tests. */
|
|
342
|
+
isEngineActive() {
|
|
343
|
+
return isActive();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
export const JsTopController = new JsTopControllerImpl();
|
|
347
|
+
//# sourceMappingURL=JsTopController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AppState","BUCKET_MS","WINDOW_BUCKETS","SNAPSHOT_ROWS","now","setActive","isActive","installTimerPatches","installMicrotaskPatches","busyHistory","resetAggregator","windowAttributedMs","windowBusyMs","windowResidualBuckets","buildRows","getOriginDetailBase","resetOrigins","startBusyProbe","stopBusyProbe","suppressNextGap","getOriginals","loadJsTopPrefs","saveJsTopPrefs","NOTIFY_INTERVAL_MS","JsTopControllerImpl","enabled","enabledLoaded","paused","remoteSampling","engineRunning","tiers","timers","promises","bridge","longtask","notifyHandle","appStateSub","snapshot","buildSnapshot","subscribers","Set","enabledSubscribers","tierInstallers","longtaskProvider","freezeStatsProvider","clearHooks","constructor","then","prefs","setEnabled","subscribe","fn","add","syncEngineState","delete","subscribeEnabled","on","forEach","err","__DEV__","console","error","isEnabled","setRemoteSampling","isRemoteSampling","getStatus","pause","emitSnapshot","resume","clear","hook","registerClearHook","push","getSnapshot","getOriginDetail","key","t","busy","freezeStats","Date","freezes","byOrigin","buckets","windowMs","Math","round","reduce","sum","ms","label","api","promoted","scheduleCount","calls","totalMs","avgMs","maxMs","pctOfBusy","min","lastSeenAgoMs","count","worstFreezeMs","base","registerTierInstaller","install","Object","assign","runInstaller","registerLongtaskProvider","registerFreezeStatsProvider","shouldRun","size","want","startEngine","stopEngine","addEventListener","setInterval","clearInterval","remove","attributed","unattributed","max","rows","sort","a","b","worstMs","row","s","windowSpanMs","ts","busyPct","totals","attributedWindowMs","unattributedWindowMs","freezeSummary","longtasks","isEngineActive","JsTopController"],"sourceRoot":"../../../../src","sources":["js-top/engine/JsTopController.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Global per-bucket accounting: the engine's clock is divided into 250ms
|
|
5
|
+
* buckets (epochs). Each bucket tracks measured busy ms (from the probe) and
|
|
6
|
+
* attributed ms (from wrapped tasks); `unattributed = busy − attributed` per
|
|
7
|
+
* bucket is what keeps the table honest when work enters the thread through
|
|
8
|
+
* a path we can't wrap (bridgeless events, React commits, async/await).
|
|
9
|
+
*
|
|
10
|
+
* Rings are epoch-stamped parallel arrays: a slot is only valid when its
|
|
11
|
+
* stamp matches the epoch being read, so stale slots cost nothing to skip
|
|
12
|
+
* and nothing to zero eagerly.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { BUCKET_MS, HISTORY_BUCKETS, WINDOW_BUCKETS } from "../types";
|
|
16
|
+
const busyMs = new Float64Array(HISTORY_BUCKETS);
|
|
17
|
+
const attributedMs = new Float64Array(HISTORY_BUCKETS);
|
|
18
|
+
const longtaskMs = new Float64Array(HISTORY_BUCKETS);
|
|
19
|
+
const stamps = new Float64Array(HISTORY_BUCKETS).fill(-1);
|
|
20
|
+
export function epochOf(t) {
|
|
21
|
+
return Math.floor(t / BUCKET_MS);
|
|
22
|
+
}
|
|
23
|
+
function slotFor(epoch) {
|
|
24
|
+
const i = epoch % HISTORY_BUCKETS;
|
|
25
|
+
if (stamps[i] !== epoch) {
|
|
26
|
+
stamps[i] = epoch;
|
|
27
|
+
busyMs[i] = 0;
|
|
28
|
+
attributedMs[i] = 0;
|
|
29
|
+
longtaskMs[i] = 0;
|
|
30
|
+
}
|
|
31
|
+
return i;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Distribute a wall-clock span across the buckets it overlaps. Spans older
|
|
36
|
+
* than the history ring are clamped — a pathological hours-long gap books at
|
|
37
|
+
* most one ring's worth of buckets.
|
|
38
|
+
*/
|
|
39
|
+
function distribute(start, end, add) {
|
|
40
|
+
if (!(end > start)) return;
|
|
41
|
+
const clampedStart = Math.max(start, end - HISTORY_BUCKETS * BUCKET_MS);
|
|
42
|
+
let e = epochOf(clampedStart);
|
|
43
|
+
const lastEpoch = epochOf(end);
|
|
44
|
+
let cursor = clampedStart;
|
|
45
|
+
while (e <= lastEpoch) {
|
|
46
|
+
const bucketEnd = (e + 1) * BUCKET_MS;
|
|
47
|
+
const sliceEnd = Math.min(end, bucketEnd);
|
|
48
|
+
const ms = sliceEnd - cursor;
|
|
49
|
+
if (ms > 0) add(slotFor(e), ms);
|
|
50
|
+
cursor = sliceEnd;
|
|
51
|
+
e++;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Book probe-measured busy time over [start, end], capped per bucket. */
|
|
56
|
+
export function bookBusyRange(start, end) {
|
|
57
|
+
distribute(start, end, (i, ms) => {
|
|
58
|
+
busyMs[i] = Math.min(BUCKET_MS, busyMs[i] + ms);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Book a task's exclusive ms, spread proportionally over its wall span.
|
|
64
|
+
* (Exclusive time isn't contiguous when children interleave; proportional
|
|
65
|
+
* spread is exact at 250ms-bucket granularity for all practical tasks.)
|
|
66
|
+
*/
|
|
67
|
+
export function bookAttributedRange(start, end, exclusiveMs) {
|
|
68
|
+
const span = end - start;
|
|
69
|
+
if (!(span > 0) || !(exclusiveMs > 0)) return;
|
|
70
|
+
const ratio = Math.min(1, exclusiveMs / span);
|
|
71
|
+
distribute(start, end, (i, ms) => {
|
|
72
|
+
attributedMs[i] = Math.min(BUCKET_MS, attributedMs[i] + ms * ratio);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Book a reported longtask span (for history display only). */
|
|
77
|
+
export function bookLongtaskRange(start, end) {
|
|
78
|
+
distribute(start, end, (i, ms) => {
|
|
79
|
+
longtaskMs[i] = Math.min(BUCKET_MS, longtaskMs[i] + ms);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function sumWindow(arr, nowT, buckets) {
|
|
83
|
+
const current = epochOf(nowT);
|
|
84
|
+
let sum = 0;
|
|
85
|
+
for (let e = current - buckets + 1; e <= current; e++) {
|
|
86
|
+
const i = e % HISTORY_BUCKETS;
|
|
87
|
+
if (i >= 0 && stamps[i] === e) sum += arr[i];
|
|
88
|
+
}
|
|
89
|
+
return sum;
|
|
90
|
+
}
|
|
91
|
+
export function windowBusyMs(nowT) {
|
|
92
|
+
return sumWindow(busyMs, nowT, WINDOW_BUCKETS);
|
|
93
|
+
}
|
|
94
|
+
export function windowAttributedMs(nowT) {
|
|
95
|
+
return sumWindow(attributedMs, nowT, WINDOW_BUCKETS);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Per-bucket UNATTRIBUTED ms (busy − attributed), oldest→newest over the
|
|
100
|
+
* rolling window — the "system" row's activity trend for the detail view.
|
|
101
|
+
*/
|
|
102
|
+
export function windowResidualBuckets(nowT) {
|
|
103
|
+
const current = epochOf(nowT);
|
|
104
|
+
const out = [];
|
|
105
|
+
for (let e = current - WINDOW_BUCKETS + 1; e <= current; e++) {
|
|
106
|
+
const i = e % HISTORY_BUCKETS;
|
|
107
|
+
if (i >= 0 && stamps[i] === e) {
|
|
108
|
+
out.push(Math.max(0, Math.round((busyMs[i] - attributedMs[i]) * 10) / 10));
|
|
109
|
+
} else {
|
|
110
|
+
out.push(0);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Per-bucket busy%, oldest→newest, over the full 30s history ring. */
|
|
117
|
+
export function busyHistory(nowT) {
|
|
118
|
+
const current = epochOf(nowT);
|
|
119
|
+
const out = [];
|
|
120
|
+
for (let e = current - HISTORY_BUCKETS + 1; e <= current; e++) {
|
|
121
|
+
const i = e % HISTORY_BUCKETS;
|
|
122
|
+
if (i >= 0 && stamps[i] === e) {
|
|
123
|
+
out.push(Math.round(busyMs[i] / BUCKET_MS * 100));
|
|
124
|
+
} else {
|
|
125
|
+
out.push(0);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Trim the leading dead zone from before the engine started.
|
|
129
|
+
let firstLive = 0;
|
|
130
|
+
while (firstLive < out.length && out[firstLive] === 0) firstLive++;
|
|
131
|
+
return out.slice(Math.max(0, Math.min(firstLive, out.length - 1)));
|
|
132
|
+
}
|
|
133
|
+
export function resetAggregator() {
|
|
134
|
+
stamps.fill(-1);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=aggregator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BUCKET_MS","HISTORY_BUCKETS","WINDOW_BUCKETS","busyMs","Float64Array","attributedMs","longtaskMs","stamps","fill","epochOf","t","Math","floor","slotFor","epoch","i","distribute","start","end","add","clampedStart","max","e","lastEpoch","cursor","bucketEnd","sliceEnd","min","ms","bookBusyRange","bookAttributedRange","exclusiveMs","span","ratio","bookLongtaskRange","sumWindow","arr","nowT","buckets","current","sum","windowBusyMs","windowAttributedMs","windowResidualBuckets","out","push","round","busyHistory","firstLive","length","slice","resetAggregator"],"sourceRoot":"../../../../src","sources":["js-top/engine/aggregator.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,eAAe,EAAEC,cAAc,QAAQ,UAAU;AAErE,MAAMC,MAAM,GAAG,IAAIC,YAAY,CAACH,eAAe,CAAC;AAChD,MAAMI,YAAY,GAAG,IAAID,YAAY,CAACH,eAAe,CAAC;AACtD,MAAMK,UAAU,GAAG,IAAIF,YAAY,CAACH,eAAe,CAAC;AACpD,MAAMM,MAAM,GAAG,IAAIH,YAAY,CAACH,eAAe,CAAC,CAACO,IAAI,CAAC,CAAC,CAAC,CAAC;AAEzD,OAAO,SAASC,OAAOA,CAACC,CAAS,EAAU;EACzC,OAAOC,IAAI,CAACC,KAAK,CAACF,CAAC,GAAGV,SAAS,CAAC;AAClC;AAEA,SAASa,OAAOA,CAACC,KAAa,EAAU;EACtC,MAAMC,CAAC,GAAGD,KAAK,GAAGb,eAAe;EACjC,IAAIM,MAAM,CAACQ,CAAC,CAAC,KAAKD,KAAK,EAAE;IACvBP,MAAM,CAACQ,CAAC,CAAC,GAAGD,KAAK;IACjBX,MAAM,CAACY,CAAC,CAAC,GAAG,CAAC;IACbV,YAAY,CAACU,CAAC,CAAC,GAAG,CAAC;IACnBT,UAAU,CAACS,CAAC,CAAC,GAAG,CAAC;EACnB;EACA,OAAOA,CAAC;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASC,UAAUA,CACjBC,KAAa,EACbC,GAAW,EACXC,GAAuC,EACjC;EACN,IAAI,EAAED,GAAG,GAAGD,KAAK,CAAC,EAAE;EACpB,MAAMG,YAAY,GAAGT,IAAI,CAACU,GAAG,CAACJ,KAAK,EAAEC,GAAG,GAAGjB,eAAe,GAAGD,SAAS,CAAC;EACvE,IAAIsB,CAAC,GAAGb,OAAO,CAACW,YAAY,CAAC;EAC7B,MAAMG,SAAS,GAAGd,OAAO,CAACS,GAAG,CAAC;EAC9B,IAAIM,MAAM,GAAGJ,YAAY;EACzB,OAAOE,CAAC,IAAIC,SAAS,EAAE;IACrB,MAAME,SAAS,GAAG,CAACH,CAAC,GAAG,CAAC,IAAItB,SAAS;IACrC,MAAM0B,QAAQ,GAAGf,IAAI,CAACgB,GAAG,CAACT,GAAG,EAAEO,SAAS,CAAC;IACzC,MAAMG,EAAE,GAAGF,QAAQ,GAAGF,MAAM;IAC5B,IAAII,EAAE,GAAG,CAAC,EAAET,GAAG,CAACN,OAAO,CAACS,CAAC,CAAC,EAAEM,EAAE,CAAC;IAC/BJ,MAAM,GAAGE,QAAQ;IACjBJ,CAAC,EAAE;EACL;AACF;;AAEA;AACA,OAAO,SAASO,aAAaA,CAACZ,KAAa,EAAEC,GAAW,EAAQ;EAC9DF,UAAU,CAACC,KAAK,EAAEC,GAAG,EAAE,CAACH,CAAC,EAAEa,EAAE,KAAK;IAChCzB,MAAM,CAACY,CAAC,CAAC,GAAGJ,IAAI,CAACgB,GAAG,CAAC3B,SAAS,EAAEG,MAAM,CAACY,CAAC,CAAC,GAAGa,EAAE,CAAC;EACjD,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,mBAAmBA,CACjCb,KAAa,EACbC,GAAW,EACXa,WAAmB,EACb;EACN,MAAMC,IAAI,GAAGd,GAAG,GAAGD,KAAK;EACxB,IAAI,EAAEe,IAAI,GAAG,CAAC,CAAC,IAAI,EAAED,WAAW,GAAG,CAAC,CAAC,EAAE;EACvC,MAAME,KAAK,GAAGtB,IAAI,CAACgB,GAAG,CAAC,CAAC,EAAEI,WAAW,GAAGC,IAAI,CAAC;EAC7ChB,UAAU,CAACC,KAAK,EAAEC,GAAG,EAAE,CAACH,CAAC,EAAEa,EAAE,KAAK;IAChCvB,YAAY,CAACU,CAAC,CAAC,GAAGJ,IAAI,CAACgB,GAAG,CAAC3B,SAAS,EAAEK,YAAY,CAACU,CAAC,CAAC,GAAGa,EAAE,GAAGK,KAAK,CAAC;EACrE,CAAC,CAAC;AACJ;;AAEA;AACA,OAAO,SAASC,iBAAiBA,CAACjB,KAAa,EAAEC,GAAW,EAAQ;EAClEF,UAAU,CAACC,KAAK,EAAEC,GAAG,EAAE,CAACH,CAAC,EAAEa,EAAE,KAAK;IAChCtB,UAAU,CAACS,CAAC,CAAC,GAAGJ,IAAI,CAACgB,GAAG,CAAC3B,SAAS,EAAEM,UAAU,CAACS,CAAC,CAAC,GAAGa,EAAE,CAAC;EACzD,CAAC,CAAC;AACJ;AAEA,SAASO,SAASA,CAACC,GAAiB,EAAEC,IAAY,EAAEC,OAAe,EAAU;EAC3E,MAAMC,OAAO,GAAG9B,OAAO,CAAC4B,IAAI,CAAC;EAC7B,IAAIG,GAAG,GAAG,CAAC;EACX,KAAK,IAAIlB,CAAC,GAAGiB,OAAO,GAAGD,OAAO,GAAG,CAAC,EAAEhB,CAAC,IAAIiB,OAAO,EAAEjB,CAAC,EAAE,EAAE;IACrD,MAAMP,CAAC,GAAGO,CAAC,GAAGrB,eAAe;IAC7B,IAAIc,CAAC,IAAI,CAAC,IAAIR,MAAM,CAACQ,CAAC,CAAC,KAAKO,CAAC,EAAEkB,GAAG,IAAIJ,GAAG,CAACrB,CAAC,CAAC;EAC9C;EACA,OAAOyB,GAAG;AACZ;AAEA,OAAO,SAASC,YAAYA,CAACJ,IAAY,EAAU;EACjD,OAAOF,SAAS,CAAChC,MAAM,EAAEkC,IAAI,EAAEnC,cAAc,CAAC;AAChD;AAEA,OAAO,SAASwC,kBAAkBA,CAACL,IAAY,EAAU;EACvD,OAAOF,SAAS,CAAC9B,YAAY,EAAEgC,IAAI,EAAEnC,cAAc,CAAC;AACtD;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASyC,qBAAqBA,CAACN,IAAY,EAAY;EAC5D,MAAME,OAAO,GAAG9B,OAAO,CAAC4B,IAAI,CAAC;EAC7B,MAAMO,GAAa,GAAG,EAAE;EACxB,KAAK,IAAItB,CAAC,GAAGiB,OAAO,GAAGrC,cAAc,GAAG,CAAC,EAAEoB,CAAC,IAAIiB,OAAO,EAAEjB,CAAC,EAAE,EAAE;IAC5D,MAAMP,CAAC,GAAGO,CAAC,GAAGrB,eAAe;IAC7B,IAAIc,CAAC,IAAI,CAAC,IAAIR,MAAM,CAACQ,CAAC,CAAC,KAAKO,CAAC,EAAE;MAC7BsB,GAAG,CAACC,IAAI,CAAClC,IAAI,CAACU,GAAG,CAAC,CAAC,EAAEV,IAAI,CAACmC,KAAK,CAAC,CAAC3C,MAAM,CAACY,CAAC,CAAC,GAAGV,YAAY,CAACU,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5E,CAAC,MAAM;MACL6B,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC;IACb;EACF;EACA,OAAOD,GAAG;AACZ;;AAEA;AACA,OAAO,SAASG,WAAWA,CAACV,IAAY,EAAY;EAClD,MAAME,OAAO,GAAG9B,OAAO,CAAC4B,IAAI,CAAC;EAC7B,MAAMO,GAAa,GAAG,EAAE;EACxB,KAAK,IAAItB,CAAC,GAAGiB,OAAO,GAAGtC,eAAe,GAAG,CAAC,EAAEqB,CAAC,IAAIiB,OAAO,EAAEjB,CAAC,EAAE,EAAE;IAC7D,MAAMP,CAAC,GAAGO,CAAC,GAAGrB,eAAe;IAC7B,IAAIc,CAAC,IAAI,CAAC,IAAIR,MAAM,CAACQ,CAAC,CAAC,KAAKO,CAAC,EAAE;MAC7BsB,GAAG,CAACC,IAAI,CAAClC,IAAI,CAACmC,KAAK,CAAE3C,MAAM,CAACY,CAAC,CAAC,GAAGf,SAAS,GAAI,GAAG,CAAC,CAAC;IACrD,CAAC,MAAM;MACL4C,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC;IACb;EACF;EACA;EACA,IAAIG,SAAS,GAAG,CAAC;EACjB,OAAOA,SAAS,GAAGJ,GAAG,CAACK,MAAM,IAAIL,GAAG,CAACI,SAAS,CAAC,KAAK,CAAC,EAAEA,SAAS,EAAE;EAClE,OAAOJ,GAAG,CAACM,KAAK,CAACvC,IAAI,CAACU,GAAG,CAAC,CAAC,EAAEV,IAAI,CAACgB,GAAG,CAACqB,SAAS,EAAEJ,GAAG,CAACK,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACpE;AAEA,OAAO,SAASE,eAAeA,CAAA,EAAS;EACtC5C,MAAM,CAACC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB","ignoreList":[]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Busy probe — measures true JS-thread occupancy from timer-gap inflation.
|
|
5
|
+
*
|
|
6
|
+
* A 16ms heartbeat (created with the PRE-PATCH setInterval so the probe never
|
|
7
|
+
* appears in its own table) can only fire when the thread yields; any gap
|
|
8
|
+
* beyond the calibrated idle baseline is time the thread was busy. This is
|
|
9
|
+
* the same physical signal as perf-monitor's stall-aware sampler, at higher
|
|
10
|
+
* frequency: multi-second stalls simply arrive as one huge gap and are booked
|
|
11
|
+
* as fully-busy buckets by bookBusyRange (the backfill falls out of the
|
|
12
|
+
* range-distribution math; no separate synthetic-sample pass needed).
|
|
13
|
+
*
|
|
14
|
+
* Calibration: the nominal 16ms is never what a real device delivers at
|
|
15
|
+
* idle. We track a rolling min gap (3 one-second slots) and subtract THAT,
|
|
16
|
+
* otherwise idle devices read 10–20% phantom busy.
|
|
17
|
+
*
|
|
18
|
+
* AppState transitions also pause JS timers, so the controller flags them
|
|
19
|
+
* via suppressNextGap() — same trick as PerfMonitorController; AppState
|
|
20
|
+
* events arrive on the JS thread, so a genuine stall can never set the flag.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { now } from "./now";
|
|
24
|
+
import { getOriginals } from "./state";
|
|
25
|
+
import { bookBusyRange } from "./aggregator";
|
|
26
|
+
const PROBE_INTERVAL_MS = 16;
|
|
27
|
+
/** Ignore gaps below this when calibrating (a busy tick isn't a baseline). */
|
|
28
|
+
const CALIBRATION_MAX_GAP_MS = 100;
|
|
29
|
+
const BASELINE_SLOTS = 3;
|
|
30
|
+
const MIN_BASELINE_MS = 8;
|
|
31
|
+
let handle = null;
|
|
32
|
+
let lastAt = 0;
|
|
33
|
+
let suppressNext = false;
|
|
34
|
+
let slotMins = [];
|
|
35
|
+
let currentSlotMin = Infinity;
|
|
36
|
+
let currentSlotStart = 0;
|
|
37
|
+
let baseline = PROBE_INTERVAL_MS;
|
|
38
|
+
function buoyJsTopProbeTick() {
|
|
39
|
+
const t = now();
|
|
40
|
+
const gap = lastAt > 0 ? t - lastAt : 0;
|
|
41
|
+
lastAt = t;
|
|
42
|
+
if (suppressNext) {
|
|
43
|
+
// Backgrounding/foregrounding paused timers — not a stall. Reset
|
|
44
|
+
// calibration too: refresh-rate or thermal state may have changed.
|
|
45
|
+
suppressNext = false;
|
|
46
|
+
currentSlotMin = Infinity;
|
|
47
|
+
currentSlotStart = t;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (gap <= 0) return;
|
|
51
|
+
if (gap < CALIBRATION_MAX_GAP_MS) {
|
|
52
|
+
if (gap < currentSlotMin) currentSlotMin = gap;
|
|
53
|
+
if (currentSlotStart === 0) currentSlotStart = t;
|
|
54
|
+
if (t - currentSlotStart >= 1000) {
|
|
55
|
+
slotMins.push(currentSlotMin);
|
|
56
|
+
if (slotMins.length > BASELINE_SLOTS) slotMins.shift();
|
|
57
|
+
baseline = Math.max(MIN_BASELINE_MS, Math.min(...slotMins));
|
|
58
|
+
currentSlotMin = Infinity;
|
|
59
|
+
currentSlotStart = t;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const busyExcess = gap - baseline;
|
|
63
|
+
if (busyExcess > 1) {
|
|
64
|
+
// The block ended when this tick finally fired — position it at the tail.
|
|
65
|
+
bookBusyRange(t - busyExcess, t);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function startBusyProbe() {
|
|
69
|
+
if (handle != null) return;
|
|
70
|
+
const originals = getOriginals();
|
|
71
|
+
lastAt = now();
|
|
72
|
+
suppressNext = false;
|
|
73
|
+
slotMins = [];
|
|
74
|
+
currentSlotMin = Infinity;
|
|
75
|
+
currentSlotStart = 0;
|
|
76
|
+
baseline = PROBE_INTERVAL_MS;
|
|
77
|
+
handle = originals.setInterval(buoyJsTopProbeTick, PROBE_INTERVAL_MS);
|
|
78
|
+
}
|
|
79
|
+
export function stopBusyProbe() {
|
|
80
|
+
if (handle != null) {
|
|
81
|
+
getOriginals().clearInterval(handle);
|
|
82
|
+
handle = null;
|
|
83
|
+
}
|
|
84
|
+
lastAt = 0;
|
|
85
|
+
}
|
|
86
|
+
export function suppressNextGap() {
|
|
87
|
+
suppressNext = true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Test-only. */
|
|
91
|
+
export function debugBaseline() {
|
|
92
|
+
return baseline;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=busyProbe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["now","getOriginals","bookBusyRange","PROBE_INTERVAL_MS","CALIBRATION_MAX_GAP_MS","BASELINE_SLOTS","MIN_BASELINE_MS","handle","lastAt","suppressNext","slotMins","currentSlotMin","Infinity","currentSlotStart","baseline","buoyJsTopProbeTick","t","gap","push","length","shift","Math","max","min","busyExcess","startBusyProbe","originals","setInterval","stopBusyProbe","clearInterval","suppressNextGap","debugBaseline"],"sourceRoot":"../../../../src","sources":["js-top/engine/busyProbe.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,GAAG,QAAQ,OAAO;AAC3B,SAASC,YAAY,QAAQ,SAAS;AACtC,SAASC,aAAa,QAAQ,cAAc;AAE5C,MAAMC,iBAAiB,GAAG,EAAE;AAC5B;AACA,MAAMC,sBAAsB,GAAG,GAAG;AAClC,MAAMC,cAAc,GAAG,CAAC;AACxB,MAAMC,eAAe,GAAG,CAAC;AAEzB,IAAIC,MAA6C,GAAG,IAAI;AACxD,IAAIC,MAAM,GAAG,CAAC;AACd,IAAIC,YAAY,GAAG,KAAK;AAExB,IAAIC,QAAkB,GAAG,EAAE;AAC3B,IAAIC,cAAc,GAAGC,QAAQ;AAC7B,IAAIC,gBAAgB,GAAG,CAAC;AACxB,IAAIC,QAAQ,GAAGX,iBAAiB;AAEhC,SAASY,kBAAkBA,CAAA,EAAS;EAClC,MAAMC,CAAC,GAAGhB,GAAG,CAAC,CAAC;EACf,MAAMiB,GAAG,GAAGT,MAAM,GAAG,CAAC,GAAGQ,CAAC,GAAGR,MAAM,GAAG,CAAC;EACvCA,MAAM,GAAGQ,CAAC;EACV,IAAIP,YAAY,EAAE;IAChB;IACA;IACAA,YAAY,GAAG,KAAK;IACpBE,cAAc,GAAGC,QAAQ;IACzBC,gBAAgB,GAAGG,CAAC;IACpB;EACF;EACA,IAAIC,GAAG,IAAI,CAAC,EAAE;EAEd,IAAIA,GAAG,GAAGb,sBAAsB,EAAE;IAChC,IAAIa,GAAG,GAAGN,cAAc,EAAEA,cAAc,GAAGM,GAAG;IAC9C,IAAIJ,gBAAgB,KAAK,CAAC,EAAEA,gBAAgB,GAAGG,CAAC;IAChD,IAAIA,CAAC,GAAGH,gBAAgB,IAAI,IAAI,EAAE;MAChCH,QAAQ,CAACQ,IAAI,CAACP,cAAc,CAAC;MAC7B,IAAID,QAAQ,CAACS,MAAM,GAAGd,cAAc,EAAEK,QAAQ,CAACU,KAAK,CAAC,CAAC;MACtDN,QAAQ,GAAGO,IAAI,CAACC,GAAG,CAAChB,eAAe,EAAEe,IAAI,CAACE,GAAG,CAAC,GAAGb,QAAQ,CAAC,CAAC;MAC3DC,cAAc,GAAGC,QAAQ;MACzBC,gBAAgB,GAAGG,CAAC;IACtB;EACF;EAEA,MAAMQ,UAAU,GAAGP,GAAG,GAAGH,QAAQ;EACjC,IAAIU,UAAU,GAAG,CAAC,EAAE;IAClB;IACAtB,aAAa,CAACc,CAAC,GAAGQ,UAAU,EAAER,CAAC,CAAC;EAClC;AACF;AAEA,OAAO,SAASS,cAAcA,CAAA,EAAS;EACrC,IAAIlB,MAAM,IAAI,IAAI,EAAE;EACpB,MAAMmB,SAAS,GAAGzB,YAAY,CAAC,CAAC;EAChCO,MAAM,GAAGR,GAAG,CAAC,CAAC;EACdS,YAAY,GAAG,KAAK;EACpBC,QAAQ,GAAG,EAAE;EACbC,cAAc,GAAGC,QAAQ;EACzBC,gBAAgB,GAAG,CAAC;EACpBC,QAAQ,GAAGX,iBAAiB;EAC5BI,MAAM,GAAGmB,SAAS,CAACC,WAAW,CAACZ,kBAAkB,EAAEZ,iBAAiB,CAAC;AACvE;AAEA,OAAO,SAASyB,aAAaA,CAAA,EAAS;EACpC,IAAIrB,MAAM,IAAI,IAAI,EAAE;IAClBN,YAAY,CAAC,CAAC,CAAC4B,aAAa,CAACtB,MAAM,CAAC;IACpCA,MAAM,GAAG,IAAI;EACf;EACAC,MAAM,GAAG,CAAC;AACZ;AAEA,OAAO,SAASsB,eAAeA,CAAA,EAAS;EACtCrB,YAAY,GAAG,IAAI;AACrB;;AAEA;AACA,OAAO,SAASsB,aAAaA,CAAA,EAAW;EACtC,OAAOjB,QAAQ;AACjB","ignoreList":[]}
|