34 lines
7.4 KiB
JavaScript
34 lines
7.4 KiB
JavaScript
class PrinterMonitor{constructor(){this.refreshInterval=30000;this.fastRefreshInterval=5000;this.currentInterval=null;this.printers=new Map();this.callbacks=new Set();this.isActive=false;this.useCache=true;this.lastUpdate=null;this.errorCount=0;this.maxErrors=3;this.statusCategories={'online':{label:'Online',color:'success',icon:'🟢'},'offline':{label:'Offline',color:'danger',icon:'🔴'},'standby':{label:'Standby',color:'warning',icon:'🟡'},'unreachable':{label:'Nicht erreichbar',color:'secondary',icon:'⚫'},'unconfigured':{label:'Nicht konfiguriert',color:'info',icon:'🔵'}};console.log('🖨️ PrinterMonitor initialisiert');}
|
|
start(){if(this.isActive){console.log('⚠️ PrinterMonitor läuft bereits');return;}
|
|
this.isActive=true;this.errorCount=0;console.log('🚀 Starte PrinterMonitor');this.updatePrinterStatus();this.startInterval();document.addEventListener('visibilitychange',this.handleVisibilityChange.bind(this));}
|
|
stop(){if(!this.isActive){return;}
|
|
this.isActive=false;if(this.currentInterval){clearInterval(this.currentInterval);this.currentInterval=null;}
|
|
document.removeEventListener('visibilitychange',this.handleVisibilityChange.bind(this));console.log('⏹️ PrinterMonitor gestoppt');}
|
|
startInterval(){if(this.currentInterval){clearInterval(this.currentInterval);}
|
|
this.currentInterval=setInterval(()=>{this.updatePrinterStatus();},this.refreshInterval);}
|
|
handleVisibilityChange(){if(document.hidden){this.refreshInterval=60000;}else{this.refreshInterval=30000;this.updatePrinterStatus();}
|
|
if(this.isActive){this.startInterval();}}
|
|
async updatePrinterStatus(){if(!this.isActive){return;}
|
|
try{const response=await fetch(`/api/printers/monitor/live-status?use_cache=${this.useCache}`,{method:'GET',headers:{'Content-Type':'application/json','X-Requested-With':'XMLHttpRequest'}});if(!response.ok){throw new Error(`HTTP ${response.status}:${response.statusText}`);}
|
|
const data=await response.json();if(data.success){this.processPrinterData(data);this.errorCount=0;}else{throw new Error(data.error||'Unbekannter Fehler');}}catch(error){this.errorCount++;console.error('❌ Fehler beim Abrufen des Drucker-Status:',error);if(this.errorCount>=this.maxErrors){this.refreshInterval=Math.min(this.refreshInterval*2,300000);this.startInterval();this.notifyCallbacks({type:'error',message:`Drucker-Status nicht verfügbar(${this.errorCount}Fehler)`,timestamp:new Date().toISOString()});}}}
|
|
processPrinterData(data){const previousPrinters=new Map(this.printers);this.printers.clear();let printersData=null;if(data&&data.printers&&typeof data.printers==='object'){printersData=data.printers;}else if(data&&data.status&&typeof data.status==='object'){printersData=data.status;}else if(data&&typeof data==='object'&&!data.success&&!data.error){printersData=data;}
|
|
if(printersData&&typeof printersData==='object'){Object.values(printersData).forEach(printer=>{if(printer&&typeof printer==='object'&&printer.id){this.printers.set(printer.id,{...printer,statusInfo:this.statusCategories[printer.status]||this.statusCategories['offline']});}else{console.warn('⚠️ Ungültiges Drucker-Objekt übersprungen:',printer);}});console.log(`✅ ${this.printers.size}Drucker erfolgreich verarbeitet`);}else{console.warn('⚠️ Keine gültigen Drucker-Daten in Response-Struktur gefunden');console.debug('Response-Struktur:',data);this.notifyCallbacks({type:'warning',message:'Keine Drucker-Daten verfügbar',data:data});return;}
|
|
this.lastUpdate=new Date(data.timestamp||Date.now());const changes=this.detectChanges(previousPrinters,this.printers);this.notifyCallbacks({type:'update',printers:this.printers,summary:data.summary,changes:changes,timestamp:this.lastUpdate,cacheUsed:data.cache_used});console.log(`🔄 Drucker-Status aktualisiert:${this.printers.size}Drucker`);}
|
|
detectChanges(oldPrinters,newPrinters){const changes=[];newPrinters.forEach((newPrinter,id)=>{const oldPrinter=oldPrinters.get(id);if(!oldPrinter){changes.push({type:'added',printer:newPrinter});}else if(oldPrinter.status!==newPrinter.status){changes.push({type:'status_change',printer:newPrinter,oldStatus:oldPrinter.status,newStatus:newPrinter.status});}});oldPrinters.forEach((oldPrinter,id)=>{if(!newPrinters.has(id)){changes.push({type:'removed',printer:oldPrinter});}});return changes;}
|
|
notifyCallbacks(data){this.callbacks.forEach(callback=>{try{callback(data);}catch(error){console.error('❌ Fehler in PrinterMonitor Callback:',error);}});}
|
|
onUpdate(callback){if(typeof callback==='function'){this.callbacks.add(callback);}}
|
|
offUpdate(callback){this.callbacks.delete(callback);}
|
|
async forceUpdate(){const oldUseCache=this.useCache;this.useCache=false;try{await this.updatePrinterStatus();}finally{this.useCache=oldUseCache;}}
|
|
async clearCache(){try{const response=await fetch('/api/printers/monitor/clear-cache',{method:'POST',headers:{'Content-Type':'application/json','X-Requested-With':'XMLHttpRequest'}});if(response.ok){console.log('🧹 Drucker-Cache geleert');await this.forceUpdate();}else{throw new Error(`HTTP ${response.status}`);}}catch(error){console.error('❌ Fehler beim Leeren des Caches:',error);}}
|
|
async getSummary(){try{const response=await fetch('/api/printers/monitor/summary',{method:'GET',headers:{'Content-Type':'application/json','X-Requested-With':'XMLHttpRequest'}});if(response.ok){const data=await response.json();return data.success?data.summary:null;}}catch(error){console.error('❌ Fehler beim Abrufen der Zusammenfassung:',error);}
|
|
return null;}
|
|
getPrinter(id){return this.printers.get(id);}
|
|
getAllPrinters(){return Array.from(this.printers.values());}
|
|
getPrintersByStatus(status){return this.getAllPrinters().filter(printer=>printer.status===status);}
|
|
getStatusSummary(){const summary={total:this.printers.size,online:0,offline:0,printing:0,standby:0,unreachable:0,unconfigured:0,error:0};this.printers.forEach(printer=>{const status=printer.status;if(summary.hasOwnProperty(status)){summary[status]++;}else{summary.offline++;}});return summary;}
|
|
enableFastUpdates(){this.refreshInterval=this.fastRefreshInterval;if(this.isActive){this.startInterval();}
|
|
console.log('⚡ Schnelle Updates aktiviert');}
|
|
disableFastUpdates(){this.refreshInterval=30000;if(this.isActive){this.startInterval();}
|
|
console.log('🐌 Normale Updates aktiviert');}
|
|
async initializeAllOutlets(){try{const response=await fetch('/api/printers/monitor/initialize-outlets',{method:'POST',headers:{'Content-Type':'application/json','X-Requested-With':'XMLHttpRequest'}});if(response.ok){const data=await response.json();if(data.success){console.log('🔌 Steckdosen-Initialisierung erfolgreich:',data.statistics);this.notifyCallbacks({type:'initialization',results:data.results,statistics:data.statistics,message:data.message});await this.forceUpdate();return data;}else{throw new Error(data.error||'Initialisierung fehlgeschlagen');}}else{throw new Error(`HTTP ${response.status}`);}}catch(error){console.error('❌ Fehler bei Steckdosen-Initialisierung:',error);throw error;}}}
|
|
window.printerMonitor=new PrinterMonitor();document.addEventListener('DOMContentLoaded',()=>{const relevantPages=['/printers','/dashboard','/admin','/admin-dashboard'];const currentPath=window.location.pathname;if(relevantPages.some(page=>currentPath.includes(page))){console.log('🖨️ Auto-Start PrinterMonitor für Seite:',currentPath);window.printerMonitor.start();}});window.addEventListener('beforeunload',()=>{if(window.printerMonitor){window.printerMonitor.stop();}});if(typeof module!=='undefined'&&module.exports){module.exports=PrinterMonitor;} |