@therealtinhtute/baroiplayer 1.0.1 → 1.0.2
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/dist/context/media.js +2 -0
- package/dist/context/media.js.map +1 -0
- package/dist/context/media.mjs +15 -0
- package/dist/context/media.mjs.map +1 -0
- package/dist/context/store.js +2 -0
- package/dist/context/store.js.map +1 -0
- package/dist/context/store.mjs +5 -0
- package/dist/context/store.mjs.map +1 -0
- package/dist/context-Af84FynT.js +1179 -0
- package/dist/context-Af84FynT.js.map +1 -0
- package/dist/context-CwZnPdz0.cjs +23 -0
- package/dist/context-CwZnPdz0.cjs.map +1 -0
- package/dist/core-events-B5W_j8yU.js +480 -0
- package/dist/core-events-B5W_j8yU.js.map +1 -0
- package/dist/core-events-CN0-Vhhq.cjs +2 -0
- package/dist/core-events-CN0-Vhhq.cjs.map +1 -0
- package/dist/core-plugins-Bq9KLany.js +696 -0
- package/dist/core-plugins-Bq9KLany.js.map +1 -0
- package/dist/core-plugins-CPDSHMiQ.cjs +2 -0
- package/dist/core-plugins-CPDSHMiQ.cjs.map +1 -0
- package/dist/core.js +37 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +1217 -0
- package/dist/core.mjs.map +1 -0
- package/dist/enhanced-components-CXnYiOt6.cjs +2 -0
- package/dist/enhanced-components-CXnYiOt6.cjs.map +1 -0
- package/dist/enhanced-components-Da0TSvKe.js +1073 -0
- package/dist/enhanced-components-Da0TSvKe.js.map +1 -0
- package/dist/hooks-BhW_i-9L.js +2013 -0
- package/dist/hooks-BhW_i-9L.js.map +1 -0
- package/dist/hooks-DTXeB5Z-.cjs +4 -0
- package/dist/hooks-DTXeB5Z-.cjs.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -0
- package/dist/index.mjs.map +1 -0
- package/dist/minimal-components-B0bILe18.js +2002 -0
- package/dist/minimal-components-B0bILe18.js.map +1 -0
- package/dist/minimal-components-BsqodtY8.cjs +2 -0
- package/dist/minimal-components-BsqodtY8.cjs.map +1 -0
- package/dist/minimal-components.css +589 -0
- package/dist/mona-loading.gif +0 -0
- package/dist/performance-monitor--rzKTlbj.js +302 -0
- package/dist/performance-monitor--rzKTlbj.js.map +1 -0
- package/dist/performance-monitor-cjIvZE2D.cjs +2 -0
- package/dist/performance-monitor-cjIvZE2D.cjs.map +1 -0
- package/dist/src/components/AnimateLoading.tsx +1 -1
- package/dist/src/components/enhanced/debug-panel.tsx +1 -1
- package/dist/src/components/media-player.tsx +2 -2
- package/dist/src/components/ui/media-resource-preloader.tsx +9 -11
- package/dist/src/components/ui/seek-bar.tsx +1 -1
- package/dist/src/core/plugins/enhanced-plugin-system.ts +14 -8
- package/dist/src/core/providers/enhanced-hls-provider.ts +22 -53
- package/dist/src/hooks/use-enhanced-media-player.ts +19 -2
- package/dist/src/types/index.ts +40 -5
- package/dist/styles/minimal-player.css +589 -0
- package/dist/utils-Db13763z.cjs +9 -0
- package/dist/utils-Db13763z.cjs.map +1 -0
- package/dist/utils-nTO4AnHo.js +2809 -0
- package/dist/utils-nTO4AnHo.js.map +1 -0
- package/dist/utils.js +2 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +7 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +1 -1
- package/src/components/AnimateLoading.tsx +1 -1
- package/src/components/enhanced/debug-panel.tsx +1 -1
- package/src/components/media-player.tsx +2 -2
- package/src/components/ui/media-resource-preloader.tsx +9 -11
- package/src/components/ui/seek-bar.tsx +1 -1
- package/src/core/plugins/enhanced-plugin-system.ts +14 -8
- package/src/core/providers/enhanced-hls-provider.ts +22 -53
- package/src/hooks/use-enhanced-media-player.ts +19 -2
- package/src/types/index.ts +40 -5
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
var u = Object.defineProperty;
|
|
2
|
+
var p = (n, e, r) => e in n ? u(n, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : n[e] = r;
|
|
3
|
+
var d = (n, e, r) => p(n, typeof e != "symbol" ? e + "" : e, r);
|
|
4
|
+
import { j as t } from "./context-Af84FynT.js";
|
|
5
|
+
import { useState as m, useEffect as g, useCallback as b, useRef as M } from "react";
|
|
6
|
+
const x = {
|
|
7
|
+
lcp: { good: 2500, poor: 4e3 },
|
|
8
|
+
fid: { good: 100, poor: 300 },
|
|
9
|
+
cls: { good: 0.1, poor: 0.25 },
|
|
10
|
+
renderTime: { good: 16, poor: 100 },
|
|
11
|
+
// Target 60fps = 16.67ms per frame
|
|
12
|
+
memoryUsage: { good: 50 * 1024 * 1024, poor: 100 * 1024 * 1024 }
|
|
13
|
+
// 50MB good, 100MB poor
|
|
14
|
+
};
|
|
15
|
+
class v {
|
|
16
|
+
constructor(e = x) {
|
|
17
|
+
d(this, "metrics", []);
|
|
18
|
+
d(this, "listeners", /* @__PURE__ */ new Set());
|
|
19
|
+
d(this, "thresholds");
|
|
20
|
+
d(this, "observer");
|
|
21
|
+
d(this, "isMonitoring", !1);
|
|
22
|
+
this.thresholds = e, this.initializeWebVitals(), this.initializePerformanceObserver();
|
|
23
|
+
}
|
|
24
|
+
async initializeWebVitals() {
|
|
25
|
+
if (!(typeof window > "u"))
|
|
26
|
+
try {
|
|
27
|
+
const e = await import("web-vitals").catch(() => null);
|
|
28
|
+
if (!e) {
|
|
29
|
+
console.warn("web-vitals package not available, Core Web Vitals tracking disabled");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const r = (o) => {
|
|
33
|
+
this.updateMetric(o.name.toLowerCase(), o.value);
|
|
34
|
+
}, s = e;
|
|
35
|
+
s.getCLS && s.getCLS(r), s.getFID && s.getFID(r), s.getFCP && s.getFCP(r), s.getLCP && s.getLCP(r), s.getTTFB && s.getTTFB(r), s.onINP && s.onINP(r);
|
|
36
|
+
} catch (e) {
|
|
37
|
+
console.warn("Web Vitals initialization failed:", e);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
initializePerformanceObserver() {
|
|
41
|
+
if (!(typeof window > "u" || !("PerformanceObserver" in window)))
|
|
42
|
+
try {
|
|
43
|
+
this.observer = new PerformanceObserver((e) => {
|
|
44
|
+
for (const r of e.getEntries())
|
|
45
|
+
this.handlePerformanceEntry(r);
|
|
46
|
+
}), this.observer.observe({ entryTypes: ["measure", "navigation", "resource", "paint"] });
|
|
47
|
+
} catch (e) {
|
|
48
|
+
console.warn("PerformanceObserver not supported:", e);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
handlePerformanceEntry(e) {
|
|
52
|
+
switch (e.entryType) {
|
|
53
|
+
case "measure":
|
|
54
|
+
e.name.startsWith("baroiplayer-render") && this.updateMetric("componentRenderTime", e.duration);
|
|
55
|
+
break;
|
|
56
|
+
case "resource":
|
|
57
|
+
(e.name.includes(".js") || e.name.includes(".css")) && this.updateMetric("bundleLoadTime", e.duration);
|
|
58
|
+
break;
|
|
59
|
+
case "paint":
|
|
60
|
+
e.name === "first-contentful-paint" && this.updateMetric("fcp", e.startTime);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
updateMetric(e, r) {
|
|
65
|
+
const s = this.getCurrentMetrics(), o = {
|
|
66
|
+
...s,
|
|
67
|
+
[e]: r,
|
|
68
|
+
timestamp: Date.now(),
|
|
69
|
+
performanceScore: this.calculatePerformanceScore({ ...s, [e]: r })
|
|
70
|
+
};
|
|
71
|
+
this.metrics.push(o), this.metrics.length > 100 && (this.metrics = this.metrics.slice(-100)), this.listeners.forEach((i) => i(o));
|
|
72
|
+
}
|
|
73
|
+
getCurrentMetrics() {
|
|
74
|
+
return this.metrics[this.metrics.length - 1] || {
|
|
75
|
+
componentRenderTime: 0,
|
|
76
|
+
bundleLoadTime: 0,
|
|
77
|
+
mediaLoadTime: 0,
|
|
78
|
+
memoryUsage: this.getMemoryUsage(),
|
|
79
|
+
performanceScore: 0,
|
|
80
|
+
timestamp: Date.now()
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
getMemoryUsage() {
|
|
84
|
+
return "memory" in performance && performance.memory.usedJSHeapSize || 0;
|
|
85
|
+
}
|
|
86
|
+
calculatePerformanceScore(e) {
|
|
87
|
+
let r = 100;
|
|
88
|
+
return e.lcp && e.lcp > this.thresholds.lcp.good && (r -= e.lcp > this.thresholds.lcp.poor ? 30 : 15), e.fid && e.fid > this.thresholds.fid.good && (r -= e.fid > this.thresholds.fid.poor ? 25 : 10), e.cls && e.cls > this.thresholds.cls.good && (r -= e.cls > this.thresholds.cls.poor ? 20 : 10), e.componentRenderTime > this.thresholds.renderTime.good && (r -= e.componentRenderTime > this.thresholds.renderTime.poor ? 20 : 10), e.memoryUsage > this.thresholds.memoryUsage.good && (r -= e.memoryUsage > this.thresholds.memoryUsage.poor ? 15 : 5), Math.max(0, r);
|
|
89
|
+
}
|
|
90
|
+
// Public API
|
|
91
|
+
startMonitoring() {
|
|
92
|
+
this.isMonitoring = !0, this.startMemoryMonitoring();
|
|
93
|
+
}
|
|
94
|
+
stopMonitoring() {
|
|
95
|
+
this.isMonitoring = !1, this.observer && this.observer.disconnect();
|
|
96
|
+
}
|
|
97
|
+
startMemoryMonitoring() {
|
|
98
|
+
this.isMonitoring && (this.updateMetric("memoryUsage", this.getMemoryUsage()), setTimeout(() => this.startMemoryMonitoring(), 5e3));
|
|
99
|
+
}
|
|
100
|
+
measureComponentRender(e, r) {
|
|
101
|
+
const s = `baroiplayer-render-${e}-start`, o = `baroiplayer-render-${e}-end`, i = `baroiplayer-render-${e}`;
|
|
102
|
+
performance.mark(s);
|
|
103
|
+
const a = r();
|
|
104
|
+
performance.mark(o);
|
|
105
|
+
try {
|
|
106
|
+
performance.measure(i, s, o);
|
|
107
|
+
} catch (c) {
|
|
108
|
+
console.warn("Performance measurement failed:", c);
|
|
109
|
+
}
|
|
110
|
+
return a;
|
|
111
|
+
}
|
|
112
|
+
subscribe(e) {
|
|
113
|
+
return this.listeners.add(e), () => this.listeners.delete(e);
|
|
114
|
+
}
|
|
115
|
+
getLatestMetrics() {
|
|
116
|
+
return this.metrics[this.metrics.length - 1] || null;
|
|
117
|
+
}
|
|
118
|
+
getAllMetrics() {
|
|
119
|
+
return [...this.metrics];
|
|
120
|
+
}
|
|
121
|
+
getAverageMetrics(e = 10) {
|
|
122
|
+
const r = this.metrics.slice(-e);
|
|
123
|
+
if (r.length === 0) return {};
|
|
124
|
+
const s = {};
|
|
125
|
+
return [
|
|
126
|
+
"lcp",
|
|
127
|
+
"fid",
|
|
128
|
+
"cls",
|
|
129
|
+
"fcp",
|
|
130
|
+
"ttfb",
|
|
131
|
+
"inp",
|
|
132
|
+
"componentRenderTime",
|
|
133
|
+
"bundleLoadTime",
|
|
134
|
+
"mediaLoadTime",
|
|
135
|
+
"memoryUsage",
|
|
136
|
+
"performanceScore"
|
|
137
|
+
].forEach((i) => {
|
|
138
|
+
const a = r.map((c) => c[i]).filter((c) => typeof c == "number" && !isNaN(c));
|
|
139
|
+
a.length > 0 && (s[i] = a.reduce((c, f) => c + f, 0) / a.length);
|
|
140
|
+
}), s;
|
|
141
|
+
}
|
|
142
|
+
getThresholds() {
|
|
143
|
+
return this.thresholds;
|
|
144
|
+
}
|
|
145
|
+
updateThresholds(e) {
|
|
146
|
+
this.thresholds = { ...this.thresholds, ...e };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const l = new v();
|
|
150
|
+
function h() {
|
|
151
|
+
const [n, e] = m(null), [r, s] = m(!0);
|
|
152
|
+
g(() => {
|
|
153
|
+
if (s(typeof window < "u" && "performance" in window), !r) return;
|
|
154
|
+
l.startMonitoring();
|
|
155
|
+
const i = l.subscribe(e);
|
|
156
|
+
return () => {
|
|
157
|
+
i(), l.stopMonitoring();
|
|
158
|
+
};
|
|
159
|
+
}, [r]);
|
|
160
|
+
const o = b(
|
|
161
|
+
(i, a) => l.measureComponentRender(i, a),
|
|
162
|
+
[]
|
|
163
|
+
);
|
|
164
|
+
return {
|
|
165
|
+
metrics: n,
|
|
166
|
+
isSupported: r,
|
|
167
|
+
measureRender: o,
|
|
168
|
+
averageMetrics: l.getAverageMetrics(),
|
|
169
|
+
allMetrics: l.getAllMetrics(),
|
|
170
|
+
thresholds: l.getThresholds()
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function w(n, e) {
|
|
174
|
+
const r = e || n.displayName || n.name || "Component";
|
|
175
|
+
function s(o) {
|
|
176
|
+
const i = M(0), { measureRender: a } = h();
|
|
177
|
+
return a(`${r}-${i.current++}`, () => /* @__PURE__ */ t.jsx(n, { ...o }));
|
|
178
|
+
}
|
|
179
|
+
return s.displayName = `withPerformanceMonitoring(${r})`, s;
|
|
180
|
+
}
|
|
181
|
+
class P {
|
|
182
|
+
constructor() {
|
|
183
|
+
d(this, "baselineMetrics", null);
|
|
184
|
+
d(this, "regressionThreshold", 0.2);
|
|
185
|
+
}
|
|
186
|
+
// 20% degradation threshold
|
|
187
|
+
setBaseline(e) {
|
|
188
|
+
this.baselineMetrics = e;
|
|
189
|
+
}
|
|
190
|
+
detectRegression(e) {
|
|
191
|
+
if (!this.baselineMetrics) return [];
|
|
192
|
+
const r = [];
|
|
193
|
+
return [
|
|
194
|
+
"componentRenderTime",
|
|
195
|
+
"bundleLoadTime",
|
|
196
|
+
"mediaLoadTime",
|
|
197
|
+
"memoryUsage"
|
|
198
|
+
].forEach((o) => {
|
|
199
|
+
const i = this.baselineMetrics[o], a = e[o];
|
|
200
|
+
if (i && a && i > 0) {
|
|
201
|
+
const c = (a - i) / i;
|
|
202
|
+
c > this.regressionThreshold && r.push({ metric: o, baseline: i, current: a, degradation: c });
|
|
203
|
+
}
|
|
204
|
+
}), r;
|
|
205
|
+
}
|
|
206
|
+
setRegressionThreshold(e) {
|
|
207
|
+
this.regressionThreshold = Math.max(0, Math.min(1, e));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function S({
|
|
211
|
+
className: n = "",
|
|
212
|
+
showAdvanced: e = !1
|
|
213
|
+
}) {
|
|
214
|
+
const { metrics: r, averageMetrics: s, isSupported: o } = h();
|
|
215
|
+
if (!o || !r)
|
|
216
|
+
return /* @__PURE__ */ t.jsx("div", { className: `performance-dashboard ${n}`, children: /* @__PURE__ */ t.jsx("p", { children: "Performance monitoring not supported in this environment" }) });
|
|
217
|
+
const i = (c) => c >= 90 ? "text-green-600" : c >= 70 ? "text-yellow-600" : "text-red-600", a = (c) => `${(c / 1024 / 1024).toFixed(2)} MB`;
|
|
218
|
+
return /* @__PURE__ */ t.jsxs("div", { className: `performance-dashboard rounded-lg bg-white p-4 shadow ${n}`, children: [
|
|
219
|
+
/* @__PURE__ */ t.jsx("h3", { className: "mb-4 font-semibold text-lg", children: "Performance Dashboard" }),
|
|
220
|
+
/* @__PURE__ */ t.jsxs("div", { className: "mb-4", children: [
|
|
221
|
+
/* @__PURE__ */ t.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
222
|
+
/* @__PURE__ */ t.jsx("span", { children: "Performance Score" }),
|
|
223
|
+
/* @__PURE__ */ t.jsx("span", { className: `font-bold ${i(r.performanceScore)}`, children: r.performanceScore.toFixed(0) })
|
|
224
|
+
] }),
|
|
225
|
+
/* @__PURE__ */ t.jsx("div", { className: "mt-1 h-2 w-full rounded-full bg-gray-200", children: /* @__PURE__ */ t.jsx(
|
|
226
|
+
"div",
|
|
227
|
+
{
|
|
228
|
+
className: `h-2 rounded-full transition-all duration-300 ${r.performanceScore >= 90 ? "bg-green-500" : r.performanceScore >= 70 ? "bg-yellow-500" : "bg-red-500"}`,
|
|
229
|
+
style: { width: `${r.performanceScore}%` }
|
|
230
|
+
}
|
|
231
|
+
) })
|
|
232
|
+
] }),
|
|
233
|
+
/* @__PURE__ */ t.jsxs("div", { className: "mb-4 grid grid-cols-2 gap-4", children: [
|
|
234
|
+
/* @__PURE__ */ t.jsxs("div", { children: [
|
|
235
|
+
/* @__PURE__ */ t.jsx("h4", { className: "mb-2 font-medium", children: "Core Web Vitals" }),
|
|
236
|
+
/* @__PURE__ */ t.jsxs("div", { className: "space-y-1 text-sm", children: [
|
|
237
|
+
r.lcp && /* @__PURE__ */ t.jsxs("div", { children: [
|
|
238
|
+
"LCP: ",
|
|
239
|
+
r.lcp.toFixed(0),
|
|
240
|
+
"ms"
|
|
241
|
+
] }),
|
|
242
|
+
r.fid && /* @__PURE__ */ t.jsxs("div", { children: [
|
|
243
|
+
"FID: ",
|
|
244
|
+
r.fid.toFixed(0),
|
|
245
|
+
"ms"
|
|
246
|
+
] }),
|
|
247
|
+
r.cls && /* @__PURE__ */ t.jsxs("div", { children: [
|
|
248
|
+
"CLS: ",
|
|
249
|
+
r.cls.toFixed(3)
|
|
250
|
+
] })
|
|
251
|
+
] })
|
|
252
|
+
] }),
|
|
253
|
+
/* @__PURE__ */ t.jsxs("div", { children: [
|
|
254
|
+
/* @__PURE__ */ t.jsx("h4", { className: "mb-2 font-medium", children: "Custom Metrics" }),
|
|
255
|
+
/* @__PURE__ */ t.jsxs("div", { className: "space-y-1 text-sm", children: [
|
|
256
|
+
/* @__PURE__ */ t.jsxs("div", { children: [
|
|
257
|
+
"Render: ",
|
|
258
|
+
r.componentRenderTime.toFixed(2),
|
|
259
|
+
"ms"
|
|
260
|
+
] }),
|
|
261
|
+
/* @__PURE__ */ t.jsxs("div", { children: [
|
|
262
|
+
"Memory: ",
|
|
263
|
+
a(r.memoryUsage)
|
|
264
|
+
] }),
|
|
265
|
+
r.bundleLoadTime > 0 && /* @__PURE__ */ t.jsxs("div", { children: [
|
|
266
|
+
"Bundle: ",
|
|
267
|
+
r.bundleLoadTime.toFixed(0),
|
|
268
|
+
"ms"
|
|
269
|
+
] })
|
|
270
|
+
] })
|
|
271
|
+
] })
|
|
272
|
+
] }),
|
|
273
|
+
e && /* @__PURE__ */ t.jsxs("div", { children: [
|
|
274
|
+
/* @__PURE__ */ t.jsx("h4", { className: "mb-2 font-medium", children: "Advanced Metrics" }),
|
|
275
|
+
/* @__PURE__ */ t.jsxs("div", { className: "space-y-1 text-sm", children: [
|
|
276
|
+
/* @__PURE__ */ t.jsxs("div", { children: [
|
|
277
|
+
"Average Render Time: ",
|
|
278
|
+
(s.componentRenderTime || 0).toFixed(2),
|
|
279
|
+
"ms"
|
|
280
|
+
] }),
|
|
281
|
+
/* @__PURE__ */ t.jsxs("div", { children: [
|
|
282
|
+
"Average Memory: ",
|
|
283
|
+
a(s.memoryUsage || 0)
|
|
284
|
+
] }),
|
|
285
|
+
/* @__PURE__ */ t.jsxs("div", { children: [
|
|
286
|
+
"Average Score: ",
|
|
287
|
+
(s.performanceScore || 0).toFixed(0)
|
|
288
|
+
] })
|
|
289
|
+
] })
|
|
290
|
+
] })
|
|
291
|
+
] });
|
|
292
|
+
}
|
|
293
|
+
export {
|
|
294
|
+
v as P,
|
|
295
|
+
P as a,
|
|
296
|
+
S as b,
|
|
297
|
+
x as d,
|
|
298
|
+
l as p,
|
|
299
|
+
h as u,
|
|
300
|
+
w
|
|
301
|
+
};
|
|
302
|
+
//# sourceMappingURL=performance-monitor--rzKTlbj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-monitor--rzKTlbj.js","sources":["../src/core/performance/performance-monitor.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useCallback } from 'react';\n// Import type safely with fallback\ntype ReportHandler = (metric: { name: string; value: number }) => void;\n\n// Performance metrics types\nexport interface PerformanceMetrics {\n // Core Web Vitals\n lcp?: number; // Largest Contentful Paint\n fid?: number; // First Input Delay \n cls?: number; // Cumulative Layout Shift\n fcp?: number; // First Contentful Paint\n ttfb?: number; // Time to First Byte\n inp?: number; // Interaction to Next Paint\n\n // Custom metrics\n componentRenderTime: number;\n bundleLoadTime: number;\n mediaLoadTime: number;\n memoryUsage: number;\n \n // Performance scores\n performanceScore: number;\n timestamp: number;\n}\n\nexport interface PerformanceThresholds {\n lcp: { good: number; poor: number };\n fid: { good: number; poor: number };\n cls: { good: number; poor: number };\n renderTime: { good: number; poor: number };\n memoryUsage: { good: number; poor: number };\n}\n\nexport const defaultThresholds: PerformanceThresholds = {\n lcp: { good: 2500, poor: 4000 },\n fid: { good: 100, poor: 300 },\n cls: { good: 0.1, poor: 0.25 },\n renderTime: { good: 16, poor: 100 }, // Target 60fps = 16.67ms per frame\n memoryUsage: { good: 50 * 1024 * 1024, poor: 100 * 1024 * 1024 } // 50MB good, 100MB poor\n};\n\n// Performance monitoring class\nexport class PerformanceMonitor {\n private metrics: PerformanceMetrics[] = [];\n private listeners: Set<(metrics: PerformanceMetrics) => void> = new Set();\n private thresholds: PerformanceThresholds;\n private observer?: PerformanceObserver;\n private isMonitoring = false;\n\n constructor(thresholds: PerformanceThresholds = defaultThresholds) {\n this.thresholds = thresholds;\n this.initializeWebVitals();\n this.initializePerformanceObserver();\n }\n\n private async initializeWebVitals() {\n if (typeof window === 'undefined') return;\n \n try {\n // Try to import web-vitals dynamically and handle different versions\n const webVitals = await import('web-vitals').catch(() => null);\n \n if (!webVitals) {\n console.warn('web-vitals package not available, Core Web Vitals tracking disabled');\n return;\n }\n \n const reportHandler: ReportHandler = (metric) => {\n this.updateMetric(metric.name.toLowerCase() as keyof PerformanceMetrics, metric.value);\n };\n\n // Handle different web-vitals versions safely\n const vitalsAny = webVitals as any;\n if (vitalsAny.getCLS) vitalsAny.getCLS(reportHandler);\n if (vitalsAny.getFID) vitalsAny.getFID(reportHandler);\n if (vitalsAny.getFCP) vitalsAny.getFCP(reportHandler);\n if (vitalsAny.getLCP) vitalsAny.getLCP(reportHandler);\n if (vitalsAny.getTTFB) vitalsAny.getTTFB(reportHandler);\n if (vitalsAny.onINP) vitalsAny.onINP(reportHandler);\n } catch (error) {\n console.warn('Web Vitals initialization failed:', error);\n }\n }\n\n private initializePerformanceObserver() {\n if (typeof window === 'undefined' || !('PerformanceObserver' in window)) return;\n\n try {\n this.observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.handlePerformanceEntry(entry);\n }\n });\n\n this.observer.observe({ entryTypes: ['measure', 'navigation', 'resource', 'paint'] });\n } catch (error) {\n console.warn('PerformanceObserver not supported:', error);\n }\n }\n\n private handlePerformanceEntry(entry: PerformanceEntry) {\n switch (entry.entryType) {\n case 'measure':\n if (entry.name.startsWith('baroiplayer-render')) {\n this.updateMetric('componentRenderTime', entry.duration);\n }\n break;\n \n case 'resource':\n if (entry.name.includes('.js') || entry.name.includes('.css')) {\n this.updateMetric('bundleLoadTime', entry.duration);\n }\n break;\n \n case 'paint':\n if (entry.name === 'first-contentful-paint') {\n this.updateMetric('fcp', entry.startTime);\n }\n break;\n }\n }\n\n private updateMetric(key: keyof PerformanceMetrics, value: number) {\n const currentMetrics = this.getCurrentMetrics();\n const updatedMetrics = {\n ...currentMetrics,\n [key]: value,\n timestamp: Date.now(),\n performanceScore: this.calculatePerformanceScore({ ...currentMetrics, [key]: value })\n };\n\n this.metrics.push(updatedMetrics);\n \n // Keep only last 100 metrics\n if (this.metrics.length > 100) {\n this.metrics = this.metrics.slice(-100);\n }\n\n this.listeners.forEach(listener => listener(updatedMetrics));\n }\n\n private getCurrentMetrics(): PerformanceMetrics {\n const latest = this.metrics[this.metrics.length - 1];\n return latest || {\n componentRenderTime: 0,\n bundleLoadTime: 0,\n mediaLoadTime: 0,\n memoryUsage: this.getMemoryUsage(),\n performanceScore: 0,\n timestamp: Date.now()\n };\n }\n\n private getMemoryUsage(): number {\n if ('memory' in performance) {\n return (performance as any).memory.usedJSHeapSize || 0;\n }\n return 0;\n }\n\n private calculatePerformanceScore(metrics: PerformanceMetrics): number {\n let score = 100;\n \n // Penalize based on thresholds\n if (metrics.lcp && metrics.lcp > this.thresholds.lcp.good) {\n score -= metrics.lcp > this.thresholds.lcp.poor ? 30 : 15;\n }\n \n if (metrics.fid && metrics.fid > this.thresholds.fid.good) {\n score -= metrics.fid > this.thresholds.fid.poor ? 25 : 10;\n }\n \n if (metrics.cls && metrics.cls > this.thresholds.cls.good) {\n score -= metrics.cls > this.thresholds.cls.poor ? 20 : 10;\n }\n \n if (metrics.componentRenderTime > this.thresholds.renderTime.good) {\n score -= metrics.componentRenderTime > this.thresholds.renderTime.poor ? 20 : 10;\n }\n \n if (metrics.memoryUsage > this.thresholds.memoryUsage.good) {\n score -= metrics.memoryUsage > this.thresholds.memoryUsage.poor ? 15 : 5;\n }\n\n return Math.max(0, score);\n }\n\n // Public API\n public startMonitoring() {\n this.isMonitoring = true;\n this.startMemoryMonitoring();\n }\n\n public stopMonitoring() {\n this.isMonitoring = false;\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n\n private startMemoryMonitoring() {\n if (!this.isMonitoring) return;\n \n this.updateMetric('memoryUsage', this.getMemoryUsage());\n setTimeout(() => this.startMemoryMonitoring(), 5000); // Check every 5 seconds\n }\n\n public measureComponentRender(componentName: string, renderFn: () => any): any {\n const startMark = `baroiplayer-render-${componentName}-start`;\n const endMark = `baroiplayer-render-${componentName}-end`;\n const measureName = `baroiplayer-render-${componentName}`;\n\n performance.mark(startMark);\n const result = renderFn();\n performance.mark(endMark);\n \n try {\n performance.measure(measureName, startMark, endMark);\n } catch (error) {\n console.warn('Performance measurement failed:', error);\n }\n\n return result;\n }\n\n public subscribe(listener: (metrics: PerformanceMetrics) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n public getLatestMetrics(): PerformanceMetrics | null {\n return this.metrics[this.metrics.length - 1] || null;\n }\n\n public getAllMetrics(): PerformanceMetrics[] {\n return [...this.metrics];\n }\n\n public getAverageMetrics(count = 10): Partial<PerformanceMetrics> {\n const recentMetrics = this.metrics.slice(-count);\n if (recentMetrics.length === 0) return {};\n\n const averages: Partial<PerformanceMetrics> = {};\n const keys: Array<keyof PerformanceMetrics> = [\n 'lcp', 'fid', 'cls', 'fcp', 'ttfb', 'inp',\n 'componentRenderTime', 'bundleLoadTime', 'mediaLoadTime',\n 'memoryUsage', 'performanceScore'\n ];\n\n keys.forEach(key => {\n const values = recentMetrics\n .map(m => m[key] as number)\n .filter(v => typeof v === 'number' && !isNaN(v));\n \n if (values.length > 0) {\n (averages as any)[key] = values.reduce((sum, v) => sum + v, 0) / values.length;\n }\n });\n\n return averages;\n }\n\n public getThresholds(): PerformanceThresholds {\n return this.thresholds;\n }\n\n public updateThresholds(newThresholds: Partial<PerformanceThresholds>) {\n this.thresholds = { ...this.thresholds, ...newThresholds };\n }\n}\n\n// Global performance monitor instance\nexport const performanceMonitor = new PerformanceMonitor();\n\n// React hook for performance monitoring\nexport function usePerformanceMonitor() {\n const [metrics, setMetrics] = useState<PerformanceMetrics | null>(null);\n const [isSupported, setIsSupported] = useState(true);\n\n useEffect(() => {\n setIsSupported(typeof window !== 'undefined' && 'performance' in window);\n \n if (!isSupported) return;\n\n performanceMonitor.startMonitoring();\n const unsubscribe = performanceMonitor.subscribe(setMetrics);\n\n return () => {\n unsubscribe();\n performanceMonitor.stopMonitoring();\n };\n }, [isSupported]);\n\n const measureRender = useCallback(\n (componentName: string, renderFn: () => any): any => {\n return performanceMonitor.measureComponentRender(componentName, renderFn);\n },\n []\n );\n\n return {\n metrics,\n isSupported,\n measureRender,\n averageMetrics: performanceMonitor.getAverageMetrics(),\n allMetrics: performanceMonitor.getAllMetrics(),\n thresholds: performanceMonitor.getThresholds()\n };\n}\n\n// HOC for performance monitoring\nexport function withPerformanceMonitoring(\n WrappedComponent: React.ComponentType<any>,\n componentName?: string\n) {\n const displayName = componentName || WrappedComponent.displayName || WrappedComponent.name || 'Component';\n \n function PerformanceMonitoredComponent(props: any) {\n const renderRef = useRef(0);\n const { measureRender } = usePerformanceMonitor();\n\n return measureRender(`${displayName}-${renderRef.current++}`, () => (\n <WrappedComponent {...props} />\n ));\n }\n\n PerformanceMonitoredComponent.displayName = `withPerformanceMonitoring(${displayName})`;\n return PerformanceMonitoredComponent;\n}\n\n// Performance regression detector\nexport class PerformanceRegressionDetector {\n private baselineMetrics: PerformanceMetrics | null = null;\n private regressionThreshold = 0.2; // 20% degradation threshold\n\n setBaseline(metrics: PerformanceMetrics) {\n this.baselineMetrics = metrics;\n }\n\n detectRegression(currentMetrics: PerformanceMetrics): Array<{\n metric: keyof PerformanceMetrics;\n baseline: number;\n current: number;\n degradation: number;\n }> {\n if (!this.baselineMetrics) return [];\n\n const regressions: Array<{\n metric: keyof PerformanceMetrics;\n baseline: number;\n current: number;\n degradation: number;\n }> = [];\n\n const metricsToCheck: Array<keyof PerformanceMetrics> = [\n 'componentRenderTime', 'bundleLoadTime', 'mediaLoadTime', 'memoryUsage'\n ];\n\n metricsToCheck.forEach(metric => {\n const baseline = this.baselineMetrics![metric] as number;\n const current = currentMetrics[metric] as number;\n \n if (baseline && current && baseline > 0) {\n const degradation = (current - baseline) / baseline;\n if (degradation > this.regressionThreshold) {\n regressions.push({ metric, baseline, current, degradation });\n }\n }\n });\n\n return regressions;\n }\n\n setRegressionThreshold(threshold: number) {\n this.regressionThreshold = Math.max(0, Math.min(1, threshold));\n }\n}\n\n// Development dashboard component\nexport interface PerformanceDashboardProps {\n className?: string;\n showAdvanced?: boolean;\n}\n\nexport function PerformanceDashboard({ \n className = '', \n showAdvanced = false \n}: PerformanceDashboardProps) {\n const { metrics, averageMetrics, thresholds, isSupported } = usePerformanceMonitor();\n\n if (!isSupported || !metrics) {\n return (\n <div className={`performance-dashboard ${className}`}>\n <p>Performance monitoring not supported in this environment</p>\n </div>\n );\n }\n\n const getScoreColor = (score: number) => {\n if (score >= 90) return 'text-green-600';\n if (score >= 70) return 'text-yellow-600';\n return 'text-red-600';\n };\n\n const formatBytes = (bytes: number) => {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n };\n\n return (\n <div className={`performance-dashboard rounded-lg bg-white p-4 shadow ${className}`}>\n <h3 className=\"mb-4 font-semibold text-lg\">Performance Dashboard</h3>\n \n {/* Performance Score */}\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between\">\n <span>Performance Score</span>\n <span className={`font-bold ${getScoreColor(metrics.performanceScore)}`}>\n {metrics.performanceScore.toFixed(0)}\n </span>\n </div>\n <div className=\"mt-1 h-2 w-full rounded-full bg-gray-200\">\n <div \n className={`h-2 rounded-full transition-all duration-300 ${\n metrics.performanceScore >= 90 ? 'bg-green-500' :\n metrics.performanceScore >= 70 ? 'bg-yellow-500' : 'bg-red-500'\n }`}\n style={{ width: `${metrics.performanceScore}%` }}\n />\n </div>\n </div>\n\n {/* Core Web Vitals */}\n <div className=\"mb-4 grid grid-cols-2 gap-4\">\n <div>\n <h4 className=\"mb-2 font-medium\">Core Web Vitals</h4>\n <div className=\"space-y-1 text-sm\">\n {metrics.lcp && (\n <div>LCP: {metrics.lcp.toFixed(0)}ms</div>\n )}\n {metrics.fid && (\n <div>FID: {metrics.fid.toFixed(0)}ms</div>\n )}\n {metrics.cls && (\n <div>CLS: {metrics.cls.toFixed(3)}</div>\n )}\n </div>\n </div>\n \n <div>\n <h4 className=\"mb-2 font-medium\">Custom Metrics</h4>\n <div className=\"space-y-1 text-sm\">\n <div>Render: {metrics.componentRenderTime.toFixed(2)}ms</div>\n <div>Memory: {formatBytes(metrics.memoryUsage)}</div>\n {metrics.bundleLoadTime > 0 && (\n <div>Bundle: {metrics.bundleLoadTime.toFixed(0)}ms</div>\n )}\n </div>\n </div>\n </div>\n\n {/* Advanced metrics */}\n {showAdvanced && (\n <div>\n <h4 className=\"mb-2 font-medium\">Advanced Metrics</h4>\n <div className=\"space-y-1 text-sm\">\n <div>Average Render Time: {(averageMetrics.componentRenderTime || 0).toFixed(2)}ms</div>\n <div>Average Memory: {formatBytes(averageMetrics.memoryUsage || 0)}</div>\n <div>Average Score: {(averageMetrics.performanceScore || 0).toFixed(0)}</div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default PerformanceMonitor;"],"names":["defaultThresholds","PerformanceMonitor","thresholds","__publicField","webVitals","reportHandler","metric","vitalsAny","error","list","entry","key","value","currentMetrics","updatedMetrics","listener","metrics","score","componentName","renderFn","startMark","endMark","measureName","result","count","recentMetrics","averages","values","m","v","sum","newThresholds","performanceMonitor","usePerformanceMonitor","setMetrics","useState","isSupported","setIsSupported","useEffect","unsubscribe","measureRender","useCallback","withPerformanceMonitoring","WrappedComponent","displayName","PerformanceMonitoredComponent","props","renderRef","useRef","jsx","PerformanceRegressionDetector","regressions","baseline","current","degradation","threshold","PerformanceDashboard","className","showAdvanced","averageMetrics","getScoreColor","formatBytes","bytes","jsxs"],"mappings":";;;;;AAiCO,MAAMA,IAA2C;AAAA,EACtD,KAAK,EAAE,MAAM,MAAM,MAAM,IAAA;AAAA,EACzB,KAAK,EAAE,MAAM,KAAK,MAAM,IAAA;AAAA,EACxB,KAAK,EAAE,MAAM,KAAK,MAAM,KAAA;AAAA,EACxB,YAAY,EAAE,MAAM,IAAI,MAAM,IAAA;AAAA;AAAA,EAC9B,aAAa,EAAE,MAAM,KAAK,OAAO,MAAM,MAAM,MAAM,OAAO,KAAA;AAAA;AAC5D;AAGO,MAAMC,EAAmB;AAAA,EAO9B,YAAYC,IAAoCF,GAAmB;AAN3D,IAAAG,EAAA,iBAAgC,CAAA;AAChC,IAAAA,EAAA,uCAA4D,IAAA;AAC5D,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,sBAAe;AAGrB,SAAK,aAAaD,GAClB,KAAK,oBAAA,GACL,KAAK,8BAAA;AAAA,EACP;AAAA,EAEA,MAAc,sBAAsB;AAClC,QAAI,SAAO,SAAW;AAEtB,UAAI;AAEF,cAAME,IAAY,MAAM,OAAO,YAAY,EAAE,MAAM,MAAM,IAAI;AAE7D,YAAI,CAACA,GAAW;AACd,kBAAQ,KAAK,qEAAqE;AAClF;AAAA,QACF;AAEA,cAAMC,IAA+B,CAACC,MAAW;AAC/C,eAAK,aAAaA,EAAO,KAAK,YAAA,GAA2CA,EAAO,KAAK;AAAA,QACvF,GAGMC,IAAYH;AAClB,QAAIG,EAAU,UAAQA,EAAU,OAAOF,CAAa,GAChDE,EAAU,UAAQA,EAAU,OAAOF,CAAa,GAChDE,EAAU,UAAQA,EAAU,OAAOF,CAAa,GAChDE,EAAU,UAAQA,EAAU,OAAOF,CAAa,GAChDE,EAAU,WAASA,EAAU,QAAQF,CAAa,GAClDE,EAAU,SAAOA,EAAU,MAAMF,CAAa;AAAA,MACpD,SAASG,GAAO;AACd,gBAAQ,KAAK,qCAAqCA,CAAK;AAAA,MACzD;AAAA,EACF;AAAA,EAEQ,gCAAgC;AACtC,QAAI,SAAO,SAAW,OAAe,EAAE,yBAAyB;AAEhE,UAAI;AACF,aAAK,WAAW,IAAI,oBAAoB,CAACC,MAAS;AAChD,qBAAWC,KAASD,EAAK;AACvB,iBAAK,uBAAuBC,CAAK;AAAA,QAErC,CAAC,GAED,KAAK,SAAS,QAAQ,EAAE,YAAY,CAAC,WAAW,cAAc,YAAY,OAAO,GAAG;AAAA,MACtF,SAASF,GAAO;AACd,gBAAQ,KAAK,sCAAsCA,CAAK;AAAA,MAC1D;AAAA,EACF;AAAA,EAEQ,uBAAuBE,GAAyB;AACtD,YAAQA,EAAM,WAAA;AAAA,MACZ,KAAK;AACH,QAAIA,EAAM,KAAK,WAAW,oBAAoB,KAC5C,KAAK,aAAa,uBAAuBA,EAAM,QAAQ;AAEzD;AAAA,MAEF,KAAK;AACH,SAAIA,EAAM,KAAK,SAAS,KAAK,KAAKA,EAAM,KAAK,SAAS,MAAM,MAC1D,KAAK,aAAa,kBAAkBA,EAAM,QAAQ;AAEpD;AAAA,MAEF,KAAK;AACH,QAAIA,EAAM,SAAS,4BACjB,KAAK,aAAa,OAAOA,EAAM,SAAS;AAE1C;AAAA,IAAA;AAAA,EAEN;AAAA,EAEQ,aAAaC,GAA+BC,GAAe;AACjE,UAAMC,IAAiB,KAAK,kBAAA,GACtBC,IAAiB;AAAA,MACrB,GAAGD;AAAA,MACH,CAACF,CAAG,GAAGC;AAAA,MACP,WAAW,KAAK,IAAA;AAAA,MAChB,kBAAkB,KAAK,0BAA0B,EAAE,GAAGC,GAAgB,CAACF,CAAG,GAAGC,EAAA,CAAO;AAAA,IAAA;AAGtF,SAAK,QAAQ,KAAKE,CAAc,GAG5B,KAAK,QAAQ,SAAS,QACxB,KAAK,UAAU,KAAK,QAAQ,MAAM,IAAI,IAGxC,KAAK,UAAU,QAAQ,CAAAC,MAAYA,EAASD,CAAc,CAAC;AAAA,EAC7D;AAAA,EAEQ,oBAAwC;AAE9C,WADe,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC,KAClC;AAAA,MACf,qBAAqB;AAAA,MACrB,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,aAAa,KAAK,eAAA;AAAA,MAClB,kBAAkB;AAAA,MAClB,WAAW,KAAK,IAAA;AAAA,IAAI;AAAA,EAExB;AAAA,EAEQ,iBAAyB;AAC/B,WAAI,YAAY,eACN,YAAoB,OAAO,kBAAkB;AAAA,EAGzD;AAAA,EAEQ,0BAA0BE,GAAqC;AACrE,QAAIC,IAAQ;AAGZ,WAAID,EAAQ,OAAOA,EAAQ,MAAM,KAAK,WAAW,IAAI,SACnDC,KAASD,EAAQ,MAAM,KAAK,WAAW,IAAI,OAAO,KAAK,KAGrDA,EAAQ,OAAOA,EAAQ,MAAM,KAAK,WAAW,IAAI,SACnDC,KAASD,EAAQ,MAAM,KAAK,WAAW,IAAI,OAAO,KAAK,KAGrDA,EAAQ,OAAOA,EAAQ,MAAM,KAAK,WAAW,IAAI,SACnDC,KAASD,EAAQ,MAAM,KAAK,WAAW,IAAI,OAAO,KAAK,KAGrDA,EAAQ,sBAAsB,KAAK,WAAW,WAAW,SAC3DC,KAASD,EAAQ,sBAAsB,KAAK,WAAW,WAAW,OAAO,KAAK,KAG5EA,EAAQ,cAAc,KAAK,WAAW,YAAY,SACpDC,KAASD,EAAQ,cAAc,KAAK,WAAW,YAAY,OAAO,KAAK,IAGlE,KAAK,IAAI,GAAGC,CAAK;AAAA,EAC1B;AAAA;AAAA,EAGO,kBAAkB;AACvB,SAAK,eAAe,IACpB,KAAK,sBAAA;AAAA,EACP;AAAA,EAEO,iBAAiB;AACtB,SAAK,eAAe,IAChB,KAAK,YACP,KAAK,SAAS,WAAA;AAAA,EAElB;AAAA,EAEQ,wBAAwB;AAC9B,IAAK,KAAK,iBAEV,KAAK,aAAa,eAAe,KAAK,eAAA,CAAgB,GACtD,WAAW,MAAM,KAAK,sBAAA,GAAyB,GAAI;AAAA,EACrD;AAAA,EAEO,uBAAuBC,GAAuBC,GAA0B;AAC7E,UAAMC,IAAY,sBAAsBF,CAAa,UAC/CG,IAAU,sBAAsBH,CAAa,QAC7CI,IAAc,sBAAsBJ,CAAa;AAEvD,gBAAY,KAAKE,CAAS;AAC1B,UAAMG,IAASJ,EAAA;AACf,gBAAY,KAAKE,CAAO;AAExB,QAAI;AACF,kBAAY,QAAQC,GAAaF,GAAWC,CAAO;AAAA,IACrD,SAASb,GAAO;AACd,cAAQ,KAAK,mCAAmCA,CAAK;AAAA,IACvD;AAEA,WAAOe;AAAA,EACT;AAAA,EAEO,UAAUR,GAA6D;AAC5E,gBAAK,UAAU,IAAIA,CAAQ,GACpB,MAAM,KAAK,UAAU,OAAOA,CAAQ;AAAA,EAC7C;AAAA,EAEO,mBAA8C;AACnD,WAAO,KAAK,QAAQ,KAAK,QAAQ,SAAS,CAAC,KAAK;AAAA,EAClD;AAAA,EAEO,gBAAsC;AAC3C,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EAEO,kBAAkBS,IAAQ,IAAiC;AAChE,UAAMC,IAAgB,KAAK,QAAQ,MAAM,CAACD,CAAK;AAC/C,QAAIC,EAAc,WAAW,EAAG,QAAO,CAAA;AAEvC,UAAMC,IAAwC,CAAA;AAO9C,WAN8C;AAAA,MAC5C;AAAA,MAAO;AAAA,MAAO;AAAA,MAAO;AAAA,MAAO;AAAA,MAAQ;AAAA,MACpC;AAAA,MAAuB;AAAA,MAAkB;AAAA,MACzC;AAAA,MAAe;AAAA,IAAA,EAGZ,QAAQ,CAAAf,MAAO;AAClB,YAAMgB,IAASF,EACZ,IAAI,CAAAG,MAAKA,EAAEjB,CAAG,CAAW,EACzB,OAAO,CAAAkB,MAAK,OAAOA,KAAM,YAAY,CAAC,MAAMA,CAAC,CAAC;AAEjD,MAAIF,EAAO,SAAS,MACjBD,EAAiBf,CAAG,IAAIgB,EAAO,OAAO,CAACG,GAAKD,MAAMC,IAAMD,GAAG,CAAC,IAAIF,EAAO;AAAA,IAE5E,CAAC,GAEMD;AAAA,EACT;AAAA,EAEO,gBAAuC;AAC5C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,iBAAiBK,GAA+C;AACrE,SAAK,aAAa,EAAE,GAAG,KAAK,YAAY,GAAGA,EAAA;AAAA,EAC7C;AACF;AAGO,MAAMC,IAAqB,IAAI/B,EAAA;AAG/B,SAASgC,IAAwB;AACtC,QAAM,CAACjB,GAASkB,CAAU,IAAIC,EAAoC,IAAI,GAChE,CAACC,GAAaC,CAAc,IAAIF,EAAS,EAAI;AAEnD,EAAAG,EAAU,MAAM;AAGd,QAFAD,EAAe,OAAO,SAAW,OAAe,iBAAiB,MAAM,GAEnE,CAACD,EAAa;AAElB,IAAAJ,EAAmB,gBAAA;AACnB,UAAMO,IAAcP,EAAmB,UAAUE,CAAU;AAE3D,WAAO,MAAM;AACX,MAAAK,EAAA,GACAP,EAAmB,eAAA;AAAA,IACrB;AAAA,EACF,GAAG,CAACI,CAAW,CAAC;AAEhB,QAAMI,IAAgBC;AAAA,IACpB,CAACvB,GAAuBC,MACfa,EAAmB,uBAAuBd,GAAeC,CAAQ;AAAA,IAE1E,CAAA;AAAA,EAAC;AAGH,SAAO;AAAA,IACL,SAAAH;AAAA,IACA,aAAAoB;AAAA,IACA,eAAAI;AAAA,IACA,gBAAgBR,EAAmB,kBAAA;AAAA,IACnC,YAAYA,EAAmB,cAAA;AAAA,IAC/B,YAAYA,EAAmB,cAAA;AAAA,EAAc;AAEjD;AAGO,SAASU,EACdC,GACAzB,GACA;AACA,QAAM0B,IAAc1B,KAAiByB,EAAiB,eAAeA,EAAiB,QAAQ;AAE9F,WAASE,EAA8BC,GAAY;AACjD,UAAMC,IAAYC,EAAO,CAAC,GACpB,EAAE,eAAAR,EAAA,IAAkBP,EAAA;AAE1B,WAAOO,EAAc,GAAGI,CAAW,IAAIG,EAAU,SAAS,IAAI,MAC5DE,gBAAAA,EAAAA,IAACN,GAAA,EAAkB,GAAGG,EAAA,CAAO,CAC9B;AAAA,EACH;AAEA,SAAAD,EAA8B,cAAc,6BAA6BD,CAAW,KAC7EC;AACT;AAGO,MAAMK,EAA8B;AAAA,EAApC;AACG,IAAA/C,EAAA,yBAA6C;AAC7C,IAAAA,EAAA,6BAAsB;AAAA;AAAA;AAAA,EAE9B,YAAYa,GAA6B;AACvC,SAAK,kBAAkBA;AAAA,EACzB;AAAA,EAEA,iBAAiBH,GAKd;AACD,QAAI,CAAC,KAAK,gBAAiB,QAAO,CAAA;AAElC,UAAMsC,IAKD,CAAA;AAML,WAJwD;AAAA,MACtD;AAAA,MAAuB;AAAA,MAAkB;AAAA,MAAiB;AAAA,IAAA,EAG7C,QAAQ,CAAA7C,MAAU;AAC/B,YAAM8C,IAAW,KAAK,gBAAiB9C,CAAM,GACvC+C,IAAUxC,EAAeP,CAAM;AAErC,UAAI8C,KAAYC,KAAWD,IAAW,GAAG;AACvC,cAAME,KAAeD,IAAUD,KAAYA;AAC3C,QAAIE,IAAc,KAAK,uBACrBH,EAAY,KAAK,EAAE,QAAA7C,GAAQ,UAAA8C,GAAU,SAAAC,GAAS,aAAAC,GAAa;AAAA,MAE/D;AAAA,IACF,CAAC,GAEMH;AAAA,EACT;AAAA,EAEA,uBAAuBI,GAAmB;AACxC,SAAK,sBAAsB,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGA,CAAS,CAAC;AAAA,EAC/D;AACF;AAQO,SAASC,EAAqB;AAAA,EACnC,WAAAC,IAAY;AAAA,EACZ,cAAAC,IAAe;AACjB,GAA8B;AAC5B,QAAM,EAAE,SAAA1C,GAAS,gBAAA2C,GAA4B,aAAAvB,EAAA,IAAgBH,EAAA;AAE7D,MAAI,CAACG,KAAe,CAACpB;AACnB,WACEiC,gBAAAA,EAAAA,IAAC,SAAI,WAAW,yBAAyBQ,CAAS,IAChD,UAAAR,gBAAAA,EAAAA,IAAC,KAAA,EAAE,UAAA,2DAAA,CAAwD,EAAA,CAC7D;AAIJ,QAAMW,IAAgB,CAAC3C,MACjBA,KAAS,KAAW,mBACpBA,KAAS,KAAW,oBACjB,gBAGH4C,IAAc,CAACC,MACZ,IAAIA,IAAQ,OAAO,MAAM,QAAQ,CAAC,CAAC;AAG5C,SACEC,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAW,wDAAwDN,CAAS,IAC/E,UAAA;AAAA,IAAAR,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,8BAA6B,UAAA,yBAAqB;AAAA,IAGhEc,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,MAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,QAAAd,gBAAAA,EAAAA,IAAC,UAAK,UAAA,oBAAA,CAAiB;AAAA,QACvBA,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAW,aAAaW,EAAc5C,EAAQ,gBAAgB,CAAC,IAClE,UAAAA,EAAQ,iBAAiB,QAAQ,CAAC,EAAA,CACrC;AAAA,MAAA,GACF;AAAA,MACAiC,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,4CACb,UAAAA,gBAAAA,EAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW,gDACTjC,EAAQ,oBAAoB,KAAK,iBACjCA,EAAQ,oBAAoB,KAAK,kBAAkB,YACrD;AAAA,UACA,OAAO,EAAE,OAAO,GAAGA,EAAQ,gBAAgB,IAAA;AAAA,QAAI;AAAA,MAAA,EACjD,CACF;AAAA,IAAA,GACF;AAAA,IAGA+C,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAAA,gBAAAA,OAAC,OAAA,EACC,UAAA;AAAA,QAAAd,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,oBAAmB,UAAA,mBAAe;AAAA,QAChDc,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,qBACZ,UAAA;AAAA,UAAA/C,EAAQ,8BACN,OAAA,EAAI,UAAA;AAAA,YAAA;AAAA,YAAMA,EAAQ,IAAI,QAAQ,CAAC;AAAA,YAAE;AAAA,UAAA,GAAE;AAAA,UAErCA,EAAQ,OACP+C,gBAAAA,EAAAA,KAAC,OAAA,EAAI,UAAA;AAAA,YAAA;AAAA,YAAM/C,EAAQ,IAAI,QAAQ,CAAC;AAAA,YAAE;AAAA,UAAA,GAAE;AAAA,UAErCA,EAAQ,OACP+C,gBAAAA,EAAAA,KAAC,OAAA,EAAI,UAAA;AAAA,YAAA;AAAA,YAAM/C,EAAQ,IAAI,QAAQ,CAAC;AAAA,UAAA,EAAA,CAAE;AAAA,QAAA,EAAA,CAEtC;AAAA,MAAA,GACF;AAAA,6BAEC,OAAA,EACC,UAAA;AAAA,QAAAiC,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,oBAAmB,UAAA,kBAAc;AAAA,QAC/Cc,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,UAAAA,gBAAAA,OAAC,OAAA,EAAI,UAAA;AAAA,YAAA;AAAA,YAAS/C,EAAQ,oBAAoB,QAAQ,CAAC;AAAA,YAAE;AAAA,UAAA,GAAE;AAAA,iCACtD,OAAA,EAAI,UAAA;AAAA,YAAA;AAAA,YAAS6C,EAAY7C,EAAQ,WAAW;AAAA,UAAA,GAAE;AAAA,UAC9CA,EAAQ,iBAAiB,KACxB+C,gBAAAA,EAAAA,KAAC,OAAA,EAAI,UAAA;AAAA,YAAA;AAAA,YAAS/C,EAAQ,eAAe,QAAQ,CAAC;AAAA,YAAE;AAAA,UAAA,EAAA,CAAE;AAAA,QAAA,EAAA,CAEtD;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAGC0C,4BACE,OAAA,EACC,UAAA;AAAA,MAAAT,gBAAAA,EAAAA,IAAC,MAAA,EAAG,WAAU,oBAAmB,UAAA,oBAAgB;AAAA,MACjDc,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,QAAAA,gBAAAA,OAAC,OAAA,EAAI,UAAA;AAAA,UAAA;AAAA,WAAuBJ,EAAe,uBAAuB,GAAG,QAAQ,CAAC;AAAA,UAAE;AAAA,QAAA,GAAE;AAAA,+BACjF,OAAA,EAAI,UAAA;AAAA,UAAA;AAAA,UAAiBE,EAAYF,EAAe,eAAe,CAAC;AAAA,QAAA,GAAE;AAAA,+BAClE,OAAA,EAAI,UAAA;AAAA,UAAA;AAAA,WAAiBA,EAAe,oBAAoB,GAAG,QAAQ,CAAC;AAAA,QAAA,EAAA,CAAE;AAAA,MAAA,EAAA,CACzE;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var g=Object.create;var h=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var v=(i,e,r)=>e in i?h(i,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):i[e]=r;var y=(i,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of j(e))!R.call(i,o)&&o!==r&&h(i,o,{get:()=>e[o],enumerable:!(s=b(e,o))||s.enumerable});return i};var T=(i,e,r)=>(r=i!=null?g(M(i)):{},y(e||!i||!i.__esModule?h(r,"default",{value:i,enumerable:!0}):r,i));var d=(i,e,r)=>v(i,typeof e!="symbol"?e+"":e,r);const t=require("./context-CwZnPdz0.cjs"),l=require("react"),p={lcp:{good:2500,poor:4e3},fid:{good:100,poor:300},cls:{good:.1,poor:.25},renderTime:{good:16,poor:100},memoryUsage:{good:50*1024*1024,poor:100*1024*1024}};class f{constructor(e=p){d(this,"metrics",[]);d(this,"listeners",new Set);d(this,"thresholds");d(this,"observer");d(this,"isMonitoring",!1);this.thresholds=e,this.initializeWebVitals(),this.initializePerformanceObserver()}async initializeWebVitals(){if(!(typeof window>"u"))try{const e=await import("web-vitals").catch(()=>null);if(!e){console.warn("web-vitals package not available, Core Web Vitals tracking disabled");return}const r=o=>{this.updateMetric(o.name.toLowerCase(),o.value)},s=e;s.getCLS&&s.getCLS(r),s.getFID&&s.getFID(r),s.getFCP&&s.getFCP(r),s.getLCP&&s.getLCP(r),s.getTTFB&&s.getTTFB(r),s.onINP&&s.onINP(r)}catch(e){console.warn("Web Vitals initialization failed:",e)}}initializePerformanceObserver(){if(!(typeof window>"u"||!("PerformanceObserver"in window)))try{this.observer=new PerformanceObserver(e=>{for(const r of e.getEntries())this.handlePerformanceEntry(r)}),this.observer.observe({entryTypes:["measure","navigation","resource","paint"]})}catch(e){console.warn("PerformanceObserver not supported:",e)}}handlePerformanceEntry(e){switch(e.entryType){case"measure":e.name.startsWith("baroiplayer-render")&&this.updateMetric("componentRenderTime",e.duration);break;case"resource":(e.name.includes(".js")||e.name.includes(".css"))&&this.updateMetric("bundleLoadTime",e.duration);break;case"paint":e.name==="first-contentful-paint"&&this.updateMetric("fcp",e.startTime);break}}updateMetric(e,r){const s=this.getCurrentMetrics(),o={...s,[e]:r,timestamp:Date.now(),performanceScore:this.calculatePerformanceScore({...s,[e]:r})};this.metrics.push(o),this.metrics.length>100&&(this.metrics=this.metrics.slice(-100)),this.listeners.forEach(n=>n(o))}getCurrentMetrics(){return this.metrics[this.metrics.length-1]||{componentRenderTime:0,bundleLoadTime:0,mediaLoadTime:0,memoryUsage:this.getMemoryUsage(),performanceScore:0,timestamp:Date.now()}}getMemoryUsage(){return"memory"in performance&&performance.memory.usedJSHeapSize||0}calculatePerformanceScore(e){let r=100;return e.lcp&&e.lcp>this.thresholds.lcp.good&&(r-=e.lcp>this.thresholds.lcp.poor?30:15),e.fid&&e.fid>this.thresholds.fid.good&&(r-=e.fid>this.thresholds.fid.poor?25:10),e.cls&&e.cls>this.thresholds.cls.good&&(r-=e.cls>this.thresholds.cls.poor?20:10),e.componentRenderTime>this.thresholds.renderTime.good&&(r-=e.componentRenderTime>this.thresholds.renderTime.poor?20:10),e.memoryUsage>this.thresholds.memoryUsage.good&&(r-=e.memoryUsage>this.thresholds.memoryUsage.poor?15:5),Math.max(0,r)}startMonitoring(){this.isMonitoring=!0,this.startMemoryMonitoring()}stopMonitoring(){this.isMonitoring=!1,this.observer&&this.observer.disconnect()}startMemoryMonitoring(){this.isMonitoring&&(this.updateMetric("memoryUsage",this.getMemoryUsage()),setTimeout(()=>this.startMemoryMonitoring(),5e3))}measureComponentRender(e,r){const s=`baroiplayer-render-${e}-start`,o=`baroiplayer-render-${e}-end`,n=`baroiplayer-render-${e}`;performance.mark(s);const a=r();performance.mark(o);try{performance.measure(n,s,o)}catch(c){console.warn("Performance measurement failed:",c)}return a}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}getLatestMetrics(){return this.metrics[this.metrics.length-1]||null}getAllMetrics(){return[...this.metrics]}getAverageMetrics(e=10){const r=this.metrics.slice(-e);if(r.length===0)return{};const s={};return["lcp","fid","cls","fcp","ttfb","inp","componentRenderTime","bundleLoadTime","mediaLoadTime","memoryUsage","performanceScore"].forEach(n=>{const a=r.map(c=>c[n]).filter(c=>typeof c=="number"&&!isNaN(c));a.length>0&&(s[n]=a.reduce((c,x)=>c+x,0)/a.length)}),s}getThresholds(){return this.thresholds}updateThresholds(e){this.thresholds={...this.thresholds,...e}}}const m=new f;function u(){const[i,e]=l.useState(null),[r,s]=l.useState(!0);l.useEffect(()=>{if(s(typeof window<"u"&&"performance"in window),!r)return;m.startMonitoring();const n=m.subscribe(e);return()=>{n(),m.stopMonitoring()}},[r]);const o=l.useCallback((n,a)=>m.measureComponentRender(n,a),[]);return{metrics:i,isSupported:r,measureRender:o,averageMetrics:m.getAverageMetrics(),allMetrics:m.getAllMetrics(),thresholds:m.getThresholds()}}function E(i,e){const r=e||i.displayName||i.name||"Component";function s(o){const n=l.useRef(0),{measureRender:a}=u();return a(`${r}-${n.current++}`,()=>t.jsxRuntimeExports.jsx(i,{...o}))}return s.displayName=`withPerformanceMonitoring(${r})`,s}class w{constructor(){d(this,"baselineMetrics",null);d(this,"regressionThreshold",.2)}setBaseline(e){this.baselineMetrics=e}detectRegression(e){if(!this.baselineMetrics)return[];const r=[];return["componentRenderTime","bundleLoadTime","mediaLoadTime","memoryUsage"].forEach(o=>{const n=this.baselineMetrics[o],a=e[o];if(n&&a&&n>0){const c=(a-n)/n;c>this.regressionThreshold&&r.push({metric:o,baseline:n,current:a,degradation:c})}}),r}setRegressionThreshold(e){this.regressionThreshold=Math.max(0,Math.min(1,e))}}function P({className:i="",showAdvanced:e=!1}){const{metrics:r,averageMetrics:s,isSupported:o}=u();if(!o||!r)return t.jsxRuntimeExports.jsx("div",{className:`performance-dashboard ${i}`,children:t.jsxRuntimeExports.jsx("p",{children:"Performance monitoring not supported in this environment"})});const n=c=>c>=90?"text-green-600":c>=70?"text-yellow-600":"text-red-600",a=c=>`${(c/1024/1024).toFixed(2)} MB`;return t.jsxRuntimeExports.jsxs("div",{className:`performance-dashboard rounded-lg bg-white p-4 shadow ${i}`,children:[t.jsxRuntimeExports.jsx("h3",{className:"mb-4 font-semibold text-lg",children:"Performance Dashboard"}),t.jsxRuntimeExports.jsxs("div",{className:"mb-4",children:[t.jsxRuntimeExports.jsxs("div",{className:"flex items-center justify-between",children:[t.jsxRuntimeExports.jsx("span",{children:"Performance Score"}),t.jsxRuntimeExports.jsx("span",{className:`font-bold ${n(r.performanceScore)}`,children:r.performanceScore.toFixed(0)})]}),t.jsxRuntimeExports.jsx("div",{className:"mt-1 h-2 w-full rounded-full bg-gray-200",children:t.jsxRuntimeExports.jsx("div",{className:`h-2 rounded-full transition-all duration-300 ${r.performanceScore>=90?"bg-green-500":r.performanceScore>=70?"bg-yellow-500":"bg-red-500"}`,style:{width:`${r.performanceScore}%`}})})]}),t.jsxRuntimeExports.jsxs("div",{className:"mb-4 grid grid-cols-2 gap-4",children:[t.jsxRuntimeExports.jsxs("div",{children:[t.jsxRuntimeExports.jsx("h4",{className:"mb-2 font-medium",children:"Core Web Vitals"}),t.jsxRuntimeExports.jsxs("div",{className:"space-y-1 text-sm",children:[r.lcp&&t.jsxRuntimeExports.jsxs("div",{children:["LCP: ",r.lcp.toFixed(0),"ms"]}),r.fid&&t.jsxRuntimeExports.jsxs("div",{children:["FID: ",r.fid.toFixed(0),"ms"]}),r.cls&&t.jsxRuntimeExports.jsxs("div",{children:["CLS: ",r.cls.toFixed(3)]})]})]}),t.jsxRuntimeExports.jsxs("div",{children:[t.jsxRuntimeExports.jsx("h4",{className:"mb-2 font-medium",children:"Custom Metrics"}),t.jsxRuntimeExports.jsxs("div",{className:"space-y-1 text-sm",children:[t.jsxRuntimeExports.jsxs("div",{children:["Render: ",r.componentRenderTime.toFixed(2),"ms"]}),t.jsxRuntimeExports.jsxs("div",{children:["Memory: ",a(r.memoryUsage)]}),r.bundleLoadTime>0&&t.jsxRuntimeExports.jsxs("div",{children:["Bundle: ",r.bundleLoadTime.toFixed(0),"ms"]})]})]})]}),e&&t.jsxRuntimeExports.jsxs("div",{children:[t.jsxRuntimeExports.jsx("h4",{className:"mb-2 font-medium",children:"Advanced Metrics"}),t.jsxRuntimeExports.jsxs("div",{className:"space-y-1 text-sm",children:[t.jsxRuntimeExports.jsxs("div",{children:["Average Render Time: ",(s.componentRenderTime||0).toFixed(2),"ms"]}),t.jsxRuntimeExports.jsxs("div",{children:["Average Memory: ",a(s.memoryUsage||0)]}),t.jsxRuntimeExports.jsxs("div",{children:["Average Score: ",(s.performanceScore||0).toFixed(0)]})]})]})]})}exports.PerformanceDashboard=P;exports.PerformanceMonitor=f;exports.PerformanceRegressionDetector=w;exports.defaultThresholds=p;exports.performanceMonitor=m;exports.usePerformanceMonitor=u;exports.withPerformanceMonitoring=E;
|
|
2
|
+
//# sourceMappingURL=performance-monitor-cjIvZE2D.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performance-monitor-cjIvZE2D.cjs","sources":["../src/core/performance/performance-monitor.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useCallback } from 'react';\n// Import type safely with fallback\ntype ReportHandler = (metric: { name: string; value: number }) => void;\n\n// Performance metrics types\nexport interface PerformanceMetrics {\n // Core Web Vitals\n lcp?: number; // Largest Contentful Paint\n fid?: number; // First Input Delay \n cls?: number; // Cumulative Layout Shift\n fcp?: number; // First Contentful Paint\n ttfb?: number; // Time to First Byte\n inp?: number; // Interaction to Next Paint\n\n // Custom metrics\n componentRenderTime: number;\n bundleLoadTime: number;\n mediaLoadTime: number;\n memoryUsage: number;\n \n // Performance scores\n performanceScore: number;\n timestamp: number;\n}\n\nexport interface PerformanceThresholds {\n lcp: { good: number; poor: number };\n fid: { good: number; poor: number };\n cls: { good: number; poor: number };\n renderTime: { good: number; poor: number };\n memoryUsage: { good: number; poor: number };\n}\n\nexport const defaultThresholds: PerformanceThresholds = {\n lcp: { good: 2500, poor: 4000 },\n fid: { good: 100, poor: 300 },\n cls: { good: 0.1, poor: 0.25 },\n renderTime: { good: 16, poor: 100 }, // Target 60fps = 16.67ms per frame\n memoryUsage: { good: 50 * 1024 * 1024, poor: 100 * 1024 * 1024 } // 50MB good, 100MB poor\n};\n\n// Performance monitoring class\nexport class PerformanceMonitor {\n private metrics: PerformanceMetrics[] = [];\n private listeners: Set<(metrics: PerformanceMetrics) => void> = new Set();\n private thresholds: PerformanceThresholds;\n private observer?: PerformanceObserver;\n private isMonitoring = false;\n\n constructor(thresholds: PerformanceThresholds = defaultThresholds) {\n this.thresholds = thresholds;\n this.initializeWebVitals();\n this.initializePerformanceObserver();\n }\n\n private async initializeWebVitals() {\n if (typeof window === 'undefined') return;\n \n try {\n // Try to import web-vitals dynamically and handle different versions\n const webVitals = await import('web-vitals').catch(() => null);\n \n if (!webVitals) {\n console.warn('web-vitals package not available, Core Web Vitals tracking disabled');\n return;\n }\n \n const reportHandler: ReportHandler = (metric) => {\n this.updateMetric(metric.name.toLowerCase() as keyof PerformanceMetrics, metric.value);\n };\n\n // Handle different web-vitals versions safely\n const vitalsAny = webVitals as any;\n if (vitalsAny.getCLS) vitalsAny.getCLS(reportHandler);\n if (vitalsAny.getFID) vitalsAny.getFID(reportHandler);\n if (vitalsAny.getFCP) vitalsAny.getFCP(reportHandler);\n if (vitalsAny.getLCP) vitalsAny.getLCP(reportHandler);\n if (vitalsAny.getTTFB) vitalsAny.getTTFB(reportHandler);\n if (vitalsAny.onINP) vitalsAny.onINP(reportHandler);\n } catch (error) {\n console.warn('Web Vitals initialization failed:', error);\n }\n }\n\n private initializePerformanceObserver() {\n if (typeof window === 'undefined' || !('PerformanceObserver' in window)) return;\n\n try {\n this.observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n this.handlePerformanceEntry(entry);\n }\n });\n\n this.observer.observe({ entryTypes: ['measure', 'navigation', 'resource', 'paint'] });\n } catch (error) {\n console.warn('PerformanceObserver not supported:', error);\n }\n }\n\n private handlePerformanceEntry(entry: PerformanceEntry) {\n switch (entry.entryType) {\n case 'measure':\n if (entry.name.startsWith('baroiplayer-render')) {\n this.updateMetric('componentRenderTime', entry.duration);\n }\n break;\n \n case 'resource':\n if (entry.name.includes('.js') || entry.name.includes('.css')) {\n this.updateMetric('bundleLoadTime', entry.duration);\n }\n break;\n \n case 'paint':\n if (entry.name === 'first-contentful-paint') {\n this.updateMetric('fcp', entry.startTime);\n }\n break;\n }\n }\n\n private updateMetric(key: keyof PerformanceMetrics, value: number) {\n const currentMetrics = this.getCurrentMetrics();\n const updatedMetrics = {\n ...currentMetrics,\n [key]: value,\n timestamp: Date.now(),\n performanceScore: this.calculatePerformanceScore({ ...currentMetrics, [key]: value })\n };\n\n this.metrics.push(updatedMetrics);\n \n // Keep only last 100 metrics\n if (this.metrics.length > 100) {\n this.metrics = this.metrics.slice(-100);\n }\n\n this.listeners.forEach(listener => listener(updatedMetrics));\n }\n\n private getCurrentMetrics(): PerformanceMetrics {\n const latest = this.metrics[this.metrics.length - 1];\n return latest || {\n componentRenderTime: 0,\n bundleLoadTime: 0,\n mediaLoadTime: 0,\n memoryUsage: this.getMemoryUsage(),\n performanceScore: 0,\n timestamp: Date.now()\n };\n }\n\n private getMemoryUsage(): number {\n if ('memory' in performance) {\n return (performance as any).memory.usedJSHeapSize || 0;\n }\n return 0;\n }\n\n private calculatePerformanceScore(metrics: PerformanceMetrics): number {\n let score = 100;\n \n // Penalize based on thresholds\n if (metrics.lcp && metrics.lcp > this.thresholds.lcp.good) {\n score -= metrics.lcp > this.thresholds.lcp.poor ? 30 : 15;\n }\n \n if (metrics.fid && metrics.fid > this.thresholds.fid.good) {\n score -= metrics.fid > this.thresholds.fid.poor ? 25 : 10;\n }\n \n if (metrics.cls && metrics.cls > this.thresholds.cls.good) {\n score -= metrics.cls > this.thresholds.cls.poor ? 20 : 10;\n }\n \n if (metrics.componentRenderTime > this.thresholds.renderTime.good) {\n score -= metrics.componentRenderTime > this.thresholds.renderTime.poor ? 20 : 10;\n }\n \n if (metrics.memoryUsage > this.thresholds.memoryUsage.good) {\n score -= metrics.memoryUsage > this.thresholds.memoryUsage.poor ? 15 : 5;\n }\n\n return Math.max(0, score);\n }\n\n // Public API\n public startMonitoring() {\n this.isMonitoring = true;\n this.startMemoryMonitoring();\n }\n\n public stopMonitoring() {\n this.isMonitoring = false;\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n\n private startMemoryMonitoring() {\n if (!this.isMonitoring) return;\n \n this.updateMetric('memoryUsage', this.getMemoryUsage());\n setTimeout(() => this.startMemoryMonitoring(), 5000); // Check every 5 seconds\n }\n\n public measureComponentRender(componentName: string, renderFn: () => any): any {\n const startMark = `baroiplayer-render-${componentName}-start`;\n const endMark = `baroiplayer-render-${componentName}-end`;\n const measureName = `baroiplayer-render-${componentName}`;\n\n performance.mark(startMark);\n const result = renderFn();\n performance.mark(endMark);\n \n try {\n performance.measure(measureName, startMark, endMark);\n } catch (error) {\n console.warn('Performance measurement failed:', error);\n }\n\n return result;\n }\n\n public subscribe(listener: (metrics: PerformanceMetrics) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n public getLatestMetrics(): PerformanceMetrics | null {\n return this.metrics[this.metrics.length - 1] || null;\n }\n\n public getAllMetrics(): PerformanceMetrics[] {\n return [...this.metrics];\n }\n\n public getAverageMetrics(count = 10): Partial<PerformanceMetrics> {\n const recentMetrics = this.metrics.slice(-count);\n if (recentMetrics.length === 0) return {};\n\n const averages: Partial<PerformanceMetrics> = {};\n const keys: Array<keyof PerformanceMetrics> = [\n 'lcp', 'fid', 'cls', 'fcp', 'ttfb', 'inp',\n 'componentRenderTime', 'bundleLoadTime', 'mediaLoadTime',\n 'memoryUsage', 'performanceScore'\n ];\n\n keys.forEach(key => {\n const values = recentMetrics\n .map(m => m[key] as number)\n .filter(v => typeof v === 'number' && !isNaN(v));\n \n if (values.length > 0) {\n (averages as any)[key] = values.reduce((sum, v) => sum + v, 0) / values.length;\n }\n });\n\n return averages;\n }\n\n public getThresholds(): PerformanceThresholds {\n return this.thresholds;\n }\n\n public updateThresholds(newThresholds: Partial<PerformanceThresholds>) {\n this.thresholds = { ...this.thresholds, ...newThresholds };\n }\n}\n\n// Global performance monitor instance\nexport const performanceMonitor = new PerformanceMonitor();\n\n// React hook for performance monitoring\nexport function usePerformanceMonitor() {\n const [metrics, setMetrics] = useState<PerformanceMetrics | null>(null);\n const [isSupported, setIsSupported] = useState(true);\n\n useEffect(() => {\n setIsSupported(typeof window !== 'undefined' && 'performance' in window);\n \n if (!isSupported) return;\n\n performanceMonitor.startMonitoring();\n const unsubscribe = performanceMonitor.subscribe(setMetrics);\n\n return () => {\n unsubscribe();\n performanceMonitor.stopMonitoring();\n };\n }, [isSupported]);\n\n const measureRender = useCallback(\n (componentName: string, renderFn: () => any): any => {\n return performanceMonitor.measureComponentRender(componentName, renderFn);\n },\n []\n );\n\n return {\n metrics,\n isSupported,\n measureRender,\n averageMetrics: performanceMonitor.getAverageMetrics(),\n allMetrics: performanceMonitor.getAllMetrics(),\n thresholds: performanceMonitor.getThresholds()\n };\n}\n\n// HOC for performance monitoring\nexport function withPerformanceMonitoring(\n WrappedComponent: React.ComponentType<any>,\n componentName?: string\n) {\n const displayName = componentName || WrappedComponent.displayName || WrappedComponent.name || 'Component';\n \n function PerformanceMonitoredComponent(props: any) {\n const renderRef = useRef(0);\n const { measureRender } = usePerformanceMonitor();\n\n return measureRender(`${displayName}-${renderRef.current++}`, () => (\n <WrappedComponent {...props} />\n ));\n }\n\n PerformanceMonitoredComponent.displayName = `withPerformanceMonitoring(${displayName})`;\n return PerformanceMonitoredComponent;\n}\n\n// Performance regression detector\nexport class PerformanceRegressionDetector {\n private baselineMetrics: PerformanceMetrics | null = null;\n private regressionThreshold = 0.2; // 20% degradation threshold\n\n setBaseline(metrics: PerformanceMetrics) {\n this.baselineMetrics = metrics;\n }\n\n detectRegression(currentMetrics: PerformanceMetrics): Array<{\n metric: keyof PerformanceMetrics;\n baseline: number;\n current: number;\n degradation: number;\n }> {\n if (!this.baselineMetrics) return [];\n\n const regressions: Array<{\n metric: keyof PerformanceMetrics;\n baseline: number;\n current: number;\n degradation: number;\n }> = [];\n\n const metricsToCheck: Array<keyof PerformanceMetrics> = [\n 'componentRenderTime', 'bundleLoadTime', 'mediaLoadTime', 'memoryUsage'\n ];\n\n metricsToCheck.forEach(metric => {\n const baseline = this.baselineMetrics![metric] as number;\n const current = currentMetrics[metric] as number;\n \n if (baseline && current && baseline > 0) {\n const degradation = (current - baseline) / baseline;\n if (degradation > this.regressionThreshold) {\n regressions.push({ metric, baseline, current, degradation });\n }\n }\n });\n\n return regressions;\n }\n\n setRegressionThreshold(threshold: number) {\n this.regressionThreshold = Math.max(0, Math.min(1, threshold));\n }\n}\n\n// Development dashboard component\nexport interface PerformanceDashboardProps {\n className?: string;\n showAdvanced?: boolean;\n}\n\nexport function PerformanceDashboard({ \n className = '', \n showAdvanced = false \n}: PerformanceDashboardProps) {\n const { metrics, averageMetrics, thresholds, isSupported } = usePerformanceMonitor();\n\n if (!isSupported || !metrics) {\n return (\n <div className={`performance-dashboard ${className}`}>\n <p>Performance monitoring not supported in this environment</p>\n </div>\n );\n }\n\n const getScoreColor = (score: number) => {\n if (score >= 90) return 'text-green-600';\n if (score >= 70) return 'text-yellow-600';\n return 'text-red-600';\n };\n\n const formatBytes = (bytes: number) => {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n };\n\n return (\n <div className={`performance-dashboard rounded-lg bg-white p-4 shadow ${className}`}>\n <h3 className=\"mb-4 font-semibold text-lg\">Performance Dashboard</h3>\n \n {/* Performance Score */}\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between\">\n <span>Performance Score</span>\n <span className={`font-bold ${getScoreColor(metrics.performanceScore)}`}>\n {metrics.performanceScore.toFixed(0)}\n </span>\n </div>\n <div className=\"mt-1 h-2 w-full rounded-full bg-gray-200\">\n <div \n className={`h-2 rounded-full transition-all duration-300 ${\n metrics.performanceScore >= 90 ? 'bg-green-500' :\n metrics.performanceScore >= 70 ? 'bg-yellow-500' : 'bg-red-500'\n }`}\n style={{ width: `${metrics.performanceScore}%` }}\n />\n </div>\n </div>\n\n {/* Core Web Vitals */}\n <div className=\"mb-4 grid grid-cols-2 gap-4\">\n <div>\n <h4 className=\"mb-2 font-medium\">Core Web Vitals</h4>\n <div className=\"space-y-1 text-sm\">\n {metrics.lcp && (\n <div>LCP: {metrics.lcp.toFixed(0)}ms</div>\n )}\n {metrics.fid && (\n <div>FID: {metrics.fid.toFixed(0)}ms</div>\n )}\n {metrics.cls && (\n <div>CLS: {metrics.cls.toFixed(3)}</div>\n )}\n </div>\n </div>\n \n <div>\n <h4 className=\"mb-2 font-medium\">Custom Metrics</h4>\n <div className=\"space-y-1 text-sm\">\n <div>Render: {metrics.componentRenderTime.toFixed(2)}ms</div>\n <div>Memory: {formatBytes(metrics.memoryUsage)}</div>\n {metrics.bundleLoadTime > 0 && (\n <div>Bundle: {metrics.bundleLoadTime.toFixed(0)}ms</div>\n )}\n </div>\n </div>\n </div>\n\n {/* Advanced metrics */}\n {showAdvanced && (\n <div>\n <h4 className=\"mb-2 font-medium\">Advanced Metrics</h4>\n <div className=\"space-y-1 text-sm\">\n <div>Average Render Time: {(averageMetrics.componentRenderTime || 0).toFixed(2)}ms</div>\n <div>Average Memory: {formatBytes(averageMetrics.memoryUsage || 0)}</div>\n <div>Average Score: {(averageMetrics.performanceScore || 0).toFixed(0)}</div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nexport default PerformanceMonitor;"],"names":["defaultThresholds","PerformanceMonitor","thresholds","__publicField","webVitals","reportHandler","metric","vitalsAny","error","list","entry","key","value","currentMetrics","updatedMetrics","listener","metrics","score","componentName","renderFn","startMark","endMark","measureName","result","count","recentMetrics","averages","values","m","v","sum","newThresholds","performanceMonitor","usePerformanceMonitor","setMetrics","useState","isSupported","setIsSupported","useEffect","unsubscribe","measureRender","useCallback","withPerformanceMonitoring","WrappedComponent","displayName","PerformanceMonitoredComponent","props","renderRef","useRef","jsx","PerformanceRegressionDetector","regressions","baseline","current","degradation","threshold","PerformanceDashboard","className","showAdvanced","averageMetrics","getScoreColor","formatBytes","bytes","jsxs"],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ let monaLoadingGif: string | undefined
|
|
|
11
11
|
import monaGifSrc from "../assets/mona-loading.gif"
|
|
12
12
|
|
|
13
13
|
try {
|
|
14
|
-
monaLoadingGif = monaGifSrc
|
|
14
|
+
monaLoadingGif = (monaGifSrc as unknown) as string
|
|
15
15
|
} catch {
|
|
16
16
|
// GIF import failed, will use fallback
|
|
17
17
|
monaLoadingGif = undefined
|
|
@@ -262,7 +262,7 @@ export const DebugPanel: React.FC<DebugPanelProps> = ({
|
|
|
262
262
|
)) || <div className="text-gray-400">None</div>}
|
|
263
263
|
</div>
|
|
264
264
|
</div>
|
|
265
|
-
{pluginInfo.loadedPlugins && pluginInfo.loadedPlugins.length > pluginInfo.activePlugins?.length && (
|
|
265
|
+
{pluginInfo.loadedPlugins && pluginInfo.loadedPlugins.length > (pluginInfo.activePlugins?.length ?? 0) && (
|
|
266
266
|
<div className="mt-2">
|
|
267
267
|
<span className="text-yellow-400">Loaded (inactive):</span>
|
|
268
268
|
<div className="ml-2 space-y-1 font-mono text-xs">
|
|
@@ -170,7 +170,7 @@ export const MediaPlayer = forwardRef<HTMLDivElement, MediaPlayerProps>(
|
|
|
170
170
|
x-webkit-airplay="allow"
|
|
171
171
|
style={{ willChange: 'transform' }}
|
|
172
172
|
>
|
|
173
|
-
{renderSources
|
|
173
|
+
{renderSources}
|
|
174
174
|
Your browser does not support the video element.
|
|
175
175
|
</video>
|
|
176
176
|
) : (
|
|
@@ -180,7 +180,7 @@ export const MediaPlayer = forwardRef<HTMLDivElement, MediaPlayerProps>(
|
|
|
180
180
|
// Performance optimizations
|
|
181
181
|
preload={preloadStrategy === "eager" ? "auto" : "metadata"}
|
|
182
182
|
>
|
|
183
|
-
{renderSources
|
|
183
|
+
{renderSources}
|
|
184
184
|
Your browser does not support the audio element.
|
|
185
185
|
</audio>
|
|
186
186
|
)}
|
|
@@ -34,7 +34,7 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
34
34
|
priority = 'auto',
|
|
35
35
|
strategy = 'adaptive',
|
|
36
36
|
}) => {
|
|
37
|
-
const networkInfoRef = useRef<
|
|
37
|
+
const networkInfoRef = useRef<any>(null);
|
|
38
38
|
const userBehaviorRef = useRef<UserBehaviorTracker | null>(null);
|
|
39
39
|
const preloadingHistoryRef = useRef<Map<string, number>>(new Map());
|
|
40
40
|
|
|
@@ -57,7 +57,7 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
// Preconnect to media domains
|
|
60
|
-
if (shouldPreconnect(source.type, strategy)) {
|
|
60
|
+
if (source.type && shouldPreconnect(source.type, strategy)) {
|
|
61
61
|
config.preconnect.push(domain);
|
|
62
62
|
}
|
|
63
63
|
|
|
@@ -65,7 +65,7 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
65
65
|
if (shouldPreload(source, priority, strategy)) {
|
|
66
66
|
config.preload.push({
|
|
67
67
|
url: source.src,
|
|
68
|
-
type: getPreloadType(source.type),
|
|
68
|
+
type: source.type ? getPreloadType(source.type) : 'auto',
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
71
|
|
|
@@ -130,10 +130,9 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
130
130
|
const crossOrigin = shouldUseCrossOrigin(url) ? 'anonymous' : undefined;
|
|
131
131
|
|
|
132
132
|
preload(url, {
|
|
133
|
-
as: type,
|
|
133
|
+
as: type as any,
|
|
134
134
|
crossOrigin,
|
|
135
135
|
integrity: getAssetIntegrity(url),
|
|
136
|
-
priority,
|
|
137
136
|
});
|
|
138
137
|
});
|
|
139
138
|
}, [preloadingConfig.preload, priority]);
|
|
@@ -144,7 +143,7 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
144
143
|
const crossOrigin = shouldUseCrossOrigin(url) ? 'anonymous' : undefined;
|
|
145
144
|
|
|
146
145
|
preinit(url, {
|
|
147
|
-
as: type,
|
|
146
|
+
as: type as any,
|
|
148
147
|
crossOrigin,
|
|
149
148
|
});
|
|
150
149
|
});
|
|
@@ -190,7 +189,7 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
190
189
|
|
|
191
190
|
// Strategy-based decision
|
|
192
191
|
if (strategy === 'conservative') {
|
|
193
|
-
return priority === 'high' && source.type
|
|
192
|
+
return priority === 'high' && (source.type?.includes('hls') ?? false);
|
|
194
193
|
}
|
|
195
194
|
|
|
196
195
|
if (strategy === 'aggressive') {
|
|
@@ -208,10 +207,10 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
208
207
|
|
|
209
208
|
if (saveData) return false;
|
|
210
209
|
if (effectiveType === 'slow-2g' || effectiveType === '2g') {
|
|
211
|
-
return priority === 'high' && source.type
|
|
210
|
+
return priority === 'high' && (source.type?.includes('hls') ?? false);
|
|
212
211
|
}
|
|
213
212
|
if (effectiveType === '3g') {
|
|
214
|
-
return ['hls', 'm3u8'].includes(source.type);
|
|
213
|
+
return ['hls', 'm3u8'].includes(source.type || '');
|
|
215
214
|
}
|
|
216
215
|
}
|
|
217
216
|
|
|
@@ -227,7 +226,7 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
227
226
|
}
|
|
228
227
|
|
|
229
228
|
function shouldPreinit(source: MediaSource, strategy: string): boolean {
|
|
230
|
-
return strategy === 'aggressive' && source.type
|
|
229
|
+
return strategy === 'aggressive' && (source.type?.includes('hls') ?? false);
|
|
231
230
|
}
|
|
232
231
|
|
|
233
232
|
function getPreloadType(mediaType: string): string {
|
|
@@ -275,7 +274,6 @@ export const MediaResourcePreloader: React.FC<MediaResourcePreloaderProps> = ({
|
|
|
275
274
|
preload(url, {
|
|
276
275
|
as: 'fetch',
|
|
277
276
|
crossOrigin: 'anonymous',
|
|
278
|
-
priority: 'high',
|
|
279
277
|
});
|
|
280
278
|
});
|
|
281
279
|
}
|
|
@@ -36,7 +36,7 @@ export const SeekBar = forwardRef<HTMLDivElement, SeekBarProps>(
|
|
|
36
36
|
}, [buffered, duration])
|
|
37
37
|
|
|
38
38
|
// Throttled seek handler with React 19 transitions
|
|
39
|
-
const seekTimeoutRef = useRef<NodeJS.Timeout>()
|
|
39
|
+
const seekTimeoutRef = useRef<NodeJS.Timeout | undefined>(undefined)
|
|
40
40
|
const lastSeekTime = useRef<number>(0)
|
|
41
41
|
|
|
42
42
|
const handleValueChange = ([value]: number[]) => {
|
|
@@ -34,10 +34,16 @@ export interface MediaPluginHooks {
|
|
|
34
34
|
export abstract class EnhancedMediaPlugin extends BasePlugin {
|
|
35
35
|
protected hooks: Partial<MediaPluginHooks> = {};
|
|
36
36
|
protected priority: number = 0;
|
|
37
|
-
|
|
37
|
+
public middleware?: PluginMiddleware;
|
|
38
38
|
|
|
39
39
|
constructor(name: string, config: any = {}) {
|
|
40
|
-
super(
|
|
40
|
+
super({
|
|
41
|
+
name,
|
|
42
|
+
version: config.version || '1.0.0',
|
|
43
|
+
description: config.description || '',
|
|
44
|
+
category: config.category || 'general',
|
|
45
|
+
priority: config.priority || 0
|
|
46
|
+
});
|
|
41
47
|
this.priority = config.priority || 0;
|
|
42
48
|
this.setupHooks();
|
|
43
49
|
}
|
|
@@ -119,7 +125,7 @@ export class EnhancedPluginRegistry {
|
|
|
119
125
|
* Register a plugin with the system
|
|
120
126
|
*/
|
|
121
127
|
public register(plugin: EnhancedMediaPlugin): void {
|
|
122
|
-
this.plugins.set(plugin.
|
|
128
|
+
this.plugins.set(plugin.metadata.name, plugin);
|
|
123
129
|
|
|
124
130
|
// Register plugin hooks
|
|
125
131
|
this.registerPluginHooks(plugin);
|
|
@@ -212,7 +218,7 @@ export class EnhancedPluginRegistry {
|
|
|
212
218
|
}
|
|
213
219
|
|
|
214
220
|
const middleware = this.middlewares[index++];
|
|
215
|
-
return Promise.resolve(middleware.execute(context, next));
|
|
221
|
+
return middleware ? Promise.resolve(middleware.execute(context, next)) : next();
|
|
216
222
|
};
|
|
217
223
|
|
|
218
224
|
return next();
|
|
@@ -231,8 +237,8 @@ export class EnhancedPluginRegistry {
|
|
|
231
237
|
}
|
|
232
238
|
|
|
233
239
|
this.hooks.get(hookType as keyof MediaPluginHooks)!.push({
|
|
234
|
-
plugin: plugin.
|
|
235
|
-
handler,
|
|
240
|
+
plugin: plugin.metadata.name,
|
|
241
|
+
handler: handler as Function,
|
|
236
242
|
});
|
|
237
243
|
}
|
|
238
244
|
});
|
|
@@ -249,7 +255,7 @@ export class EnhancedPluginRegistry {
|
|
|
249
255
|
if (handlers) {
|
|
250
256
|
this.hooks.set(
|
|
251
257
|
hookType as keyof MediaPluginHooks,
|
|
252
|
-
handlers.filter(h => h.plugin !== plugin.
|
|
258
|
+
handlers.filter(h => h.plugin !== plugin.metadata.name)
|
|
253
259
|
);
|
|
254
260
|
}
|
|
255
261
|
});
|
|
@@ -282,7 +288,7 @@ export class EnhancedPluginManager {
|
|
|
282
288
|
*/
|
|
283
289
|
public async setup(options: MediaPlayerConfig = {}): Promise<void> {
|
|
284
290
|
// Execute beforeSetup hooks
|
|
285
|
-
const setupResults = await this.registry.executeHook('beforeSetup', this.player.
|
|
291
|
+
const setupResults = await this.registry.executeHook('beforeSetup', this.player.element, options);
|
|
286
292
|
|
|
287
293
|
// Apply configuration modifications from hooks
|
|
288
294
|
const modifiedOptions = setupResults.reduce((acc, { result }) => {
|