UNPKG

lib-comfoair

Version:

Library to communicate with Zehnder ComfoAirQ ventilation unit through the ComfoControl gateway

180 lines (179 loc) 5.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FilePrinter = exports.DebugPrinter = exports.ConsolePrinter = exports.BasePrinter = void 0; const fs = require("fs"); /** * Abstract base class for log printers. * Provides common functionality for formatting log messages. */ class BasePrinter { /** * Print a log message. * @param level - The severity level of the log message. * @param name - The name of the logger. * @param message - The log message. * @param args - Additional arguments to log. */ printLine(level, name, message, ...args) { const formattedMessage = this.formatMessage(message, ...args); this.output(level, name, formattedMessage); } /** * Format a log message. * @param level - The severity level of the log message. * @param name - The name of the logger. * @param message - The log message. * @param args - Additional arguments to log. * @returns The formatted log message. */ formatMessage(message, ...args) { const evaluatedArgs = args.map((arg) => { if (typeof arg === 'function') { arg = arg(); } if (typeof arg === 'object' && arg !== null) { try { return JSON.stringify(arg); } catch { // Ignore parse errors, print original object } } return String(arg); }); return `${message} ${evaluatedArgs.join(' ')}`; } } exports.BasePrinter = BasePrinter; /** * Console printer for logging messages to the console. */ class ConsolePrinter extends BasePrinter { /** * Output a formatted log message to the console. * @param level - The severity level of the log message. * @param name - The name of the logger. * @param message - The formatted log message. */ output(level, name, message) { const timestamp = `[${new Date().toISOString()}] `; console.log(`${timestamp}[${level}] [${name}] ${message}`); } } exports.ConsolePrinter = ConsolePrinter; /** * Prints all logging messages using the console.debug function. */ class DebugPrinter extends BasePrinter { /** * Output a formatted log message to the console. * @param level - The severity level of the log message. * @param name - The name of the logger. * @param message - The formatted log message. */ output(level, name, message) { const timestamp = `[${new Date().toISOString()}] `; console.debug(`${timestamp}[${level}] [${name}] ${message}`); } } exports.DebugPrinter = DebugPrinter; /** * File printer for logging messages to a file. */ class FilePrinter extends BasePrinter { logFilePath; writeQueue = Promise.resolve(); fileHandle; closeTimeout; constructor(logFilePath) { super(); this.logFilePath = logFilePath; } /** * Ensure the log file directory exists. */ async ensureLogFileDirectory() { await fs.promises.mkdir(this.logFilePath.substring(0, this.logFilePath.lastIndexOf('/')), { recursive: true }); } /** * Initialize the file handle for the log file. */ async getFileHandle() { if (!this.fileHandle) { try { await this.ensureLogFileDirectory(); const fileExists = await fs.promises .access(this.logFilePath) .then(() => true) .catch(() => false); this.fileHandle = await fs.promises.open(this.logFilePath, 'a'); if (!fileExists) { const header = this.createLogEntry('INFO', 'FilePrinter', '--- Logging session started ---'); await this.fileHandle.appendFile(header); } this.scheduleClose(); } catch (err) { console.error('Failed to open log file:', err); } } return this.fileHandle; } /** * Create a log entry string. * @param level - The severity level of the log message. * @param name - The name of the logger. * @param message - The log message. * @returns The formatted log entry string. */ createLogEntry(level, name, message) { const logEntry = { timestamp: Math.floor(Date.now() / 1000), level: level, name: name, message: message, }; return JSON.stringify(logEntry) + '\n'; } /** * Close the file handle after a delay. */ scheduleClose() { if (this.closeTimeout) { clearTimeout(this.closeTimeout); } this.closeTimeout = setTimeout(async () => { if (this.fileHandle) { try { await this.fileHandle.close(); this.fileHandle = undefined; } catch (err) { console.error('Failed to close log file:', err); } } }, 5000); } /** * Output a formatted log message to a file asynchronously. * @param level - The severity level of the log message. * @param name - The name of the logger. * @param message - The formatted log message. */ output(level, name, message) { const logMessage = this.createLogEntry(level, name, message); this.writeQueue = this.writeQueue.then(async () => { const handle = await this.getFileHandle(); if (handle) { try { await handle.appendFile(logMessage); this.scheduleClose(); } catch (err) { console.error('Failed to write log message:', err); } } }); } } exports.FilePrinter = FilePrinter;