wu-framework 1.1.15 → 1.1.17
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 +52 -20
- package/dist/wu-framework.cjs.js +1 -1
- package/dist/wu-framework.cjs.js.map +1 -1
- package/dist/wu-framework.dev.js +15511 -15146
- package/dist/wu-framework.dev.js.map +1 -1
- package/dist/wu-framework.esm.js +1 -1
- package/dist/wu-framework.esm.js.map +1 -1
- package/dist/wu-framework.umd.js +1 -1
- package/dist/wu-framework.umd.js.map +1 -1
- package/package.json +166 -161
- package/src/adapters/angular/ai.js +30 -30
- package/src/adapters/angular/index.d.ts +154 -154
- package/src/adapters/angular/index.js +932 -932
- package/src/adapters/angular.d.ts +3 -3
- package/src/adapters/angular.js +3 -3
- package/src/adapters/index.js +168 -168
- package/src/adapters/lit/ai.js +20 -20
- package/src/adapters/lit/index.d.ts +120 -120
- package/src/adapters/lit/index.js +721 -721
- package/src/adapters/lit.d.ts +3 -3
- package/src/adapters/lit.js +3 -3
- package/src/adapters/preact/ai.js +33 -33
- package/src/adapters/preact/index.d.ts +108 -108
- package/src/adapters/preact/index.js +661 -661
- package/src/adapters/preact.d.ts +3 -3
- package/src/adapters/preact.js +3 -3
- package/src/adapters/react/index.js +48 -54
- package/src/adapters/react.d.ts +3 -3
- package/src/adapters/react.js +3 -3
- package/src/adapters/shared.js +64 -64
- package/src/adapters/solid/ai.js +32 -32
- package/src/adapters/solid/index.d.ts +101 -101
- package/src/adapters/solid/index.js +586 -586
- package/src/adapters/solid.d.ts +3 -3
- package/src/adapters/solid.js +3 -3
- package/src/adapters/svelte/ai.js +31 -31
- package/src/adapters/svelte/index.d.ts +166 -166
- package/src/adapters/svelte/index.js +798 -798
- package/src/adapters/svelte.d.ts +3 -3
- package/src/adapters/svelte.js +3 -3
- package/src/adapters/vanilla/ai.js +30 -30
- package/src/adapters/vanilla/index.d.ts +179 -179
- package/src/adapters/vanilla/index.js +785 -785
- package/src/adapters/vanilla.d.ts +3 -3
- package/src/adapters/vanilla.js +3 -3
- package/src/adapters/vue/ai.js +52 -52
- package/src/adapters/vue/index.d.ts +299 -299
- package/src/adapters/vue/index.js +610 -610
- package/src/adapters/vue.d.ts +3 -3
- package/src/adapters/vue.js +3 -3
- package/src/ai/wu-ai-actions.js +261 -261
- package/src/ai/wu-ai-agent.js +546 -546
- package/src/ai/wu-ai-browser-primitives.js +354 -354
- package/src/ai/wu-ai-browser.js +380 -380
- package/src/ai/wu-ai-context.js +332 -332
- package/src/ai/wu-ai-conversation.js +613 -613
- package/src/ai/wu-ai-orchestrate.js +1021 -1021
- package/src/ai/wu-ai-permissions.js +381 -381
- package/src/ai/wu-ai-provider.js +700 -700
- package/src/ai/wu-ai-schema.js +225 -225
- package/src/ai/wu-ai-triggers.js +396 -396
- package/src/ai/wu-ai.js +804 -804
- package/src/core/wu-app.js +236 -236
- package/src/core/wu-cache.js +498 -477
- package/src/core/wu-core.js +1412 -1398
- package/src/core/wu-error-boundary.js +396 -382
- package/src/core/wu-event-bus.js +390 -348
- package/src/core/wu-hooks.js +350 -350
- package/src/core/wu-html-parser.js +199 -190
- package/src/core/wu-iframe-sandbox.js +328 -328
- package/src/core/wu-loader.js +385 -273
- package/src/core/wu-logger.js +142 -134
- package/src/core/wu-manifest.js +532 -509
- package/src/core/wu-mcp-bridge.js +432 -432
- package/src/core/wu-overrides.js +510 -510
- package/src/core/wu-performance.js +228 -228
- package/src/core/wu-plugin.js +401 -348
- package/src/core/wu-prefetch.js +414 -414
- package/src/core/wu-proxy-sandbox.js +477 -476
- package/src/core/wu-sandbox.js +779 -779
- package/src/core/wu-script-executor.js +161 -113
- package/src/core/wu-snapshot-sandbox.js +227 -227
- package/src/core/wu-store.js +13 -3
- package/src/core/wu-strategies.js +256 -256
- package/src/core/wu-style-bridge.js +477 -477
- package/src/index.d.ts +317 -0
- package/src/index.js +234 -224
- package/src/utils/dependency-resolver.js +327 -327
|
@@ -1,228 +1,228 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⚡ WU-PERFORMANCE: MICROFRONTEND LIFECYCLE MONITORING
|
|
3
|
-
*
|
|
4
|
-
* Monitoreo de performance específico para operaciones del framework:
|
|
5
|
-
* - Tiempos de mount/unmount
|
|
6
|
-
* - Tiempos de carga de módulos
|
|
7
|
-
* - Estadísticas por app
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { logger } from './wu-logger.js';
|
|
11
|
-
|
|
12
|
-
export class WuPerformance {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.metrics = new Map(); // appName -> metrics
|
|
15
|
-
this.measurements = [];
|
|
16
|
-
this.marks = new Map();
|
|
17
|
-
|
|
18
|
-
this.config = {
|
|
19
|
-
enabled: true,
|
|
20
|
-
maxMeasurements: 1000
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
this.thresholds = {
|
|
24
|
-
mount: 3000, // ms
|
|
25
|
-
unmount: 1000, // ms
|
|
26
|
-
load: 5000 // ms
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
logger.debug('[WuPerformance] ⚡ Framework performance monitoring initialized');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* 📊 START MEASURE: Iniciar medición
|
|
34
|
-
* @param {string} name - Nombre de la medición
|
|
35
|
-
* @param {string} appName - Nombre de la app (opcional)
|
|
36
|
-
*/
|
|
37
|
-
startMeasure(name, appName = 'global') {
|
|
38
|
-
const markName = `${appName}:${name}:start`;
|
|
39
|
-
this.marks.set(markName, performance.now());
|
|
40
|
-
|
|
41
|
-
logger.debug(`[WuPerformance] 📊 Measure started: ${markName}`);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* ⏹️ END MEASURE: Finalizar medición
|
|
46
|
-
* @param {string} name - Nombre de la medición
|
|
47
|
-
* @param {string} appName - Nombre de la app (opcional)
|
|
48
|
-
* @returns {number} Duración en ms
|
|
49
|
-
*/
|
|
50
|
-
endMeasure(name, appName = 'global') {
|
|
51
|
-
const markName = `${appName}:${name}:start`;
|
|
52
|
-
const startTime = this.marks.get(markName);
|
|
53
|
-
|
|
54
|
-
if (!startTime) {
|
|
55
|
-
// Puede ocurrir en React StrictMode (doble mount) — no es un error
|
|
56
|
-
return 0;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const duration = performance.now() - startTime;
|
|
60
|
-
this.marks.delete(markName);
|
|
61
|
-
|
|
62
|
-
// Registrar medición
|
|
63
|
-
this.recordMeasurement({
|
|
64
|
-
name,
|
|
65
|
-
appName,
|
|
66
|
-
duration,
|
|
67
|
-
timestamp: Date.now(),
|
|
68
|
-
type: 'duration'
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
// Verificar threshold
|
|
72
|
-
if (this.checkThreshold(name, duration)) {
|
|
73
|
-
logger.warn(`[WuPerformance] ⚠️ Threshold exceeded for ${name}: ${duration.toFixed(2)}ms`);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
logger.debug(`[WuPerformance] ⏹️ Measure ended: ${markName} (${duration.toFixed(2)}ms)`);
|
|
77
|
-
return duration;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* 📝 RECORD MEASUREMENT: Registrar medición
|
|
82
|
-
* @param {Object} measurement - Medición
|
|
83
|
-
*/
|
|
84
|
-
recordMeasurement(measurement) {
|
|
85
|
-
this.measurements.push(measurement);
|
|
86
|
-
|
|
87
|
-
// Mantener tamaño máximo
|
|
88
|
-
if (this.measurements.length > this.config.maxMeasurements) {
|
|
89
|
-
this.measurements.shift();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Actualizar métricas de la app
|
|
93
|
-
if (!this.metrics.has(measurement.appName)) {
|
|
94
|
-
this.metrics.set(measurement.appName, {
|
|
95
|
-
appName: measurement.appName,
|
|
96
|
-
measurements: [],
|
|
97
|
-
stats: {}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const appMetrics = this.metrics.get(measurement.appName);
|
|
102
|
-
appMetrics.measurements.push(measurement);
|
|
103
|
-
|
|
104
|
-
// Calcular estadísticas
|
|
105
|
-
this.calculateStats(measurement.appName);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* 📊 CALCULATE STATS: Calcular estadísticas
|
|
110
|
-
* @param {string} appName - Nombre de la app
|
|
111
|
-
*/
|
|
112
|
-
calculateStats(appName) {
|
|
113
|
-
const appMetrics = this.metrics.get(appName);
|
|
114
|
-
if (!appMetrics) return;
|
|
115
|
-
|
|
116
|
-
const measurements = appMetrics.measurements;
|
|
117
|
-
if (measurements.length === 0) return;
|
|
118
|
-
|
|
119
|
-
// Agrupar por tipo de medición
|
|
120
|
-
const byType = {};
|
|
121
|
-
measurements.forEach(m => {
|
|
122
|
-
if (!byType[m.name]) byType[m.name] = [];
|
|
123
|
-
byType[m.name].push(m.duration);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// Calcular estadísticas para cada tipo
|
|
127
|
-
appMetrics.stats = {};
|
|
128
|
-
Object.entries(byType).forEach(([name, durations]) => {
|
|
129
|
-
appMetrics.stats[name] = {
|
|
130
|
-
count: durations.length,
|
|
131
|
-
avg: durations.reduce((a, b) => a + b, 0) / durations.length,
|
|
132
|
-
min: Math.min(...durations),
|
|
133
|
-
max: Math.max(...durations),
|
|
134
|
-
last: durations[durations.length - 1]
|
|
135
|
-
};
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* 🎯 CHECK THRESHOLD: Verificar si se excedió threshold
|
|
141
|
-
* @param {string} name - Nombre de la medición
|
|
142
|
-
* @param {number} value - Valor
|
|
143
|
-
* @returns {boolean}
|
|
144
|
-
*/
|
|
145
|
-
checkThreshold(name, value) {
|
|
146
|
-
const threshold = this.thresholds[name];
|
|
147
|
-
return threshold && value > threshold;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* 📊 GENERATE REPORT: Generar reporte de performance del framework
|
|
152
|
-
* @returns {Object}
|
|
153
|
-
*/
|
|
154
|
-
generateReport() {
|
|
155
|
-
const report = {
|
|
156
|
-
timestamp: Date.now(),
|
|
157
|
-
totalMeasurements: this.measurements.length,
|
|
158
|
-
apps: {}
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
// Agregar métricas por app
|
|
162
|
-
for (const [appName, metrics] of this.metrics) {
|
|
163
|
-
report.apps[appName] = {
|
|
164
|
-
measurementCount: metrics.measurements.length,
|
|
165
|
-
stats: metrics.stats
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
return report;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* 📋 GET METRICS: Obtener métricas de una app
|
|
174
|
-
* @param {string} appName - Nombre de la app
|
|
175
|
-
* @returns {Object}
|
|
176
|
-
*/
|
|
177
|
-
getMetrics(appName) {
|
|
178
|
-
return this.metrics.get(appName) || null;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* 📊 GET ALL METRICS: Obtener todas las métricas
|
|
183
|
-
* @returns {Object}
|
|
184
|
-
*/
|
|
185
|
-
getAllMetrics() {
|
|
186
|
-
const allMetrics = {};
|
|
187
|
-
|
|
188
|
-
for (const [appName, metrics] of this.metrics) {
|
|
189
|
-
allMetrics[appName] = metrics;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return allMetrics;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* 🧹 CLEAR METRICS: Limpiar métricas
|
|
197
|
-
* @param {string} appName - Nombre de la app (opcional)
|
|
198
|
-
*/
|
|
199
|
-
clearMetrics(appName) {
|
|
200
|
-
if (appName) {
|
|
201
|
-
this.metrics.delete(appName);
|
|
202
|
-
this.measurements = this.measurements.filter(m => m.appName !== appName);
|
|
203
|
-
} else {
|
|
204
|
-
this.metrics.clear();
|
|
205
|
-
this.measurements = [];
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
logger.debug(`[WuPerformance] 🧹 Metrics cleared${appName ? ` for ${appName}` : ''}`);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* ⚙️ CONFIGURE: Configurar performance monitor
|
|
213
|
-
* @param {Object} config - Nueva configuración
|
|
214
|
-
*/
|
|
215
|
-
configure(config) {
|
|
216
|
-
this.config = {
|
|
217
|
-
...this.config,
|
|
218
|
-
...config
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
if (config.thresholds) {
|
|
222
|
-
this.thresholds = {
|
|
223
|
-
...this.thresholds,
|
|
224
|
-
...config.thresholds
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* ⚡ WU-PERFORMANCE: MICROFRONTEND LIFECYCLE MONITORING
|
|
3
|
+
*
|
|
4
|
+
* Monitoreo de performance específico para operaciones del framework:
|
|
5
|
+
* - Tiempos de mount/unmount
|
|
6
|
+
* - Tiempos de carga de módulos
|
|
7
|
+
* - Estadísticas por app
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { logger } from './wu-logger.js';
|
|
11
|
+
|
|
12
|
+
export class WuPerformance {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.metrics = new Map(); // appName -> metrics
|
|
15
|
+
this.measurements = [];
|
|
16
|
+
this.marks = new Map();
|
|
17
|
+
|
|
18
|
+
this.config = {
|
|
19
|
+
enabled: true,
|
|
20
|
+
maxMeasurements: 1000
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
this.thresholds = {
|
|
24
|
+
mount: 3000, // ms
|
|
25
|
+
unmount: 1000, // ms
|
|
26
|
+
load: 5000 // ms
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
logger.debug('[WuPerformance] ⚡ Framework performance monitoring initialized');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 📊 START MEASURE: Iniciar medición
|
|
34
|
+
* @param {string} name - Nombre de la medición
|
|
35
|
+
* @param {string} appName - Nombre de la app (opcional)
|
|
36
|
+
*/
|
|
37
|
+
startMeasure(name, appName = 'global') {
|
|
38
|
+
const markName = `${appName}:${name}:start`;
|
|
39
|
+
this.marks.set(markName, performance.now());
|
|
40
|
+
|
|
41
|
+
logger.debug(`[WuPerformance] 📊 Measure started: ${markName}`);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* ⏹️ END MEASURE: Finalizar medición
|
|
46
|
+
* @param {string} name - Nombre de la medición
|
|
47
|
+
* @param {string} appName - Nombre de la app (opcional)
|
|
48
|
+
* @returns {number} Duración en ms
|
|
49
|
+
*/
|
|
50
|
+
endMeasure(name, appName = 'global') {
|
|
51
|
+
const markName = `${appName}:${name}:start`;
|
|
52
|
+
const startTime = this.marks.get(markName);
|
|
53
|
+
|
|
54
|
+
if (!startTime) {
|
|
55
|
+
// Puede ocurrir en React StrictMode (doble mount) — no es un error
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const duration = performance.now() - startTime;
|
|
60
|
+
this.marks.delete(markName);
|
|
61
|
+
|
|
62
|
+
// Registrar medición
|
|
63
|
+
this.recordMeasurement({
|
|
64
|
+
name,
|
|
65
|
+
appName,
|
|
66
|
+
duration,
|
|
67
|
+
timestamp: Date.now(),
|
|
68
|
+
type: 'duration'
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Verificar threshold
|
|
72
|
+
if (this.checkThreshold(name, duration)) {
|
|
73
|
+
logger.warn(`[WuPerformance] ⚠️ Threshold exceeded for ${name}: ${duration.toFixed(2)}ms`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
logger.debug(`[WuPerformance] ⏹️ Measure ended: ${markName} (${duration.toFixed(2)}ms)`);
|
|
77
|
+
return duration;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 📝 RECORD MEASUREMENT: Registrar medición
|
|
82
|
+
* @param {Object} measurement - Medición
|
|
83
|
+
*/
|
|
84
|
+
recordMeasurement(measurement) {
|
|
85
|
+
this.measurements.push(measurement);
|
|
86
|
+
|
|
87
|
+
// Mantener tamaño máximo
|
|
88
|
+
if (this.measurements.length > this.config.maxMeasurements) {
|
|
89
|
+
this.measurements.shift();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Actualizar métricas de la app
|
|
93
|
+
if (!this.metrics.has(measurement.appName)) {
|
|
94
|
+
this.metrics.set(measurement.appName, {
|
|
95
|
+
appName: measurement.appName,
|
|
96
|
+
measurements: [],
|
|
97
|
+
stats: {}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const appMetrics = this.metrics.get(measurement.appName);
|
|
102
|
+
appMetrics.measurements.push(measurement);
|
|
103
|
+
|
|
104
|
+
// Calcular estadísticas
|
|
105
|
+
this.calculateStats(measurement.appName);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 📊 CALCULATE STATS: Calcular estadísticas
|
|
110
|
+
* @param {string} appName - Nombre de la app
|
|
111
|
+
*/
|
|
112
|
+
calculateStats(appName) {
|
|
113
|
+
const appMetrics = this.metrics.get(appName);
|
|
114
|
+
if (!appMetrics) return;
|
|
115
|
+
|
|
116
|
+
const measurements = appMetrics.measurements;
|
|
117
|
+
if (measurements.length === 0) return;
|
|
118
|
+
|
|
119
|
+
// Agrupar por tipo de medición
|
|
120
|
+
const byType = {};
|
|
121
|
+
measurements.forEach(m => {
|
|
122
|
+
if (!byType[m.name]) byType[m.name] = [];
|
|
123
|
+
byType[m.name].push(m.duration);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Calcular estadísticas para cada tipo
|
|
127
|
+
appMetrics.stats = {};
|
|
128
|
+
Object.entries(byType).forEach(([name, durations]) => {
|
|
129
|
+
appMetrics.stats[name] = {
|
|
130
|
+
count: durations.length,
|
|
131
|
+
avg: durations.reduce((a, b) => a + b, 0) / durations.length,
|
|
132
|
+
min: Math.min(...durations),
|
|
133
|
+
max: Math.max(...durations),
|
|
134
|
+
last: durations[durations.length - 1]
|
|
135
|
+
};
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 🎯 CHECK THRESHOLD: Verificar si se excedió threshold
|
|
141
|
+
* @param {string} name - Nombre de la medición
|
|
142
|
+
* @param {number} value - Valor
|
|
143
|
+
* @returns {boolean}
|
|
144
|
+
*/
|
|
145
|
+
checkThreshold(name, value) {
|
|
146
|
+
const threshold = this.thresholds[name];
|
|
147
|
+
return threshold && value > threshold;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* 📊 GENERATE REPORT: Generar reporte de performance del framework
|
|
152
|
+
* @returns {Object}
|
|
153
|
+
*/
|
|
154
|
+
generateReport() {
|
|
155
|
+
const report = {
|
|
156
|
+
timestamp: Date.now(),
|
|
157
|
+
totalMeasurements: this.measurements.length,
|
|
158
|
+
apps: {}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// Agregar métricas por app
|
|
162
|
+
for (const [appName, metrics] of this.metrics) {
|
|
163
|
+
report.apps[appName] = {
|
|
164
|
+
measurementCount: metrics.measurements.length,
|
|
165
|
+
stats: metrics.stats
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return report;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* 📋 GET METRICS: Obtener métricas de una app
|
|
174
|
+
* @param {string} appName - Nombre de la app
|
|
175
|
+
* @returns {Object}
|
|
176
|
+
*/
|
|
177
|
+
getMetrics(appName) {
|
|
178
|
+
return this.metrics.get(appName) || null;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* 📊 GET ALL METRICS: Obtener todas las métricas
|
|
183
|
+
* @returns {Object}
|
|
184
|
+
*/
|
|
185
|
+
getAllMetrics() {
|
|
186
|
+
const allMetrics = {};
|
|
187
|
+
|
|
188
|
+
for (const [appName, metrics] of this.metrics) {
|
|
189
|
+
allMetrics[appName] = metrics;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return allMetrics;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* 🧹 CLEAR METRICS: Limpiar métricas
|
|
197
|
+
* @param {string} appName - Nombre de la app (opcional)
|
|
198
|
+
*/
|
|
199
|
+
clearMetrics(appName) {
|
|
200
|
+
if (appName) {
|
|
201
|
+
this.metrics.delete(appName);
|
|
202
|
+
this.measurements = this.measurements.filter(m => m.appName !== appName);
|
|
203
|
+
} else {
|
|
204
|
+
this.metrics.clear();
|
|
205
|
+
this.measurements = [];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
logger.debug(`[WuPerformance] 🧹 Metrics cleared${appName ? ` for ${appName}` : ''}`);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* ⚙️ CONFIGURE: Configurar performance monitor
|
|
213
|
+
* @param {Object} config - Nueva configuración
|
|
214
|
+
*/
|
|
215
|
+
configure(config) {
|
|
216
|
+
this.config = {
|
|
217
|
+
...this.config,
|
|
218
|
+
...config
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
if (config.thresholds) {
|
|
222
|
+
this.thresholds = {
|
|
223
|
+
...this.thresholds,
|
|
224
|
+
...config.thresholds
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|