UNPKG

@azure/msal-common

Version:
279 lines (277 loc) 8.85 kB
/*! @azure/msal-common v16.6.2 2026-05-19 */ 'use strict'; /* * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ /** * Log message level. */ var LogLevel; (function (LogLevel) { LogLevel[LogLevel["Error"] = 0] = "Error"; LogLevel[LogLevel["Warning"] = 1] = "Warning"; LogLevel[LogLevel["Info"] = 2] = "Info"; LogLevel[LogLevel["Verbose"] = 3] = "Verbose"; LogLevel[LogLevel["Trace"] = 4] = "Trace"; })(LogLevel || (LogLevel = {})); // Shared cache state for better minification - using Map's insertion order for LRU const CACHE_CAPACITY = 50; const MAX_LOGS_PER_CORRELATION = 500; const correlationCache = new Map(); /** * Mark correlation ID as recently used by moving it to end of Map * @param correlationId * @param {CorrelationLogData} data */ function markAsRecentlyUsed(correlationId, data) { correlationCache.delete(correlationId); correlationCache.set(correlationId, data); } /** * Add log message to cache for specific correlation ID * @param correlationId * @param {LoggedMessage} loggedMessage */ function addLogToCache(correlationId, loggedMessage) { const currentTime = Date.now(); let data = correlationCache.get(correlationId); if (data) { // Mark as recently used markAsRecentlyUsed(correlationId, data); } else { // Create new entry data = { logs: [], firstEventTime: currentTime }; correlationCache.set(correlationId, data); // Remove LRU (first entry) if capacity exceeded if (correlationCache.size > CACHE_CAPACITY) { const firstKey = correlationCache.keys().next().value; if (firstKey) { correlationCache.delete(firstKey); } } } // Add log to the data, maintaining max logs per correlation data.logs.push({ ...loggedMessage, milliseconds: currentTime - data.firstEventTime, }); if (data.logs.length > MAX_LOGS_PER_CORRELATION) { data.logs.shift(); // Remove oldest log } } /** * Get logs for correlation ID and flush them from cache * Attaches logs with empty correlation id to the requested correlation logs * @param correlationId */ function getAndFlushLogsFromCache(correlationId) { const res = []; for (const id of ["", correlationId]) { const data = correlationCache.get(id); res.push(...(data?.logs ?? [])); correlationCache.delete(id); // Remove the correlation ID completely from cache } return res; } /** * Checks if a string is already a hashed logging string (6 alphanumeric characters) */ function isHashedString(str) { if (str.length !== 6) { return false; } for (let i = 0; i < str.length; i++) { const char = str[i]; const isAlphaNumeric = (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") || (char >= "0" && char <= "9"); if (!isAlphaNumeric) { return false; } } return true; } /** * Class which facilitates logging of messages to a specific place. */ class Logger { constructor(loggerOptions, packageName, packageVersion) { // Current log level, defaults to info. this.level = LogLevel.Info; const defaultLoggerCallback = () => { return; }; const setLoggerOptions = loggerOptions || Logger.createDefaultLoggerOptions(); this.localCallback = setLoggerOptions.loggerCallback || defaultLoggerCallback; this.piiLoggingEnabled = setLoggerOptions.piiLoggingEnabled || false; this.level = typeof setLoggerOptions.logLevel === "number" ? setLoggerOptions.logLevel : LogLevel.Info; this.packageName = packageName || ""; this.packageVersion = packageVersion || ""; } static createDefaultLoggerOptions() { return { loggerCallback: () => { // allow users to not set loggerCallback }, piiLoggingEnabled: false, logLevel: LogLevel.Info, }; } /** * Create new Logger with existing configurations. */ clone(packageName, packageVersion) { return new Logger({ loggerCallback: this.localCallback, piiLoggingEnabled: this.piiLoggingEnabled, logLevel: this.level, }, packageName, packageVersion); } /** * Log message with required options. */ logMessage(logMessage, options) { const correlationId = options.correlationId; const isHashedInput = isHashedString(logMessage); if (isHashedInput) { const loggedMessage = { hash: logMessage, level: options.logLevel, containsPii: options.containsPii || false, milliseconds: 0, // Will be calculated in addLogToCache }; addLogToCache(correlationId, loggedMessage); } if (options.logLevel > this.level || (!this.piiLoggingEnabled && options.containsPii)) { return; } const timestamp = new Date().toUTCString(); // Add correlationId to logs if set, correlationId provided on log messages take precedence const logHeader = `[${timestamp}] : [${correlationId}]`; const log = `${logHeader} : ${this.packageName}@${this.packageVersion} : ${LogLevel[options.logLevel]} - ${logMessage}`; this.executeCallback(options.logLevel, log, options.containsPii || false); } /** * Execute callback with message. */ executeCallback(level, message, containsPii) { if (this.localCallback) { this.localCallback(level, message, containsPii); } } /** * Logs error messages. */ error(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Error, containsPii: false, correlationId: correlationId, }); } /** * Logs error messages with PII. */ errorPii(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Error, containsPii: true, correlationId: correlationId, }); } /** * Logs warning messages. */ warning(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Warning, containsPii: false, correlationId: correlationId, }); } /** * Logs warning messages with PII. */ warningPii(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Warning, containsPii: true, correlationId: correlationId, }); } /** * Logs info messages. */ info(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Info, containsPii: false, correlationId: correlationId, }); } /** * Logs info messages with PII. */ infoPii(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Info, containsPii: true, correlationId: correlationId, }); } /** * Logs verbose messages. */ verbose(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Verbose, containsPii: false, correlationId: correlationId, }); } /** * Logs verbose messages with PII. */ verbosePii(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Verbose, containsPii: true, correlationId: correlationId, }); } /** * Logs trace messages. */ trace(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Trace, containsPii: false, correlationId: correlationId, }); } /** * Logs trace messages with PII. */ tracePii(message, correlationId) { this.logMessage(message, { logLevel: LogLevel.Trace, containsPii: true, correlationId: correlationId, }); } /** * Returns whether PII Logging is enabled or not. */ isPiiLoggingEnabled() { return this.piiLoggingEnabled || false; } } export { LogLevel, Logger, getAndFlushLogsFromCache }; //# sourceMappingURL=Logger.mjs.map