UNPKG

amazon-seller-mcp

Version:

Model Context Protocol (MCP) client for Amazon Selling Partner API

283 lines 7.71 kB
/** * Logging system for Amazon Seller MCP Client * * This file contains the logging system implementation, including: * - Configurable logging levels * - Sensitive data redaction * - Log formatting */ // Third-party dependencies import winston from 'winston'; /** * Log levels */ export var LogLevel; (function (LogLevel) { LogLevel["ERROR"] = "error"; LogLevel["WARN"] = "warn"; LogLevel["INFO"] = "info"; LogLevel["HTTP"] = "http"; LogLevel["DEBUG"] = "debug"; })(LogLevel || (LogLevel = {})); /** * Default redaction patterns for sensitive data */ const DEFAULT_REDACTION_PATTERNS = { // Authentication related accessToken: /(?<=accessToken["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi, refreshToken: /(?<=refreshToken["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi, clientSecret: /(?<=clientSecret["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi, secretAccessKey: /(?<=secretAccessKey["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi, // Credit card related creditCard: /\b(?:\d{4}[ -]?){3}\d{4}\b/g, // Personal information email: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g, phone: /\b(?:\+\d{1,2}\s?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}\b/g, // Amazon specific sellerAuthToken: /(?<=sellerAuthToken["']?\s*[:=]\s*["']?)[\w-.]+(?=["']?)/gi, }; /** * Redact sensitive data from log messages * * @param message Log message * @param patterns Redaction patterns * @returns Redacted message */ export function redactSensitiveData(message, patterns = DEFAULT_REDACTION_PATTERNS) { let redactedMessage = message; // Apply each redaction pattern Object.entries(patterns).forEach(([key, pattern]) => { redactedMessage = redactedMessage.replace(pattern, `[REDACTED_${key.toUpperCase()}]`); }); return redactedMessage; } /** * Create a Winston logger instance * * @param config Logger configuration * @returns Winston logger instance */ export function createLogger(config = {}) { const { level = LogLevel.INFO, console = true, filePath, redactSensitiveData: shouldRedact = true, redactionPatterns = DEFAULT_REDACTION_PATTERNS, formatter, } = config; // Create transports const transports = []; // Add console transport if enabled if (console) { transports.push(new winston.transports.Console({ format: winston.format.combine(winston.format.colorize(), winston.format.timestamp(), winston.format.printf(({ timestamp, level, message, ...meta }) => { // Redact sensitive data if enabled const finalMessage = shouldRedact ? redactSensitiveData(String(message), redactionPatterns) : message; // Format metadata const metaString = Object.keys(meta).length ? `\n${JSON.stringify(meta, null, 2)}` : ''; return `${timestamp} [${level}]: ${finalMessage}${metaString}`; })), })); } // Add file transport if file path is provided if (filePath) { transports.push(new winston.transports.File({ filename: filePath, format: winston.format.combine(winston.format.timestamp(), winston.format.json()), })); } // Create logger const logger = winston.createLogger({ level, levels: winston.config.npm.levels, format: formatter || winston.format.combine(winston.format.timestamp(), winston.format.json()), transports, }); return logger; } /** * Default logger instance */ let defaultLogger; /** * Configure the default logger * * @param config Logger configuration */ export function configureLogger(config) { defaultLogger = createLogger(config); } /** * Initialize default logger if not already initialized */ function ensureDefaultLogger() { if (!defaultLogger) { defaultLogger = createLogger(); } } /** * Get the default logger instance * * @returns Default logger instance */ export function getLogger() { ensureDefaultLogger(); return defaultLogger; } /** * Log an error message * * @param message Error message * @param meta Additional metadata */ export function error(message, meta = {}) { ensureDefaultLogger(); defaultLogger.error(message, meta); } /** * Log a warning message * * @param message Warning message * @param meta Additional metadata */ export function warn(message, meta = {}) { ensureDefaultLogger(); defaultLogger.warn(message, meta); } /** * Log an info message * * @param message Info message * @param meta Additional metadata */ export function info(message, meta = {}) { ensureDefaultLogger(); defaultLogger.info(message, meta); } /** * Log an HTTP message * * @param message HTTP message * @param meta Additional metadata */ export function http(message, meta = {}) { ensureDefaultLogger(); defaultLogger.http(message, meta); } /** * Log a debug message * * @param message Debug message * @param meta Additional metadata */ export function debug(message, meta = {}) { ensureDefaultLogger(); defaultLogger.debug(message, meta); } /** * Create a child logger with additional metadata * * @param meta Default metadata to include with all log messages * @returns Child logger */ export function createChildLogger(meta) { ensureDefaultLogger(); return defaultLogger.child(meta); } /** * Create a request logger middleware for HTTP requests * * @returns Request logger middleware */ export function createRequestLogger() { return (req, res, next) => { const start = Date.now(); // Log request http(`${req.method} ${req.url}`, { method: req.method, url: req.url, ip: req.ip, userAgent: Array.isArray(req.headers['user-agent']) ? req.headers['user-agent'][0] : req.headers['user-agent'], }); // Log response when finished res.on('finish', () => { const duration = Date.now() - start; http(`${req.method} ${req.url} ${res.statusCode} ${duration}ms`, { method: req.method, url: req.url, statusCode: res.statusCode, duration, }); }); next(); }; } /** * Logger class wrapper for easier instantiation and testing */ export class Logger { logger; /** * Create a new Logger instance * @param config Logger configuration */ constructor(config = {}) { this.logger = createLogger(config); } /** * Log an error message */ error(message, meta = {}) { this.logger.error(message, meta); } /** * Log a warning message */ warn(message, meta = {}) { this.logger.warn(message, meta); } /** * Log an info message */ info(message, meta = {}) { this.logger.info(message, meta); } /** * Log an HTTP message */ http(message, meta = {}) { this.logger.http(message, meta); } /** * Log a debug message */ debug(message, meta = {}) { this.logger.debug(message, meta); } /** * Create a child logger with additional metadata */ createChild(meta) { return this.logger.child(meta); } /** * Get the underlying winston logger */ getWinstonLogger() { return this.logger; } } export default { LogLevel, Logger, configureLogger, getLogger, createLogger, error, warn, info, http, debug, createChildLogger, createRequestLogger, redactSensitiveData, }; //# sourceMappingURL=logger.js.map