@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.
Files changed (73) hide show
  1. package/dist/context/media.js +2 -0
  2. package/dist/context/media.js.map +1 -0
  3. package/dist/context/media.mjs +15 -0
  4. package/dist/context/media.mjs.map +1 -0
  5. package/dist/context/store.js +2 -0
  6. package/dist/context/store.js.map +1 -0
  7. package/dist/context/store.mjs +5 -0
  8. package/dist/context/store.mjs.map +1 -0
  9. package/dist/context-Af84FynT.js +1179 -0
  10. package/dist/context-Af84FynT.js.map +1 -0
  11. package/dist/context-CwZnPdz0.cjs +23 -0
  12. package/dist/context-CwZnPdz0.cjs.map +1 -0
  13. package/dist/core-events-B5W_j8yU.js +480 -0
  14. package/dist/core-events-B5W_j8yU.js.map +1 -0
  15. package/dist/core-events-CN0-Vhhq.cjs +2 -0
  16. package/dist/core-events-CN0-Vhhq.cjs.map +1 -0
  17. package/dist/core-plugins-Bq9KLany.js +696 -0
  18. package/dist/core-plugins-Bq9KLany.js.map +1 -0
  19. package/dist/core-plugins-CPDSHMiQ.cjs +2 -0
  20. package/dist/core-plugins-CPDSHMiQ.cjs.map +1 -0
  21. package/dist/core.js +37 -0
  22. package/dist/core.js.map +1 -0
  23. package/dist/core.mjs +1217 -0
  24. package/dist/core.mjs.map +1 -0
  25. package/dist/enhanced-components-CXnYiOt6.cjs +2 -0
  26. package/dist/enhanced-components-CXnYiOt6.cjs.map +1 -0
  27. package/dist/enhanced-components-Da0TSvKe.js +1073 -0
  28. package/dist/enhanced-components-Da0TSvKe.js.map +1 -0
  29. package/dist/hooks-BhW_i-9L.js +2013 -0
  30. package/dist/hooks-BhW_i-9L.js.map +1 -0
  31. package/dist/hooks-DTXeB5Z-.cjs +4 -0
  32. package/dist/hooks-DTXeB5Z-.cjs.map +1 -0
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js.map +1 -0
  35. package/dist/index.mjs.map +1 -0
  36. package/dist/minimal-components-B0bILe18.js +2002 -0
  37. package/dist/minimal-components-B0bILe18.js.map +1 -0
  38. package/dist/minimal-components-BsqodtY8.cjs +2 -0
  39. package/dist/minimal-components-BsqodtY8.cjs.map +1 -0
  40. package/dist/minimal-components.css +589 -0
  41. package/dist/mona-loading.gif +0 -0
  42. package/dist/performance-monitor--rzKTlbj.js +302 -0
  43. package/dist/performance-monitor--rzKTlbj.js.map +1 -0
  44. package/dist/performance-monitor-cjIvZE2D.cjs +2 -0
  45. package/dist/performance-monitor-cjIvZE2D.cjs.map +1 -0
  46. package/dist/src/components/AnimateLoading.tsx +1 -1
  47. package/dist/src/components/enhanced/debug-panel.tsx +1 -1
  48. package/dist/src/components/media-player.tsx +2 -2
  49. package/dist/src/components/ui/media-resource-preloader.tsx +9 -11
  50. package/dist/src/components/ui/seek-bar.tsx +1 -1
  51. package/dist/src/core/plugins/enhanced-plugin-system.ts +14 -8
  52. package/dist/src/core/providers/enhanced-hls-provider.ts +22 -53
  53. package/dist/src/hooks/use-enhanced-media-player.ts +19 -2
  54. package/dist/src/types/index.ts +40 -5
  55. package/dist/styles/minimal-player.css +589 -0
  56. package/dist/utils-Db13763z.cjs +9 -0
  57. package/dist/utils-Db13763z.cjs.map +1 -0
  58. package/dist/utils-nTO4AnHo.js +2809 -0
  59. package/dist/utils-nTO4AnHo.js.map +1 -0
  60. package/dist/utils.js +2 -0
  61. package/dist/utils.js.map +1 -0
  62. package/dist/utils.mjs +7 -0
  63. package/dist/utils.mjs.map +1 -0
  64. package/package.json +1 -1
  65. package/src/components/AnimateLoading.tsx +1 -1
  66. package/src/components/enhanced/debug-panel.tsx +1 -1
  67. package/src/components/media-player.tsx +2 -2
  68. package/src/components/ui/media-resource-preloader.tsx +9 -11
  69. package/src/components/ui/seek-bar.tsx +1 -1
  70. package/src/core/plugins/enhanced-plugin-system.ts +14 -8
  71. package/src/core/providers/enhanced-hls-provider.ts +22 -53
  72. package/src/hooks/use-enhanced-media-player.ts +19 -2
  73. 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":"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"}
@@ -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<NetworkInformation | null>(null);
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 === 'hls';
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 === 'hls';
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 === 'hls';
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
- protected middleware?: PluginMiddleware;
37
+ public middleware?: PluginMiddleware;
38
38
 
39
39
  constructor(name: string, config: any = {}) {
40
- super(name, config);
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.getName(), 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.getName(),
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.getName())
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.getElement(), options);
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 }) => {