@grafana/scenes 6.33.1--canary.1235.17401475625.0 → 6.34.0--canary.1221.17416885253.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafana/scenes",
3
- "version": "6.33.1--canary.1235.17401475625.0",
3
+ "version": "6.34.0--canary.1221.17416885253.0",
4
4
  "description": "Grafana framework for building dynamic dashboards",
5
5
  "author": "Grafana Labs",
6
6
  "license": "Apache-2.0",
@@ -125,5 +125,5 @@
125
125
  "prettier --write"
126
126
  ]
127
127
  },
128
- "gitHead": "950a6c194497a39a7be18f1afe334b50b3000c6b"
128
+ "gitHead": "ac9b8e09b0f0cdf2f3476684de347f313f5263ba"
129
129
  }
@@ -1,185 +0,0 @@
1
- import { writeSceneLog } from '../utils/writeSceneLog.js';
2
-
3
- var __typeError = (msg) => {
4
- throw TypeError(msg);
5
- };
6
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
7
- var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
8
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
9
- var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
10
- var _isTracking, _callback, _frameTrackingId, _lastFrameTime, _loafObserver;
11
- const LONG_FRAME_THRESHOLD = 50;
12
- class LongFrameDetector {
13
- constructor() {
14
- __privateAdd(this, _isTracking, false);
15
- __privateAdd(this, _callback, null);
16
- // Manual tracking state
17
- __privateAdd(this, _frameTrackingId, null);
18
- __privateAdd(this, _lastFrameTime, 0);
19
- // LoAF tracking state
20
- __privateAdd(this, _loafObserver, null);
21
- /**
22
- * Measure frame durations using requestAnimationFrame
23
- */
24
- this.measureFrames = () => {
25
- if (!__privateGet(this, _isTracking)) {
26
- return;
27
- }
28
- const currentFrameTime = performance.now();
29
- const frameLength = currentFrameTime - __privateGet(this, _lastFrameTime);
30
- if (frameLength > LONG_FRAME_THRESHOLD) {
31
- const event = {
32
- duration: frameLength,
33
- timestamp: currentFrameTime,
34
- method: "manual"
35
- };
36
- if (__privateGet(this, _callback)) {
37
- __privateGet(this, _callback).call(this, event);
38
- }
39
- if (typeof performance !== "undefined" && performance.mark && performance.measure) {
40
- const frameId = `long-frame-manual-${currentFrameTime.toFixed(0)}`;
41
- const startMarkName = `${frameId}-start`;
42
- const endMarkName = `${frameId}-end`;
43
- const measureName = `Long Frame (Manual): ${frameLength.toFixed(1)}ms`;
44
- try {
45
- performance.mark(startMarkName, { startTime: currentFrameTime - frameLength });
46
- performance.mark(endMarkName, { startTime: currentFrameTime });
47
- performance.measure(measureName, startMarkName, endMarkName);
48
- } catch (e) {
49
- performance.mark(measureName);
50
- }
51
- }
52
- writeSceneLog(
53
- "LongFrameDetector",
54
- `Long frame detected (manual): ${frameLength}ms (threshold: ${LONG_FRAME_THRESHOLD}ms)`
55
- );
56
- }
57
- __privateSet(this, _lastFrameTime, currentFrameTime);
58
- if (__privateGet(this, _isTracking)) {
59
- __privateSet(this, _frameTrackingId, requestAnimationFrame(this.measureFrames));
60
- }
61
- };
62
- }
63
- /**
64
- * Check if LoAF API is available in the browser
65
- */
66
- isLoAFAvailable() {
67
- return typeof PerformanceObserver !== "undefined" && PerformanceObserver.supportedEntryTypes && PerformanceObserver.supportedEntryTypes.includes("long-animation-frame");
68
- }
69
- /**
70
- * Start detecting long frames and call the provided callback when they occur
71
- */
72
- start(callback) {
73
- if (__privateGet(this, _isTracking)) {
74
- writeSceneLog("LongFrameDetector", "Already tracking frames, stopping previous session");
75
- this.stop();
76
- }
77
- __privateSet(this, _callback, callback);
78
- __privateSet(this, _isTracking, true);
79
- if (this.isLoAFAvailable()) {
80
- this.startLoAFTracking();
81
- } else {
82
- this.startManualFrameTracking();
83
- }
84
- writeSceneLog(
85
- "LongFrameDetector",
86
- `Started tracking with ${this.isLoAFAvailable() ? "LoAF API" : "manual"} method, threshold: ${LONG_FRAME_THRESHOLD}ms`
87
- );
88
- }
89
- /**
90
- * Stop detecting long frames
91
- */
92
- stop() {
93
- if (!__privateGet(this, _isTracking)) {
94
- return;
95
- }
96
- __privateSet(this, _isTracking, false);
97
- __privateSet(this, _callback, null);
98
- this.stopLoAFTracking();
99
- this.stopManualFrameTracking();
100
- }
101
- /**
102
- * Check if currently tracking frames
103
- */
104
- isTracking() {
105
- return __privateGet(this, _isTracking);
106
- }
107
- /**
108
- * Start tracking using the Long Animation Frame API
109
- * @see https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongAnimationFrameTiming
110
- */
111
- startLoAFTracking() {
112
- if (!this.isLoAFAvailable()) {
113
- writeSceneLog("LongFrameDetector", "LoAF API not available, falling back to manual tracking");
114
- this.startManualFrameTracking();
115
- return;
116
- }
117
- try {
118
- __privateSet(this, _loafObserver, new PerformanceObserver((list) => {
119
- for (const entry of list.getEntries()) {
120
- const event = {
121
- duration: entry.duration,
122
- timestamp: entry.startTime,
123
- method: "loaf"
124
- };
125
- if (__privateGet(this, _callback)) {
126
- __privateGet(this, _callback).call(this, event);
127
- }
128
- if (typeof performance !== "undefined" && performance.mark && performance.measure) {
129
- const frameId = `long-frame-${entry.startTime.toFixed(0)}`;
130
- const startMarkName = `${frameId}-start`;
131
- const endMarkName = `${frameId}-end`;
132
- const measureName = `Long Frame (LoAF): ${entry.duration.toFixed(1)}ms`;
133
- try {
134
- performance.mark(startMarkName, { startTime: entry.startTime });
135
- performance.mark(endMarkName, { startTime: entry.startTime + entry.duration });
136
- performance.measure(measureName, startMarkName, endMarkName);
137
- } catch (e) {
138
- performance.mark(measureName);
139
- }
140
- }
141
- writeSceneLog("LongFrameDetector", `Long frame detected (LoAF): ${entry.duration}ms at ${entry.startTime}ms`);
142
- }
143
- }));
144
- __privateGet(this, _loafObserver).observe({ type: "long-animation-frame", buffered: false });
145
- } catch (error) {
146
- writeSceneLog("LongFrameDetector", "Failed to start LoAF tracking, falling back to manual:", error);
147
- this.startManualFrameTracking();
148
- }
149
- }
150
- /**
151
- * Stop LoAF tracking
152
- */
153
- stopLoAFTracking() {
154
- if (__privateGet(this, _loafObserver)) {
155
- __privateGet(this, _loafObserver).disconnect();
156
- __privateSet(this, _loafObserver, null);
157
- writeSceneLog("LongFrameDetector", "Stopped LoAF tracking");
158
- }
159
- }
160
- /**
161
- * Start manual frame tracking using requestAnimationFrame
162
- */
163
- startManualFrameTracking() {
164
- __privateSet(this, _lastFrameTime, performance.now());
165
- __privateSet(this, _frameTrackingId, requestAnimationFrame(() => this.measureFrames()));
166
- }
167
- /**
168
- * Stop manual frame tracking
169
- */
170
- stopManualFrameTracking() {
171
- if (__privateGet(this, _frameTrackingId)) {
172
- cancelAnimationFrame(__privateGet(this, _frameTrackingId));
173
- __privateSet(this, _frameTrackingId, null);
174
- writeSceneLog("LongFrameDetector", "Stopped manual frame tracking");
175
- }
176
- }
177
- }
178
- _isTracking = new WeakMap();
179
- _callback = new WeakMap();
180
- _frameTrackingId = new WeakMap();
181
- _lastFrameTime = new WeakMap();
182
- _loafObserver = new WeakMap();
183
-
184
- export { LongFrameDetector };
185
- //# sourceMappingURL=LongFrameDetector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LongFrameDetector.js","sources":["../../../src/behaviors/LongFrameDetector.ts"],"sourcesContent":["import { writeSceneLog } from '../utils/writeSceneLog';\n\nconst LONG_FRAME_THRESHOLD = 50; // Threshold for both LoAF and manual tracking (ms)\n\nexport interface LongFrameEvent {\n duration: number; // Frame duration in milliseconds\n timestamp: number; // When the frame occurred\n method: 'manual' | 'loaf'; // Which detection method was used\n}\n\nexport type LongFrameCallback = (event: LongFrameEvent) => void;\n\n/**\n * LongFrameDetector is a module for detecting long animation frames.\n *\n * It supports two detection methods with automatic fallback:\n * 1. LoAF API (default when available): Uses Long Animation Frame API with 50ms threshold\n * 2. Manual tracking (fallback): Uses requestAnimationFrame with configurable threshold (default: 50ms)\n *\n * The detector automatically uses LoAF when available for better attribution and performance,\n * falling back to manual tracking for broader browser support.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Long_Animation_Frame_API\n */\nexport class LongFrameDetector {\n #isTracking = false;\n #callback: LongFrameCallback | null = null;\n\n // Manual tracking state\n #frameTrackingId: number | null = null;\n #lastFrameTime = 0;\n\n // LoAF tracking state\n #loafObserver: PerformanceObserver | null = null;\n\n /**\n * Check if LoAF API is available in the browser\n */\n private isLoAFAvailable(): boolean {\n return (\n typeof PerformanceObserver !== 'undefined' &&\n PerformanceObserver.supportedEntryTypes &&\n PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')\n );\n }\n\n /**\n * Start detecting long frames and call the provided callback when they occur\n */\n public start(callback: LongFrameCallback): void {\n if (this.#isTracking) {\n writeSceneLog('LongFrameDetector', 'Already tracking frames, stopping previous session');\n this.stop();\n }\n\n this.#callback = callback;\n this.#isTracking = true;\n\n if (this.isLoAFAvailable()) {\n this.startLoAFTracking();\n } else {\n this.startManualFrameTracking();\n }\n\n writeSceneLog(\n 'LongFrameDetector',\n `Started tracking with ${\n this.isLoAFAvailable() ? 'LoAF API' : 'manual'\n } method, threshold: ${LONG_FRAME_THRESHOLD}ms`\n );\n }\n\n /**\n * Stop detecting long frames\n */\n public stop(): void {\n if (!this.#isTracking) {\n return;\n }\n\n this.#isTracking = false;\n this.#callback = null;\n\n // Stop both tracking methods to ensure cleanup\n this.stopLoAFTracking();\n this.stopManualFrameTracking();\n }\n\n /**\n * Check if currently tracking frames\n */\n public isTracking(): boolean {\n return this.#isTracking;\n }\n\n /**\n * Start tracking using the Long Animation Frame API\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongAnimationFrameTiming\n */\n private startLoAFTracking(): void {\n if (!this.isLoAFAvailable()) {\n writeSceneLog('LongFrameDetector', 'LoAF API not available, falling back to manual tracking');\n this.startManualFrameTracking();\n return;\n }\n\n try {\n this.#loafObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n // No duration check needed - LoAF API already filters for long frames (>50ms)\n const event: LongFrameEvent = {\n duration: entry.duration,\n timestamp: entry.startTime,\n method: 'loaf',\n };\n\n if (this.#callback) {\n this.#callback(event);\n }\n\n // Add performance marks and measurements for debugging in dev tools\n if (typeof performance !== 'undefined' && performance.mark && performance.measure) {\n const frameId = `long-frame-${entry.startTime.toFixed(0)}`;\n const startMarkName = `${frameId}-start`;\n const endMarkName = `${frameId}-end`;\n const measureName = `Long Frame (LoAF): ${entry.duration.toFixed(1)}ms`;\n\n try {\n // Create start and end marks\n performance.mark(startMarkName, { startTime: entry.startTime });\n performance.mark(endMarkName, { startTime: entry.startTime + entry.duration });\n\n // Create measurement span\n performance.measure(measureName, startMarkName, endMarkName);\n } catch {\n // Fallback for browsers that don't support startTime option\n performance.mark(measureName);\n }\n }\n\n writeSceneLog('LongFrameDetector', `Long frame detected (LoAF): ${entry.duration}ms at ${entry.startTime}ms`);\n }\n });\n\n this.#loafObserver.observe({ type: 'long-animation-frame', buffered: false });\n } catch (error) {\n writeSceneLog('LongFrameDetector', 'Failed to start LoAF tracking, falling back to manual:', error);\n this.startManualFrameTracking();\n }\n }\n\n /**\n * Stop LoAF tracking\n */\n private stopLoAFTracking(): void {\n if (this.#loafObserver) {\n this.#loafObserver.disconnect();\n this.#loafObserver = null;\n writeSceneLog('LongFrameDetector', 'Stopped LoAF tracking');\n }\n }\n\n /**\n * Start manual frame tracking using requestAnimationFrame\n */\n private startManualFrameTracking(): void {\n this.#lastFrameTime = performance.now();\n this.#frameTrackingId = requestAnimationFrame(() => this.measureFrames());\n }\n\n /**\n * Stop manual frame tracking\n */\n private stopManualFrameTracking(): void {\n if (this.#frameTrackingId) {\n cancelAnimationFrame(this.#frameTrackingId);\n this.#frameTrackingId = null;\n writeSceneLog('LongFrameDetector', 'Stopped manual frame tracking');\n }\n }\n\n /**\n * Measure frame durations using requestAnimationFrame\n */\n private measureFrames = (): void => {\n if (!this.#isTracking) {\n return;\n }\n\n const currentFrameTime = performance.now();\n const frameLength = currentFrameTime - this.#lastFrameTime;\n\n // Check if frame exceeds threshold\n if (frameLength > LONG_FRAME_THRESHOLD) {\n const event: LongFrameEvent = {\n duration: frameLength,\n timestamp: currentFrameTime,\n method: 'manual',\n };\n\n if (this.#callback) {\n this.#callback(event);\n }\n\n // Add performance marks and measurements for debugging in dev tools\n if (typeof performance !== 'undefined' && performance.mark && performance.measure) {\n const frameId = `long-frame-manual-${currentFrameTime.toFixed(0)}`;\n const startMarkName = `${frameId}-start`;\n const endMarkName = `${frameId}-end`;\n const measureName = `Long Frame (Manual): ${frameLength.toFixed(1)}ms`;\n\n try {\n // Create start and end marks\n performance.mark(startMarkName, { startTime: currentFrameTime - frameLength });\n performance.mark(endMarkName, { startTime: currentFrameTime });\n\n // Create measurement span\n performance.measure(measureName, startMarkName, endMarkName);\n } catch {\n // Fallback for browsers that don't support startTime option\n performance.mark(measureName);\n }\n }\n\n writeSceneLog(\n 'LongFrameDetector',\n `Long frame detected (manual): ${frameLength}ms (threshold: ${LONG_FRAME_THRESHOLD}ms)`\n );\n }\n\n this.#lastFrameTime = currentFrameTime;\n\n // Continue tracking\n if (this.#isTracking) {\n this.#frameTrackingId = requestAnimationFrame(this.measureFrames);\n }\n };\n}\n"],"names":[],"mappings":"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"}