| export interface DebugWarning { |
| id: string; |
| message: string; |
| timestamp: string; |
| code: string; |
| } |
|
|
| export interface DebugError { |
| id: string; |
| message: string; |
| timestamp: string; |
| stack?: string; |
| } |
|
|
| export interface DebugStatus { |
| warnings: DebugIssue[]; |
| errors: DebugIssue[]; |
| } |
|
|
| export interface DebugIssue { |
| id: string; |
| message: string; |
| type: 'warning' | 'error'; |
| timestamp: string; |
| details?: Record<string, unknown>; |
| } |
|
|
| |
| const acknowledgedIssues = new Set<string>(); |
|
|
| export const getDebugStatus = async (): Promise<DebugStatus> => { |
| const issues: DebugStatus = { |
| warnings: [], |
| errors: [], |
| }; |
|
|
| try { |
| |
| if (performance && 'memory' in performance) { |
| const memory = (performance as any).memory; |
|
|
| if (memory.usedJSHeapSize > memory.jsHeapSizeLimit * 0.8) { |
| issues.warnings.push({ |
| id: 'high-memory-usage', |
| message: 'High memory usage detected', |
| type: 'warning', |
| timestamp: new Date().toISOString(), |
| details: { |
| used: memory.usedJSHeapSize, |
| total: memory.jsHeapSizeLimit, |
| }, |
| }); |
| } |
| } |
|
|
| |
| if (navigator.storage && navigator.storage.estimate) { |
| const estimate = await navigator.storage.estimate(); |
| const usageRatio = (estimate.usage || 0) / (estimate.quota || 1); |
|
|
| if (usageRatio > 0.9) { |
| issues.warnings.push({ |
| id: 'storage-quota-warning', |
| message: 'Storage quota nearly reached', |
| type: 'warning', |
| timestamp: new Date().toISOString(), |
| details: { |
| used: estimate.usage, |
| quota: estimate.quota, |
| }, |
| }); |
| } |
| } |
|
|
| |
| const errorLogs = localStorage.getItem('error_logs'); |
|
|
| if (errorLogs) { |
| const errors = JSON.parse(errorLogs); |
| errors.forEach((error: any) => { |
| issues.errors.push({ |
| id: `error-${error.timestamp}`, |
| message: error.message, |
| type: 'error', |
| timestamp: error.timestamp, |
| details: error.details, |
| }); |
| }); |
| } |
|
|
| |
| issues.warnings = issues.warnings.filter((warning) => !acknowledgedIssues.has(warning.id)); |
| issues.errors = issues.errors.filter((error) => !acknowledgedIssues.has(error.id)); |
|
|
| return issues; |
| } catch (error) { |
| console.error('Error getting debug status:', error); |
| return issues; |
| } |
| }; |
|
|
| export const acknowledgeWarning = async (id: string): Promise<void> => { |
| acknowledgedIssues.add(id); |
| }; |
|
|
| export const acknowledgeError = async (id: string): Promise<void> => { |
| acknowledgedIssues.add(id); |
|
|
| |
| try { |
| const errorLogs = localStorage.getItem('error_logs'); |
|
|
| if (errorLogs) { |
| const errors = JSON.parse(errorLogs); |
| const updatedErrors = errors.filter((error: any) => `error-${error.timestamp}` !== id); |
| localStorage.setItem('error_logs', JSON.stringify(updatedErrors)); |
| } |
| } catch (error) { |
| console.error('Error acknowledging error:', error); |
| } |
| }; |
|
|