@buoy-gg/highlight-updates 7.0.41 → 7.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +11 -71
  2. package/lib/commonjs/highlight-updates/HighlightUpdatesOverlay.js +1 -281
  3. package/lib/commonjs/highlight-updates/components/HighlightFilterView.js +1 -1474
  4. package/lib/commonjs/highlight-updates/components/HighlightUpdatesModal.js +1 -641
  5. package/lib/commonjs/highlight-updates/components/IdentifierBadge.js +1 -273
  6. package/lib/commonjs/highlight-updates/components/IsolatedRenderList.js +1 -188
  7. package/lib/commonjs/highlight-updates/components/ModalHeaderContent.js +1 -293
  8. package/lib/commonjs/highlight-updates/components/RenderCauseBadge.js +1 -508
  9. package/lib/commonjs/highlight-updates/components/RenderDetailView.js +1 -846
  10. package/lib/commonjs/highlight-updates/components/RenderHistoryViewer.js +1 -915
  11. package/lib/commonjs/highlight-updates/components/RenderListItem.js +1 -235
  12. package/lib/commonjs/highlight-updates/components/RendersCopySettingsView.js +1 -469
  13. package/lib/commonjs/highlight-updates/components/StatsDisplay.js +1 -73
  14. package/lib/commonjs/highlight-updates/types/copySettings.js +1 -107
  15. package/lib/commonjs/highlight-updates/utils/CommitProfiler.js +1 -455
  16. package/lib/commonjs/highlight-updates/utils/HighlightUpdatesController.js +1 -1929
  17. package/lib/commonjs/highlight-updates/utils/PerformanceLogger.js +26 -359
  18. package/lib/commonjs/highlight-updates/utils/ProfilerInterceptor.js +1 -371
  19. package/lib/commonjs/highlight-updates/utils/RenderCauseDetector.js +5 -1840
  20. package/lib/commonjs/highlight-updates/utils/RenderTracker.js +1 -952
  21. package/lib/commonjs/highlight-updates/utils/ViewTypeMapper.js +1 -264
  22. package/lib/commonjs/highlight-updates/utils/copySettingsStorage.js +1 -32
  23. package/lib/commonjs/highlight-updates/utils/devtoolsComponentNames.js +1 -188
  24. package/lib/commonjs/highlight-updates/utils/namedComposite.js +1 -41
  25. package/lib/commonjs/highlight-updates/utils/ownStateChanged.js +1 -103
  26. package/lib/commonjs/highlight-updates/utils/rawEventEmitter.js +1 -50
  27. package/lib/commonjs/highlight-updates/utils/rawEventEmitter.web.js +1 -12
  28. package/lib/commonjs/highlight-updates/utils/renderExportFormatter.js +1 -58
  29. package/lib/commonjs/highlight-updates/utils/rendersExportFormatter.js +1 -485
  30. package/lib/commonjs/highlight-updates/utils/screenElements.js +1 -1269
  31. package/lib/commonjs/highlight-updates/utils/tapMatch.js +1 -83
  32. package/lib/commonjs/highlight-updates/utils/testIDs.js +1 -68
  33. package/lib/commonjs/highlight-updates/utils/touchCapture.js +1 -277
  34. package/lib/commonjs/index.js +1 -429
  35. package/lib/commonjs/preset.js +1 -278
  36. package/lib/commonjs/sync/highlightUpdatesSyncAdapter.js +1 -235
  37. package/lib/module/highlight-updates/HighlightUpdatesOverlay.js +1 -274
  38. package/lib/module/highlight-updates/components/HighlightFilterView.js +1 -1468
  39. package/lib/module/highlight-updates/components/HighlightUpdatesModal.js +1 -634
  40. package/lib/module/highlight-updates/components/IdentifierBadge.js +1 -265
  41. package/lib/module/highlight-updates/components/IsolatedRenderList.js +1 -183
  42. package/lib/module/highlight-updates/components/ModalHeaderContent.js +1 -288
  43. package/lib/module/highlight-updates/components/RenderCauseBadge.js +1 -499
  44. package/lib/module/highlight-updates/components/RenderDetailView.js +1 -840
  45. package/lib/module/highlight-updates/components/RenderHistoryViewer.js +1 -908
  46. package/lib/module/highlight-updates/components/RenderListItem.js +1 -230
  47. package/lib/module/highlight-updates/components/RendersCopySettingsView.js +1 -465
  48. package/lib/module/highlight-updates/components/StatsDisplay.js +1 -70
  49. package/lib/module/highlight-updates/types/copySettings.js +1 -102
  50. package/lib/module/highlight-updates/utils/CommitProfiler.js +1 -451
  51. package/lib/module/highlight-updates/utils/HighlightUpdatesController.js +1 -1925
  52. package/lib/module/highlight-updates/utils/PerformanceLogger.js +26 -353
  53. package/lib/module/highlight-updates/utils/ProfilerInterceptor.js +1 -358
  54. package/lib/module/highlight-updates/utils/RenderCauseDetector.js +5 -1830
  55. package/lib/module/highlight-updates/utils/RenderTracker.js +1 -949
  56. package/lib/module/highlight-updates/utils/ViewTypeMapper.js +1 -255
  57. package/lib/module/highlight-updates/utils/copySettingsStorage.js +1 -26
  58. package/lib/module/highlight-updates/utils/devtoolsComponentNames.js +1 -178
  59. package/lib/module/highlight-updates/utils/namedComposite.js +1 -36
  60. package/lib/module/highlight-updates/utils/ownStateChanged.js +1 -98
  61. package/lib/module/highlight-updates/utils/rawEventEmitter.js +1 -46
  62. package/lib/module/highlight-updates/utils/rawEventEmitter.web.js +1 -3
  63. package/lib/module/highlight-updates/utils/renderExportFormatter.js +1 -54
  64. package/lib/module/highlight-updates/utils/rendersExportFormatter.js +1 -478
  65. package/lib/module/highlight-updates/utils/screenElements.js +1 -1263
  66. package/lib/module/highlight-updates/utils/tapMatch.js +1 -76
  67. package/lib/module/highlight-updates/utils/testIDs.js +1 -60
  68. package/lib/module/highlight-updates/utils/touchCapture.js +1 -270
  69. package/lib/module/index.js +1 -130
  70. package/lib/module/preset.js +1 -272
  71. package/lib/module/sync/highlightUpdatesSyncAdapter.js +1 -230
  72. package/lib/web/index.mjs +28 -29
  73. package/package.json +7 -7
  74. package/lib/typescript/highlight-updates/HighlightUpdatesOverlay.d.ts.map +0 -1
  75. package/lib/typescript/highlight-updates/components/HighlightFilterView.d.ts.map +0 -1
  76. package/lib/typescript/highlight-updates/components/HighlightUpdatesModal.d.ts.map +0 -1
  77. package/lib/typescript/highlight-updates/components/IdentifierBadge.d.ts.map +0 -1
  78. package/lib/typescript/highlight-updates/components/IsolatedRenderList.d.ts.map +0 -1
  79. package/lib/typescript/highlight-updates/components/ModalHeaderContent.d.ts.map +0 -1
  80. package/lib/typescript/highlight-updates/components/RenderCauseBadge.d.ts.map +0 -1
  81. package/lib/typescript/highlight-updates/components/RenderDetailView.d.ts.map +0 -1
  82. package/lib/typescript/highlight-updates/components/RenderHistoryViewer.d.ts.map +0 -1
  83. package/lib/typescript/highlight-updates/components/RenderListItem.d.ts.map +0 -1
  84. package/lib/typescript/highlight-updates/components/RendersCopySettingsView.d.ts.map +0 -1
  85. package/lib/typescript/highlight-updates/components/StatsDisplay.d.ts.map +0 -1
  86. package/lib/typescript/highlight-updates/types/copySettings.d.ts.map +0 -1
  87. package/lib/typescript/highlight-updates/utils/CommitProfiler.d.ts.map +0 -1
  88. package/lib/typescript/highlight-updates/utils/HighlightUpdatesController.d.ts.map +0 -1
  89. package/lib/typescript/highlight-updates/utils/PerformanceLogger.d.ts.map +0 -1
  90. package/lib/typescript/highlight-updates/utils/ProfilerInterceptor.d.ts.map +0 -1
  91. package/lib/typescript/highlight-updates/utils/RenderCauseDetector.d.ts.map +0 -1
  92. package/lib/typescript/highlight-updates/utils/RenderTracker.d.ts.map +0 -1
  93. package/lib/typescript/highlight-updates/utils/ViewTypeMapper.d.ts.map +0 -1
  94. package/lib/typescript/highlight-updates/utils/copySettingsStorage.d.ts.map +0 -1
  95. package/lib/typescript/highlight-updates/utils/devtoolsComponentNames.d.ts.map +0 -1
  96. package/lib/typescript/highlight-updates/utils/namedComposite.d.ts.map +0 -1
  97. package/lib/typescript/highlight-updates/utils/ownStateChanged.d.ts.map +0 -1
  98. package/lib/typescript/highlight-updates/utils/rawEventEmitter.d.ts.map +0 -1
  99. package/lib/typescript/highlight-updates/utils/rawEventEmitter.web.d.ts.map +0 -1
  100. package/lib/typescript/highlight-updates/utils/renderExportFormatter.d.ts.map +0 -1
  101. package/lib/typescript/highlight-updates/utils/rendersExportFormatter.d.ts.map +0 -1
  102. package/lib/typescript/highlight-updates/utils/screenElements.d.ts.map +0 -1
  103. package/lib/typescript/highlight-updates/utils/tapMatch.d.ts.map +0 -1
  104. package/lib/typescript/highlight-updates/utils/testIDs.d.ts.map +0 -1
  105. package/lib/typescript/highlight-updates/utils/touchCapture.d.ts.map +0 -1
  106. package/lib/typescript/index.d.ts.map +0 -1
  107. package/lib/typescript/preset.d.ts.map +0 -1
  108. package/lib/typescript/sync/highlightUpdatesSyncAdapter.d.ts.map +0 -1
