UNPKG

elm327

Version:

Node.js/TypeScript library for ELM327 OBD2 adapters over USB, Bluetooth and WiFi

195 lines 5.84 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.OBD2Logger = exports.LogLevel = exports.LogFormat = void 0; const fs_1 = require("fs"); const path_1 = require("path"); var LogFormat; (function (LogFormat) { LogFormat["RAW"] = "raw"; LogFormat["PRETTY"] = "pretty"; LogFormat["JSON"] = "json"; })(LogFormat || (exports.LogFormat = LogFormat = {})); var LogLevel; (function (LogLevel) { LogLevel["INFO"] = "INFO"; LogLevel["DEBUG"] = "DEBUG"; LogLevel["WARN"] = "WARN"; LogLevel["ERROR"] = "ERROR"; LogLevel["RAW_DATA"] = "RAW_DATA"; LogLevel["COMMAND"] = "COMMAND"; LogLevel["RESPONSE"] = "RESPONSE"; })(LogLevel || (exports.LogLevel = LogLevel = {})); class OBD2Logger { enabled; filePath; format; levels; maxLines; stream = null; constructor(config) { this.enabled = config.enabled ?? false; this.filePath = config.filePath; this.format = config.format ?? LogFormat.PRETTY; this.levels = new Set(config.levels ?? Object.values(LogLevel)); this.maxLines = config.maxLines ?? 0; } enable() { if (!this.enabled) { this.enabled = true; this.ensureDirectory(); } } disable() { this.enabled = false; if (this.stream) { this.stream.end(); this.stream = null; } } isEnabled() { return this.enabled; } setFormat(format) { this.format = format; } setLevels(levels) { this.levels = new Set(levels); } setMaxLines(max) { this.maxLines = max; } isLevelEnabled(level) { return this.levels.has(level); } info(context, message, data) { this.log(LogLevel.INFO, context, message, data); } debug(context, message, data) { this.log(LogLevel.DEBUG, context, message, data); } warn(context, message, data) { this.log(LogLevel.WARN, context, message, data); } error(context, message, data) { this.log(LogLevel.ERROR, context, message, data); } logRawData(context, raw) { this.log(LogLevel.RAW_DATA, context, raw); } logCommand(context, command, data) { this.log(LogLevel.COMMAND, context, command, data); } logResponse(context, response, data) { this.log(LogLevel.RESPONSE, context, response, data); } log(level, context, message, data) { if (!this.enabled || !this.isLevelEnabled(level)) { return; } const entry = { timestamp: new Date(), level, context, message, data, }; const formatted = this.formatEntry(entry); this.writeToFile(formatted); } formatEntry(entry) { switch (this.format) { case LogFormat.RAW: return this.formatRaw(entry); case LogFormat.JSON: return this.formatJson(entry); case LogFormat.PRETTY: default: return this.formatPretty(entry); } } formatRaw(entry) { if (entry.level === LogLevel.RAW_DATA || entry.level === LogLevel.RESPONSE) { return entry.message; } return entry.message; } formatJson(entry) { const obj = { timestamp: entry.timestamp.toISOString(), level: entry.level, context: entry.context, message: entry.message, }; if (entry.data) { Object.assign(obj, entry.data); } return JSON.stringify(obj); } formatPretty(entry) { const date = entry.timestamp.toISOString().replace('T', ' ').substring(0, 19); const levelColor = this.getLevelTag(entry.level); const dataStr = entry.data ? ` ${JSON.stringify(entry.data)}` : ''; return `[${date}] ${levelColor} [${entry.context}] ${entry.message}${dataStr}`; } getLevelTag(level) { switch (level) { case LogLevel.INFO: return 'INFO'; case LogLevel.DEBUG: return 'DEBUG'; case LogLevel.WARN: return 'WARN'; case LogLevel.ERROR: return 'ERROR'; case LogLevel.RAW_DATA: return 'RAW'; case LogLevel.COMMAND: return 'CMD'; case LogLevel.RESPONSE: return 'RES'; default: return level; } } ensureDirectory() { const dir = (0, path_1.dirname)(this.filePath); if (!(0, fs_1.existsSync)(dir)) { (0, fs_1.mkdirSync)(dir, { recursive: true }); } } writeToFile(content) { try { (0, fs_1.appendFileSync)(this.filePath, content + '\n', 'utf8'); if (this.maxLines > 0) { this.trimExcessLines(); } } catch { // Silently fail if file cannot be written } } trimExcessLines() { try { const data = (0, fs_1.readFileSync)(this.filePath, 'utf8'); const lines = data.split('\n'); if (lines[lines.length - 1] === '') { lines.pop(); } if (lines.length > this.maxLines) { const trimmed = lines.slice(lines.length - this.maxLines); (0, fs_1.writeFileSync)(this.filePath, trimmed.join('\n') + '\n', 'utf8'); } } catch { // Silently fail if file cannot be read/written } } close() { if (this.stream) { this.stream.end(); this.stream = null; } } } exports.OBD2Logger = OBD2Logger; //# sourceMappingURL=logger.js.map