![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.ca/public_html/src/utils/ |
// Performance monitoring utilities
interface PerformanceMetrics {
renderTime: number;
webSocketConnections: number;
memoryUsage?: number;
activeTimers: number;
}
class PerformanceMonitor {
private static instance: PerformanceMonitor;
private metrics: PerformanceMetrics = {
renderTime: 0,
webSocketConnections: 0,
activeTimers: 0
};
private renderStartTime: number = 0;
static getInstance(): PerformanceMonitor {
if (!PerformanceMonitor.instance) {
PerformanceMonitor.instance = new PerformanceMonitor();
}
return PerformanceMonitor.instance;
}
startRenderTimer(): void {
this.renderStartTime = performance.now();
}
endRenderTimer(componentName?: string): void {
const renderTime = performance.now() - this.renderStartTime;
this.metrics.renderTime = renderTime;
if (renderTime > 16.67) { // More than one frame (60fps)
console.warn(`⚠️ Slow render detected in ${componentName || 'component'}: ${renderTime.toFixed(2)}ms`);
}
}
trackWebSocketConnection(): void {
this.metrics.webSocketConnections++;
console.log(`🔌 WebSocket connections: ${this.metrics.webSocketConnections}`);
}
trackWebSocketDisconnection(): void {
this.metrics.webSocketConnections = Math.max(0, this.metrics.webSocketConnections - 1);
console.log(`🔌 WebSocket connections: ${this.metrics.webSocketConnections}`);
}
trackActiveTimer(): void {
this.metrics.activeTimers++;
if (this.metrics.activeTimers > 10) {
console.warn(`⏰ High number of active timers: ${this.metrics.activeTimers}`);
}
}
trackTimerCleanup(): void {
this.metrics.activeTimers = Math.max(0, this.metrics.activeTimers - 1);
}
getMemoryUsage(): number | undefined {
if ('memory' in performance) {
return (performance as any).memory.usedJSHeapSize / 1024 / 1024; // MB
}
return undefined;
}
logPerformanceReport(): void {
const memory = this.getMemoryUsage();
console.group('📊 Performance Report');
console.log(`🎨 Last render time: ${this.metrics.renderTime.toFixed(2)}ms`);
console.log(`🔌 Active WebSocket connections: ${this.metrics.webSocketConnections}`);
console.log(`⏰ Active timers: ${this.metrics.activeTimers}`);
if (memory) {
console.log(`💾 Memory usage: ${memory.toFixed(2)}MB`);
}
console.groupEnd();
}
// Detect performance issues
detectIssues(): string[] {
const issues: string[] = [];
if (this.metrics.renderTime > 100) {
issues.push(`Extremely slow render: ${this.metrics.renderTime.toFixed(2)}ms`);
}
if (this.metrics.webSocketConnections > 3) {
issues.push(`Too many WebSocket connections: ${this.metrics.webSocketConnections}`);
}
if (this.metrics.activeTimers > 15) {
issues.push(`Too many active timers: ${this.metrics.activeTimers}`);
}
const memory = this.getMemoryUsage();
if (memory && memory > 100) {
issues.push(`High memory usage: ${memory.toFixed(2)}MB`);
}
return issues;
}
}
export const performanceMonitor = PerformanceMonitor.getInstance();
// React hook for component performance monitoring
export const usePerformanceMonitor = (componentName: string) => {
const startRender = () => performanceMonitor.startRenderTimer();
const endRender = () => performanceMonitor.endRenderTimer(componentName);
return { startRender, endRender };
};
// Automatic performance issue detection
if (typeof window !== 'undefined') {
setInterval(() => {
const issues = performanceMonitor.detectIssues();
if (issues.length > 0) {
console.warn('🚨 Performance issues detected:', issues);
}
}, 30000); // Check every 30 seconds
}