diff --git a/dental-client/client-monitor.js b/dental-client/client-monitor.js new file mode 100644 index 0000000..b3acfed --- /dev/null +++ b/dental-client/client-monitor.js @@ -0,0 +1,1323 @@ +const io = require('socket.io-client'); +const chokidar = require('chokidar'); +const fs = require('fs'); +const path = require('path'); +const readline = require('readline'); +const http = require('http'); +const { exec } = require('child_process'); + +// Carregar configuração dinamicamente para poder atualizá-la +const configPath = path.join(__dirname, 'config.json'); +let config = {}; +try { + config = JSON.parse(fs.readFileSync(configPath, 'utf8')); +} catch (e) { + config = { + serverUrl: "http://localhost:3000", + monitorPath: "C:\\ProgramData\\RF\\Dental Sensor\\Images", + clientName: "COMPUTADOR-LOCAL", + clientType: "windows", + apiKey: "rf-dental-secure-key-2026", + adminPassword: "admin" + }; +} + +// Variáveis de estado global +let socket; +let isConnected = false; +let isIdentified = false; +let watcher; +let isSyncing = false; +const recentLogs = []; + +// Instancia única global do banco local para evitar sobrecarga de I/O +let localDbInstance = null; +function getLocalDb() { + if (!localDbInstance) { + try { + const { DatabaseSync } = require('node:sqlite'); + const dbPath = path.join('C:', 'ProgramData', 'RF', 'Dental Sensor', 'data'); + if (fs.existsSync(dbPath)) { + localDbInstance = new DatabaseSync(dbPath); + } + } catch (e) { + console.error('Erro ao abrir banco local:', e.message); + } + } + return localDbInstance; +} + +// Cache local de uploads concluídos para evitar reenvio de arquivos no scan inicial +const uploadCachePath = path.join(__dirname, 'uploaded_cache.json'); +let uploadedCache = new Set(); +try { + if (fs.existsSync(uploadCachePath)) { + const cachedFiles = JSON.parse(fs.readFileSync(uploadCachePath, 'utf8')); + uploadedCache = new Set(cachedFiles); + console.log(`💾 Cache de uploads carregado com ${uploadedCache.size} arquivos.`); + } +} catch (e) { + console.error('Erro ao carregar cache de uploads:', e.message); +} + +function saveUploadCache() { + try { + fs.writeFileSync(uploadCachePath, JSON.stringify([...uploadedCache], null, 2)); + } catch (e) { + console.error('Erro ao salvar cache de uploads:', e.message); + } +} + +// Função auxiliar para registrar logs locais e expor no painel +function addLog(msg) { + const timestamp = new Date().toLocaleTimeString(); + const formatted = `[${timestamp}] ${msg}`; + console.log(formatted); + recentLogs.push(formatted); + if (recentLogs.length > 50) { + recentLogs.shift(); + } +} + +// Interface Web de Administração em HTML/CSS (zero dependências) +function getAdminHtml() { + return ` + +
+ + +Painel do Administrador
+