elm327
Version:
Node.js/TypeScript library for ELM327 OBD2 adapters over USB, Bluetooth and WiFi
195 lines • 5.84 kB
JavaScript
"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