// DeviceInterface.mjs import { EventEmitter } from 'node:events'; /** * Contrato comĂșn que todos los drivers deben implementar. * Drivers de archivo (.txt) pueden dejar connect/fetchLogs/parseLogData como no-op. */ export class DeviceInterface extends EventEmitter { /** * @param {object} [opts] * @param {(docs:string[])=>Promise>} [opts.namesResolver] * @param {'crossDay'|'sameDay'} [opts.intervalBuilder] * @param {{ parseLine:(line:string)=>object|null }} [opts.parserStrategy] */ constructor(opts = {}) { super(); this.namesResolver = typeof opts.namesResolver === 'function' ? opts.namesResolver : async () => ({}); this.intervalBuilder = opts.intervalBuilder || 'crossDay'; this.parserStrategy = opts.parserStrategy || null; } // ------- API esperada (drivers file) ------- /** * Procesa el contenido completo de un .txt y devuelve: * { parsedRows, pairs, payloadDB, missing_docs, error? } */ async processFile(/* text:string */) { throw new Error('processFile not implemented'); } /** * Retorna CSV como string (no descarga). */ exportCSV(/* pairs?:object[] */) { throw new Error('exportCSV not implemented'); } // ------- API opcional (drivers TCP/IP) ---- async connect() { /* no-op */ } async disconnect() { /* no-op */ } async fetchLogs() { throw new Error('fetchLogs not implemented'); } async parseLogData(/* raw */) { throw new Error('parseLogData not implemented'); } // ------- Utilidad: emitir estado ------- setStatus(text) { this.emit('status', text || ''); } }