@@ -1,359 +1,26 @@
1
- /**
2
- * PerformanceLogger
3
- *
4
- * Dedicated performance measurement utility for the Highlight Updates feature.
5
- * Tracks timing metrics across the render detection pipeline to identify bottlenecks
6
- * and measure optimization improvements.
7
- *
8
- * Usage:
9
- * PerformanceLogger.setEnabled(true); // Enable logging
10
- * const batch = PerformanceLogger.startBatch(nodesReceived);
11
- * batch.markFilteringComplete(nodesFiltered, nodesToProcess);
12
- * batch.markMeasurementComplete(successCount, failCount);
13
- * batch.markTrackingComplete();
14
- * batch.markCallbackComplete();
15
- * batch.finish(); // Logs the complete metrics
16
- */
17
-
18
- "use strict";
19
-
20
- // Declare performance API available in React Native's JavaScript environment
21
- Object.defineProperty(exports, "__esModule", {
22
- value: true
23
- });
24
- exports.default = exports.PerformanceLogger = void 0;
25
- exports.markEventReceived = markEventReceived;
26
- exports.markOverlayRendered = markOverlayRendered;
27
- // Track the last event timestamp to measure end-to-end latency
28
- let lastEventTimestamp = 0;
29
- let pendingBatchId = null;
30
-
31
- /**
32
- * Call this when a traceUpdates event is received to track end-to-end latency
33
- */
34
- function markEventReceived() {
35
- lastEventTimestamp = performance.now();
36
- return lastEventTimestamp;
37
- }
38
-
39
- /**
40
- * Call this from the overlay when highlights are actually rendered
41
- */
42
- function markOverlayRendered(highlightCount, renderTime) {
43
- if (lastEventTimestamp > 0 && highlightCount > 0) {
44
- // Reset to avoid double-counting (end-to-end logging removed - silent by default)
45
- lastEventTimestamp = 0;
46
- }
47
- }
48
-
49
- // Rolling statistics for summary logging
50
-
51
- class PerformanceLoggerSingleton {
52
- enabled = false;
53
- batchCounter = 0;
54
- listeners = new Set();
55
-
56
- // Rolling stats for periodic summaries
57
- rollingStats = {
58
- batchCount: 0,
59
- totalNodes: 0,
60
- totalFiltered: 0,
61
- totalProcessed: 0,
62
- totalTime: 0,
63
- maxTime: 0,
64
- minTime: Infinity,
65
- avgMeasurementTime: 0
66
- };
67
-
68
- // Recent batch history for analysis
69
- recentBatches = [];
70
- MAX_HISTORY = 100;
71
-
72
- // Summary logging interval
73
- summaryInterval = null;
74
- SUMMARY_INTERVAL_MS = 10000; // Log summary every 10s
75
-
76
- /**
77
- * Enable or disable performance logging
78
- */
79
- setEnabled(enabled) {
80
- const wasEnabled = this.enabled;
81
- this.enabled = enabled;
82
- if (enabled && !wasEnabled) {
83
- this.resetStats();
84
- // Summary interval removed - no periodic logging
85
- } else if (!enabled && wasEnabled) {
86
- this.stopSummaryInterval();
87
- }
88
- // Silent enable/disable - no console logs
89
- }
90
-
91
- /**
92
- * Check if logging is enabled
93
- */
94
- isEnabled() {
95
- return this.enabled;
96
- }
97
-
98
- /**
99
- * Start timing a new batch of render updates
100
- */
101
- startBatch(nodesReceived, batchSize) {
102
- const batchId = `batch_${++this.batchCounter}`;
103
- const startTime = performance.now();
104
- let filteringEndTime = null;
105
- let measurementStartTime = null;
106
- let measurementEndTime = null;
107
- let trackingEndTime = null;
108
- let callbackEndTime = null;
109
- let nodesFiltered = 0;
110
- let nodesToProcess = 0;
111
- let measurementSuccessCount = 0;
112
- let measurementFailCount = 0;
113
- let overlayRenderTime;
114
- const timer = {
115
- markFilteringComplete: (filtered, toProcess) => {
116
- filteringEndTime = performance.now();
117
- nodesFiltered = filtered;
118
- nodesToProcess = toProcess;
119
- },
120
- markMeasurementStart: () => {
121
- measurementStartTime = performance.now();
122
- },
123
- markMeasurementComplete: (success, fail) => {
124
- measurementEndTime = performance.now();
125
- measurementSuccessCount = success;
126
- measurementFailCount = fail;
127
- },
128
- markTrackingComplete: () => {
129
- trackingEndTime = performance.now();
130
- },
131
- markCallbackComplete: () => {
132
- callbackEndTime = performance.now();
133
- },
134
- setOverlayRenderTime: timeMs => {
135
- overlayRenderTime = timeMs;
136
- },
137
- getBatchId: () => batchId,
138
- finish: () => {
139
- const endTime = performance.now();
140
- const metrics = {
141
- batchId,
142
- timestamp: Date.now(),
143
- nodesReceived,
144
- nodesFiltered,
145
- nodesToProcess,
146
- batchSize,
147
- nodesInBatch: Math.min(nodesToProcess, batchSize),
148
- filteringTime: filteringEndTime ? filteringEndTime - startTime : 0,
149
- measurementTime: measurementStartTime && measurementEndTime ? measurementEndTime - measurementStartTime : 0,
150
- trackingTime: measurementEndTime && trackingEndTime ? trackingEndTime - measurementEndTime : 0,
151
- callbackTime: trackingEndTime && callbackEndTime ? callbackEndTime - trackingEndTime : 0,
152
- totalTime: endTime - startTime,
153
- measurementSuccessCount,
154
- measurementFailCount,
155
- overlayRenderTime
156
- };
157
- if (this.enabled) {
158
- this.recordMetrics(metrics);
159
- }
160
- return metrics;
161
- }
162
- };
163
- return timer;
164
- }
165
-
166
- /**
167
- * Record metrics and log them
168
- */
169
- recordMetrics(metrics) {
170
- // Update rolling stats
171
- this.rollingStats.batchCount++;
172
- this.rollingStats.totalNodes += metrics.nodesReceived;
173
- this.rollingStats.totalFiltered += metrics.nodesFiltered;
174
- this.rollingStats.totalProcessed += metrics.nodesInBatch;
175
- this.rollingStats.totalTime += metrics.totalTime;
176
- this.rollingStats.maxTime = Math.max(this.rollingStats.maxTime, metrics.totalTime);
177
- this.rollingStats.minTime = Math.min(this.rollingStats.minTime, metrics.totalTime);
178
-
179
- // Update rolling average for measurement time
180
- const prevAvg = this.rollingStats.avgMeasurementTime;
181
- const n = this.rollingStats.batchCount;
182
- this.rollingStats.avgMeasurementTime = prevAvg + (metrics.measurementTime - prevAvg) / n;
183
-
184
- // Store in history
185
- this.recentBatches.push(metrics);
186
- if (this.recentBatches.length > this.MAX_HISTORY) {
187
- this.recentBatches.shift();
188
- }
189
-
190
- // Notify listeners
191
- this.notifyListeners(metrics);
192
- }
193
-
194
- /**
195
- * Log a single batch's metrics
196
- */
197
- logBatch(metrics) {
198
- const {
199
- batchId,
200
- nodesReceived,
201
- nodesFiltered,
202
- nodesInBatch,
203
- batchSize,
204
- filteringTime,
205
- measurementTime,
206
- trackingTime,
207
- callbackTime,
208
- totalTime,
209
- measurementSuccessCount,
210
- measurementFailCount,
211
- overlayRenderTime
212
- } = metrics;
213
-
214
- // Compact single-line log for quick scanning
215
- console.log(`[HighlightPerf] ${batchId} | ` + `In:${nodesReceived} Filt:${nodesFiltered} Proc:${nodesInBatch}/${batchSize} | ` + `Filter:${filteringTime.toFixed(1)}ms Measure:${measurementTime.toFixed(1)}ms ` + `Track:${trackingTime.toFixed(1)}ms Callback:${callbackTime.toFixed(1)}ms | ` + `Total:${totalTime.toFixed(1)}ms` + (overlayRenderTime ? ` Render:${overlayRenderTime.toFixed(1)}ms` : "") + ` | Success:${measurementSuccessCount} Fail:${measurementFailCount}`);
216
-
217
- // Flag slow batches
218
- if (totalTime > 100) {
219
- console.warn(`[HighlightPerf] ⚠️ SLOW BATCH: ${totalTime.toFixed(1)}ms - ` + `Measurement phase: ${measurementTime.toFixed(1)}ms (${(measurementTime / totalTime * 100).toFixed(0)}%)`);
220
- }
221
- }
222
-
223
- /**
224
- * Log periodic summary stats
225
- */
226
- logSummary() {
227
- if (this.rollingStats.batchCount === 0) return;
228
- const stats = this.rollingStats;
229
- const avgTime = stats.totalTime / stats.batchCount;
230
- const avgNodes = stats.totalNodes / stats.batchCount;
231
- console.log(`\n[HighlightPerf] ════════ SUMMARY (last ${this.SUMMARY_INTERVAL_MS / 1000}s) ════════\n` + ` Batches: ${stats.batchCount}\n` + ` Avg nodes/batch: ${avgNodes.toFixed(1)} (filtered: ${(stats.totalFiltered / stats.batchCount).toFixed(1)})\n` + ` Avg total time: ${avgTime.toFixed(1)}ms\n` + ` Avg measurement time: ${stats.avgMeasurementTime.toFixed(1)}ms\n` + ` Min/Max time: ${stats.minTime.toFixed(1)}ms / ${stats.maxTime.toFixed(1)}ms\n` + `══════════════════════════════════════════════\n`);
232
-
233
- // Reset rolling stats for next interval
234
- this.resetStats();
235
- }
236
-
237
- /**
238
- * Reset rolling statistics
239
- */
240
- resetStats() {
241
- this.rollingStats = {
242
- batchCount: 0,
243
- totalNodes: 0,
244
- totalFiltered: 0,
245
- totalProcessed: 0,
246
- totalTime: 0,
247
- maxTime: 0,
248
- minTime: Infinity,
249
- avgMeasurementTime: 0
250
- };
251
- }
252
-
253
- /**
254
- * Start the summary logging interval
255
- */
256
- startSummaryInterval() {
257
- this.stopSummaryInterval();
258
- this.summaryInterval = setInterval(() => {
259
- this.logSummary();
260
- }, this.SUMMARY_INTERVAL_MS);
261
- }
262
-
263
- /**
264
- * Stop the summary logging interval
265
- */
266
- stopSummaryInterval() {
267
- if (this.summaryInterval) {
268
- clearInterval(this.summaryInterval);
269
- this.summaryInterval = null;
270
- }
271
- }
272
-
273
- /**
274
- * Subscribe to metrics updates
275
- */
276
- subscribe(listener) {
277
- this.listeners.add(listener);
278
- return () => {
279
- this.listeners.delete(listener);
280
- };
281
- }
282
-
283
- /**
284
- * Notify all listeners of new metrics
285
- */
286
- notifyListeners(metrics) {
287
- for (const listener of this.listeners) {
288
- try {
289
- listener(metrics);
290
- } catch (error) {
291
- console.error("[HighlightPerf] Error in metrics listener:", error);
292
- }
293
- }
294
- }
295
-
296
- /**
297
- * Get recent batch history
298
- */
299
- getRecentBatches() {
300
- return [...this.recentBatches];
301
- }
302
-
303
- /**
304
- * Get current rolling stats
305
- */
306
- getRollingStats() {
307
- return {
308
- ...this.rollingStats
309
- };
310
- }
311
-
312
- /**
313
- * Clear all history and stats
314
- */
315
- clear() {
316
- this.recentBatches = [];
317
- this.resetStats();
318
- this.batchCounter = 0;
319
- }
320
-
321
- /**
322
- * Generate a detailed report of recent performance
323
- */
324
- generateReport() {
325
- const batches = this.recentBatches;
326
- if (batches.length === 0) {
327
- return "No performance data collected yet.";
328
- }
329
- const totalTime = batches.reduce((sum, b) => sum + b.totalTime, 0);
330
- const avgTime = totalTime / batches.length;
331
- const totalMeasureTime = batches.reduce((sum, b) => sum + b.measurementTime, 0);
332
- const avgMeasureTime = totalMeasureTime / batches.length;
333
- const slowBatches = batches.filter(b => b.totalTime > 100);
334
- const fastBatches = batches.filter(b => b.totalTime < 20);
335
- const report = `
336
- ╔══════════════════════════════════════════════════════════════╗
337
- ║ HIGHLIGHT UPDATES PERFORMANCE REPORT ║
338
- ╠══════════════════════════════════════════════════════════════╣
339
- ║ Total batches analyzed: ${batches.length.toString().padStart(5)} ║
340
- ║ Average total time: ${avgTime.toFixed(1).padStart(5)}ms ║
341
- ║ Average measure time: ${avgMeasureTime.toFixed(1).padStart(5)}ms (${(avgMeasureTime / avgTime * 100).toFixed(0)}% of total) ║
342
- ╠══════════════════════════════════════════════════════════════╣
343
- ║ Fast batches (<20ms): ${fastBatches.length.toString().padStart(5)} (${(fastBatches.length / batches.length * 100).toFixed(0)}%) ║
344
- ║ Slow batches (>100ms): ${slowBatches.length.toString().padStart(5)} (${(slowBatches.length / batches.length * 100).toFixed(0)}%) ║
345
- ╠══════════════════════════════════════════════════════════════╣
346
- ║ Time breakdown (avg): ║
347
- ║ Filtering: ${batches.reduce((s, b) => s + b.filteringTime, 0 / batches.length).toFixed(1).padStart(6)}ms ║
348
- ║ Measurement: ${avgMeasureTime.toFixed(1).padStart(6)}ms ← Primary bottleneck ║
349
- ║ Tracking: ${(batches.reduce((s, b) => s + b.trackingTime, 0) / batches.length).toFixed(1).padStart(6)}ms ║
350
- ║ Callback: ${(batches.reduce((s, b) => s + b.callbackTime, 0) / batches.length).toFixed(1).padStart(6)}ms ║
351
- ╚══════════════════════════════════════════════════════════════╝
352
- `;
353
- return report;
354
- }
355
- }
356
-
357
- // Export singleton instance
358
- const PerformanceLogger = exports.PerformanceLogger = new PerformanceLoggerSingleton();
359
- var _default = exports.default = PerformanceLogger;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.default=exports.PerformanceLogger=void 0;exports.markEventReceived=markEventReceived;exports.markOverlayRendered=markOverlayRendered;let lastEventTimestamp=0;let pendingBatchId=null;function markEventReceived(){lastEventTimestamp=performance.now();return lastEventTimestamp}function markOverlayRendered(S,e){if(lastEventTimestamp>0&&S>0){lastEventTimestamp=0}}class PerformanceLoggerSingleton{enabled=false;batchCounter=0;listeners=new Set;rollingStats={batchCount:0,totalNodes:0,totalFiltered:0,totalProcessed:0,totalTime:0,maxTime:0,minTime:Infinity,avgMeasurementTime:0};recentBatches=[];MAX_HISTORY=100;summaryInterval=null;SUMMARY_INTERVAL_MS=1e4;setEnabled(e){const a=this.enabled;this.enabled=e;if(e&&!a){this.resetStats()}else if(!e&&a){this.stopSummaryInterval()}}isEnabled(){return this.enabled}startBatch(e,a){const r=`batch_${++this.batchCounter}`;const h=performance.now();let o=null;let l=null;let s=null;let i=null;let t=null;let n=0;let m=0;let u=0;let T=0;let g;const f={markFilteringComplete:(c,d)=>{o=performance.now();n=c;m=d},markMeasurementStart:()=>{l=performance.now()},markMeasurementComplete:(c,d)=>{s=performance.now();u=c;T=d},markTrackingComplete:()=>{i=performance.now()},markCallbackComplete:()=>{t=performance.now()},setOverlayRenderTime:c=>{g=c},getBatchId:()=>r,finish:()=>{const c=performance.now();const d={batchId:r,timestamp:Date.now(),nodesReceived:e,nodesFiltered:n,nodesToProcess:m,batchSize:a,nodesInBatch:Math.min(m,a),filteringTime:o?o-h:0,measurementTime:l&&s?s-l:0,trackingTime:s&&i?i-s:0,callbackTime:i&&t?t-i:0,totalTime:c-h,measurementSuccessCount:u,measurementFailCount:T,overlayRenderTime:g};if(this.enabled){this.recordMetrics(d)}return d}};return f}recordMetrics(e){this.rollingStats.batchCount++;this.rollingStats.totalNodes+=e.nodesReceived;this.rollingStats.totalFiltered+=e.nodesFiltered;this.rollingStats.totalProcessed+=e.nodesInBatch;this.rollingStats.totalTime+=e.totalTime;this.rollingStats.maxTime=Math.max(this.rollingStats.maxTime,e.totalTime);this.rollingStats.minTime=Math.min(this.rollingStats.minTime,e.totalTime);const a=this.rollingStats.avgMeasurementTime;const r=this.rollingStats.batchCount;this.rollingStats.avgMeasurementTime=a+(e.measurementTime-a)/r;this.recentBatches.push(e);if(this.recentBatches.length>this.MAX_HISTORY){this.recentBatches.shift()}this.notifyListeners(e)}logBatch(e){const{batchId:a,nodesReceived:r,nodesFiltered:h,nodesInBatch:o,batchSize:l,filteringTime:s,measurementTime:i,trackingTime:t,callbackTime:n,totalTime:m,measurementSuccessCount:u,measurementFailCount:T,overlayRenderTime:g}=e;console.log(`[HighlightPerf] ${a} | In:${r} Filt:${h} Proc:${o}/${l} | Filter:${s.toFixed(1)}ms Measure:${i.toFixed(1)}ms Track:${t.toFixed(1)}ms Callback:${n.toFixed(1)}ms | Total:${m.toFixed(1)}ms`+(g?` Render:${g.toFixed(1)}ms`:"")+` | Success:${u} Fail:${T}`);if(m>100){console.warn(`[HighlightPerf] \u26A0\uFE0F SLOW BATCH: ${m.toFixed(1)}ms - Measurement phase: ${i.toFixed(1)}ms (${(i/m*100).toFixed(0)}%)`)}}logSummary(){if(this.rollingStats.batchCount===0)return;const e=this.rollingStats;const a=e.totalTime/e.batchCount;const r=e.totalNodes/e.batchCount;console.log(`
2
+ [HighlightPerf] \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SUMMARY (last ${this.SUMMARY_INTERVAL_MS/1e3}s) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
3
+ Batches: ${e.batchCount}
4
+ Avg nodes/batch: ${r.toFixed(1)} (filtered: ${(e.totalFiltered/e.batchCount).toFixed(1)})
5
+ Avg total time: ${a.toFixed(1)}ms
6
+ Avg measurement time: ${e.avgMeasurementTime.toFixed(1)}ms
7
+ Min/Max time: ${e.minTime.toFixed(1)}ms / ${e.maxTime.toFixed(1)}ms
8
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
9
+ `);this.resetStats()}resetStats(){this.rollingStats={batchCount:0,totalNodes:0,totalFiltered:0,totalProcessed:0,totalTime:0,maxTime:0,minTime:Infinity,avgMeasurementTime:0}}startSummaryInterval(){this.stopSummaryInterval();this.summaryInterval=setInterval(()=>{this.logSummary()},this.SUMMARY_INTERVAL_MS)}stopSummaryInterval(){if(this.summaryInterval){clearInterval(this.summaryInterval);this.summaryInterval=null}}subscribe(e){this.listeners.add(e);return()=>{this.listeners.delete(e)}}notifyListeners(e){for(const a of this.listeners){try{a(e)}catch(r){console.error("[HighlightPerf] Error in metrics listener:",r)}}}getRecentBatches(){return[...this.recentBatches]}getRollingStats(){return{...this.rollingStats}}clear(){this.recentBatches=[];this.resetStats();this.batchCounter=0}generateReport(){const e=this.recentBatches;if(e.length===0){return"No performance data collected yet."}const a=e.reduce((t,n)=>t+n.totalTime,0);const r=a/e.length;const h=e.reduce((t,n)=>t+n.measurementTime,0);const o=h/e.length;const l=e.filter(t=>t.totalTime>100);const s=e.filter(t=>t.totalTime<20);const i=`
10
+ \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
11
+ \u2551 HIGHLIGHT UPDATES PERFORMANCE REPORT \u2551
12
+ \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563
13
+ \u2551 Total batches analyzed: ${e.length.toString().padStart(5)} \u2551
14
+ \u2551 Average total time: ${r.toFixed(1).padStart(5)}ms \u2551
15
+ \u2551 Average measure time: ${o.toFixed(1).padStart(5)}ms (${(o/r*100).toFixed(0)}% of total) \u2551
16
+ \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563
17
+ \u2551 Fast batches (<20ms): ${s.length.toString().padStart(5)} (${(s.length/e.length*100).toFixed(0)}%) \u2551
18
+ \u2551 Slow batches (>100ms): ${l.length.toString().padStart(5)} (${(l.length/e.length*100).toFixed(0)}%) \u2551
19
+ \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563
20
+ \u2551 Time breakdown (avg): \u2551
21
+ \u2551 Filtering: ${e.reduce((t,n)=>t+n.filteringTime,0/e.length).toFixed(1).padStart(6)}ms \u2551
22
+ \u2551 Measurement: ${o.toFixed(1).padStart(6)}ms \u2190 Primary bottleneck \u2551
23
+ \u2551 Tracking: ${(e.reduce((t,n)=>t+n.trackingTime,0)/e.length).toFixed(1).padStart(6)}ms \u2551
24
+ \u2551 Callback: ${(e.reduce((t,n)=>t+n.callbackTime,0)/e.length).toFixed(1).padStart(6)}ms \u2551
25
+ \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
26
+ `;return i}}const PerformanceLogger=exports.PerformanceLogger=new PerformanceLoggerSingleton;var _default=exports.default=PerformanceLogger;