@rawnodes/logger 2.8.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store.ts","../src/types.ts","../src/transports/buffer.ts","../src/transports/base-http.ts","../src/transports/discord.ts","../src/transports/telegram.ts","../src/transports/zoho-cliq.ts","../src/transports/cloudwatch.ts","../src/streams.ts","../src/state.ts","../src/schema.ts","../src/utils/caller.ts","../src/utils/shutdown.ts","../src/utils/error.ts","../src/logger.ts","../src/singleton.ts","../src/utils/timing.ts","../src/utils/request-id.ts","../src/utils/mask-secrets.ts","../src/formatters.ts"],"names":["LEVEL_EMOJI","DEFAULT_REQUEST_TIMEOUT_MS","hostname","osHostname","pino","getGlobalOverrideLevel","DEFAULT_OPTIONS","httpData","randomUUID"],"mappings":"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","file":"index.mjs","sourcesContent":["import { AsyncLocalStorage } from 'async_hooks';\nimport type { LoggerContext } from './types.js';\n\nexport class LoggerStore<TContext extends LoggerContext = LoggerContext> {\n private storage = new AsyncLocalStorage<TContext>();\n\n getStore(): TContext | undefined {\n return this.storage.getStore();\n }\n\n run<T>(context: TContext, fn: () => T): T {\n return this.storage.run(context, fn);\n }\n}\n","export const LOG_LEVELS = {\n off: -1,\n error: 0,\n warn: 1,\n info: 2,\n http: 3,\n verbose: 4,\n debug: 5,\n silly: 6,\n} as const;\n\nexport type LogLevel = keyof typeof LOG_LEVELS;\n\nexport function isValidLogLevel(level: string): level is LogLevel {\n return level in LOG_LEVELS;\n}\n\nexport function assertLogLevel(level: string): asserts level is LogLevel {\n if (!isValidLogLevel(level)) {\n throw new Error(`Invalid log level: \"${level}\". Valid levels: ${Object.keys(LOG_LEVELS).join(', ')}`);\n }\n}\n\nexport type LogFormat = 'json' | 'plain' | 'logfmt' | 'simple';\n\nexport interface LevelRule {\n match: Record<string, unknown> & { context?: string };\n level: LogLevel;\n}\n\nexport interface ConsoleConfig {\n format: LogFormat;\n level?: LogLevel;\n rules?: LevelRule[];\n}\n\nexport interface FileConfig {\n format: LogFormat;\n level?: LogLevel;\n rules?: LevelRule[];\n dirname: string;\n filename: string;\n datePattern?: string;\n interval?: string;\n zippedArchive?: boolean;\n maxSize?: string;\n maxFiles?: string;\n}\n\n// HTTP Transport base config\nexport interface HttpTransportBaseConfig {\n level?: LogLevel;\n rules?: LevelRule[];\n batchSize?: number;\n flushInterval?: number;\n maxRetries?: number;\n retryDelay?: number;\n /**\n * Maximum number of messages the in-memory queue will hold before dropping.\n * Provides a hard upper bound on memory usage when a transport is degraded\n * or offline — without this, a failing transport + steady log volume grows\n * the queue until OOM. Default: unbounded.\n *\n * Recommended for production: `10_000` — enough to absorb transient blips,\n * small enough to avoid runaway memory.\n */\n maxQueueSize?: number;\n /**\n * Policy applied when the queue is full.\n * - `'drop-oldest'` (default): prefers keeping recent events — during an\n * outage old logs are usually stale.\n * - `'drop-newest'`: prefers preserving historical context — useful if you\n * care more about the events leading up to the outage than the noise\n * happening during it.\n */\n dropPolicy?: 'drop-oldest' | 'drop-newest';\n /**\n * Called when messages are dropped due to queue overflow. Receives only the\n * messages that were discarded. If not provided, drops are silent.\n *\n * Callback MUST NOT throw; if it does, the exception is swallowed.\n */\n onDrop?: (droppedMessages: unknown[]) => void;\n /**\n * Called when a batch fails after all retries and messages are dropped.\n * If not provided, the error is logged to stderr.\n *\n * The callback MUST NOT throw; if it does, the failure is swallowed and a\n * stderr fallback is used. This is intentional — a logger must never\n * propagate its own transport errors back into the host application.\n */\n onError?: (error: Error, droppedMessages: unknown[]) => void;\n /**\n * Timeout in milliseconds for a single outbound HTTP request. Default:\n * `10_000`. Applies to Discord/Telegram `fetch`. CloudWatch uses the AWS\n * SDK's own timeout configuration.\n */\n requestTimeout?: number;\n}\n\n// Discord Transport\nexport interface DiscordConfig extends HttpTransportBaseConfig {\n webhookUrl: string;\n format?: 'embed' | 'markdown'; // default: 'embed'\n username?: string;\n avatarUrl?: string;\n embedColors?: Partial<Record<LogLevel, number>>;\n includeTimestamp?: boolean;\n includeMeta?: boolean;\n maxEmbedFields?: number;\n}\n\n// Telegram Transport\nexport interface TelegramConfig extends HttpTransportBaseConfig {\n botToken: string;\n chatId: string | number;\n parseMode?: 'Markdown' | 'MarkdownV2' | 'HTML';\n disableNotification?: boolean;\n threadId?: number;\n replyToMessageId?: number;\n}\n\n// Zoho Cliq Transport\nexport interface ZohoCliqBotConfig {\n /** Bot display name (shown in the channel). */\n name: string;\n /** Optional bot avatar URL. */\n image?: string;\n}\n\nexport interface ZohoCliqConfig extends HttpTransportBaseConfig {\n /**\n * Incoming webhook URL. If provided, `companyId`/`channel`/`region` are\n * ignored and this URL is used as-is (with `zapikey` appended as query).\n */\n webhookUrl?: string;\n /** Zoho Cliq company/org ID. Required unless `webhookUrl` is set. */\n companyId?: string;\n /** Target channel name (the `channelsbyname` API segment). Required unless `webhookUrl` is set. */\n channel?: string;\n /** Zoho region/TLD: 'eu' | 'com' | 'in' | etc. Default: 'eu'. */\n region?: string;\n /** Zoho API key (zapikey). Required. */\n apiKey: string;\n /** If true (default), message is posted as a broadcast so all members are notified. */\n broadcast?: boolean;\n /** Post as a custom bot instead of the default user. */\n bot?: ZohoCliqBotConfig;\n /** Include ISO timestamp in each formatted message. Default: true. */\n includeTimestamp?: boolean;\n /** Include meta as a fenced code block. Default: true. */\n includeMeta?: boolean;\n}\n\n// CloudWatch Log Stream Name patterns\nexport type LogStreamPattern = 'hostname' | 'hostname-date' | 'hostname-uuid' | 'date' | 'uuid';\n\nexport interface LogStreamPatternConfig {\n pattern: LogStreamPattern;\n}\n\nexport interface LogStreamTemplateConfig {\n /** Custom template with variables: {hostname}, {date}, {datetime}, {uuid}, {pid}, {env} */\n template: string;\n}\n\nexport type LogStreamName = string | LogStreamPatternConfig | LogStreamTemplateConfig;\n\n// Relay Transport (runs in worker thread via pino.transport)\nexport interface RelayConfig {\n /** URL of the relay API (e.g., https://relay.example.com) */\n apiUrl: string;\n /** Authentication token for the relay server */\n token: string;\n /** Polling interval in ms (default: 30000) */\n pollInterval?: number;\n /** Ring buffer capacity - max logs held during reconnect (default: 1000) */\n bufferSize?: number;\n /** WebSocket reconnect base delay in ms (default: 1000) */\n reconnectDelay?: number;\n /** Max reconnect delay in ms (default: 30000) */\n maxReconnectDelay?: number;\n}\n\n// CloudWatch Transport\nexport interface CloudWatchConfig extends HttpTransportBaseConfig {\n logGroupName: string;\n /** Log stream name - string, pattern config, or template config. Defaults to hostname pattern */\n logStreamName?: LogStreamName;\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n createLogGroup?: boolean;\n createLogStream?: boolean;\n}\n\nexport interface LevelConfigObject {\n default: LogLevel;\n rules?: LevelRule[];\n}\n\nexport type LevelConfig = LogLevel | LevelConfigObject;\n\nexport interface CallerConfig {\n /** Stack depth to capture (default: 1). Higher values trace further up the call stack */\n depth?: number;\n /** Include full file path (default: false). If false, shows relative or basename only */\n fullPath?: boolean;\n}\n\nexport interface CallerInfo {\n file: string;\n line: number;\n column?: number;\n function?: string;\n}\n\nexport interface AutoShutdownConfig {\n /** Timeout in ms before forcing exit (default: 5000) */\n timeout?: number;\n /** Custom signals to handle (default: ['SIGTERM', 'SIGINT']) */\n signals?: NodeJS.Signals[];\n}\n\nexport interface LoggerConfig {\n level: LevelConfig;\n console: ConsoleConfig;\n file?: FileConfig;\n discord?: DiscordConfig | DiscordConfig[];\n telegram?: TelegramConfig | TelegramConfig[];\n cloudwatch?: CloudWatchConfig | CloudWatchConfig[];\n zohoCliq?: ZohoCliqConfig | ZohoCliqConfig[];\n /** Relay transport config — streams logs to a remote server via WebSocket (runs in worker thread) */\n relay?: RelayConfig;\n /** Enable caller info (file:line) in logs. Pass true for defaults or CallerConfig for options */\n caller?: boolean | CallerConfig;\n /** Hostname to include in all log entries. Defaults to os.hostname() if not specified */\n hostname?: string;\n /** Auto-register graceful shutdown handlers. Pass true for defaults or config object */\n autoShutdown?: boolean | AutoShutdownConfig;\n}\n\nexport type LoggerContext = Record<string, unknown>;\n\nexport type LevelOverrideMatch<TContext extends LoggerContext> = Partial<TContext> & { context?: string };\n\nexport interface LevelOverride<TContext extends LoggerContext> {\n match: LevelOverrideMatch<TContext>;\n level: LogLevel;\n readonly?: boolean;\n}\n\nexport type Meta = object | (() => object);\n","import type { LogLevel } from '../types.js';\n\nexport interface BufferedMessage {\n level: LogLevel;\n message: string;\n timestamp: Date;\n context?: string;\n meta?: Record<string, unknown>;\n}\n\nexport type DropPolicy = 'drop-oldest' | 'drop-newest';\n\nexport interface BufferOptions {\n batchSize: number;\n flushInterval: number;\n maxRetries: number;\n retryDelay: number;\n onFlush: (messages: BufferedMessage[]) => Promise<void>;\n onError?: (error: Error, messages: BufferedMessage[]) => void;\n /**\n * Maximum number of messages the queue will hold before dropping. When the\n * queue is full, behaviour follows `dropPolicy`. Default: unbounded.\n */\n maxQueueSize?: number;\n /**\n * Policy applied when the queue is at `maxQueueSize` and a new message\n * arrives. Default: `'drop-oldest'` — prefers keeping recent events, since\n * during an outage the old ones are usually stale anyway.\n */\n dropPolicy?: DropPolicy;\n /**\n * Called when messages are dropped due to queue overflow. Receives the\n * messages that were discarded (not the remaining queue). If not provided,\n * the drop is silent — consumers can still track it via buffer metrics.\n *\n * Callback MUST NOT throw; if it does, the exception is swallowed.\n */\n onDrop?: (droppedMessages: BufferedMessage[]) => void;\n}\n\nexport class MessageBuffer {\n private queue: BufferedMessage[] = [];\n private timer: NodeJS.Timeout | null = null;\n private flushing = false;\n private closed = false;\n private droppedCount = 0;\n\n constructor(private options: BufferOptions) {}\n\n add(message: BufferedMessage): void {\n if (this.closed) return;\n\n const limit = this.options.maxQueueSize;\n if (limit !== undefined && this.queue.length >= limit) {\n const policy = this.options.dropPolicy ?? 'drop-oldest';\n const dropped = policy === 'drop-oldest' ? [this.queue.shift()!] : [message];\n this.droppedCount += 1;\n\n if (this.options.onDrop) {\n try {\n this.options.onDrop(dropped);\n } catch {\n // onDrop must not throw — swallow silently. See contract in options.\n }\n }\n\n if (policy === 'drop-newest') {\n // New message was discarded; queue is unchanged, nothing to schedule.\n return;\n }\n }\n\n this.queue.push(message);\n\n if (this.queue.length >= this.options.batchSize) {\n void this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.flushing || this.queue.length === 0) return;\n\n this.flushing = true;\n this.clearTimer();\n\n const messages = this.queue.splice(0, this.options.batchSize);\n\n try {\n await this.sendWithRetry(messages);\n } catch (error) {\n this.options.onError?.(error as Error, messages);\n } finally {\n this.flushing = false;\n\n // If there are more messages, continue flushing\n if (this.queue.length > 0 && !this.closed) {\n void this.flush();\n }\n }\n }\n\n /**\n * Stops accepting new messages and attempts to flush what's already buffered.\n * Returns when the queue is drained OR when `timeoutMs` elapses. A timeout\n * is essential during graceful shutdown — without it, a dead transport would\n * block process exit indefinitely, and orchestrators like Kubernetes would\n * escalate to SIGKILL after their grace period.\n *\n * Default timeout: 5 seconds. Pass `Infinity` to preserve legacy behaviour.\n */\n async close(timeoutMs = 5000): Promise<void> {\n this.closed = true;\n this.clearTimer();\n\n const deadline = timeoutMs === Infinity ? Infinity : Date.now() + timeoutMs;\n\n while (this.queue.length > 0) {\n if (Date.now() >= deadline) {\n // Give up; messages still in the queue are lost. This is deliberate:\n // blocking shutdown on an unresponsive transport is worse than losing\n // a handful of in-flight log lines.\n return;\n }\n await this.flush();\n }\n }\n\n /** Current number of messages waiting in the queue. */\n get size(): number {\n return this.queue.length;\n }\n\n /** Total number of messages dropped due to queue overflow since creation. */\n get droppedTotal(): number {\n return this.droppedCount;\n }\n\n private scheduleFlush(): void {\n if (this.timer || this.closed) return;\n\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, this.options.flushInterval);\n }\n\n private clearTimer(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n private async sendWithRetry(messages: BufferedMessage[]): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.options.maxRetries; attempt++) {\n try {\n await this.options.onFlush(messages);\n return;\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < this.options.maxRetries - 1) {\n await this.delay(this.options.retryDelay * Math.pow(2, attempt));\n }\n }\n }\n\n throw lastError;\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { MessageBuffer, type BufferedMessage, type DropPolicy } from './buffer.js';\nimport type { LogLevel } from '../types.js';\n\nexport interface BaseHttpTransportOptions {\n batchSize?: number;\n flushInterval?: number;\n maxRetries?: number;\n retryDelay?: number;\n maxQueueSize?: number;\n dropPolicy?: DropPolicy;\n onDrop?: (droppedMessages: BufferedMessage[]) => void;\n /**\n * Called when a batch fails after all retries and messages are dropped.\n * If not provided, the error is logged to stderr.\n *\n * The callback MUST NOT throw; if it does, the failure is swallowed and a\n * stderr fallback is used. A logger must never propagate transport errors\n * back into the host application.\n */\n onError?: (error: Error, droppedMessages: BufferedMessage[]) => void;\n}\n\nconst DEFAULT_OPTIONS = {\n batchSize: 10,\n flushInterval: 5000,\n maxRetries: 3,\n retryDelay: 1000,\n};\n\nexport abstract class BaseHttpTransport {\n protected buffer: MessageBuffer;\n private onErrorCallback?: BaseHttpTransportOptions['onError'];\n\n constructor(opts: BaseHttpTransportOptions = {}) {\n this.onErrorCallback = opts.onError;\n\n this.buffer = new MessageBuffer({\n batchSize: opts.batchSize ?? DEFAULT_OPTIONS.batchSize,\n flushInterval: opts.flushInterval ?? DEFAULT_OPTIONS.flushInterval,\n maxRetries: opts.maxRetries ?? DEFAULT_OPTIONS.maxRetries,\n retryDelay: opts.retryDelay ?? DEFAULT_OPTIONS.retryDelay,\n maxQueueSize: opts.maxQueueSize,\n dropPolicy: opts.dropPolicy,\n onDrop: opts.onDrop,\n onFlush: this.sendBatch.bind(this),\n onError: this.handleError.bind(this),\n });\n }\n\n log(info: Record<string, unknown>, callback: () => void): void {\n const message = this.transformMessage(info);\n this.buffer.add(message);\n callback();\n }\n\n /**\n * Stop accepting new messages and flush what's buffered. `timeoutMs` caps\n * how long the flush may take; after that the remaining queue is discarded\n * so shutdown can complete. Default 5000ms.\n */\n close(timeoutMs?: number): Promise<void> {\n return this.buffer.close(timeoutMs);\n }\n\n /** Current buffered message count and total drops since creation. */\n getMetrics(): { queueSize: number; droppedTotal: number } {\n return {\n queueSize: this.buffer.size,\n droppedTotal: this.buffer.droppedTotal,\n };\n }\n\n protected transformMessage(info: Record<string, unknown>): BufferedMessage {\n const { level, message, timestamp, context, ...meta } = info;\n\n return {\n level: level as LogLevel,\n message: String(message),\n timestamp: timestamp instanceof Date ? timestamp : (timestamp ? new Date(String(timestamp)) : new Date()),\n context: context as string | undefined,\n meta: Object.keys(meta).length > 0 ? meta : undefined,\n };\n }\n\n protected handleError(error: Error, messages: BufferedMessage[]): void {\n if (this.onErrorCallback) {\n try {\n this.onErrorCallback(error, messages);\n return;\n } catch (callbackError) {\n // onError must not throw — fall through to stderr.\n // Use stderr to surface the programmer error without blowing up the app.\n // eslint-disable-next-line no-console\n console.error(\n `[${this.constructor.name}] onError callback threw:`,\n callbackError instanceof Error ? callbackError.message : callbackError,\n );\n }\n }\n\n // Default behavior: log to stderr. Avoids infinite loops — we never\n // write transport errors into the logger's own pipeline.\n // eslint-disable-next-line no-console\n console.error(\n `[${this.constructor.name}] Failed to send ${messages.length} messages:`,\n error.message,\n );\n }\n\n protected abstract sendBatch(messages: BufferedMessage[]): Promise<void>;\n}\n","import { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { DiscordConfig, LogLevel } from '../types.js';\n\nconst DEFAULT_EMBED_COLORS: Record<LogLevel, number> = {\n off: 0x000000,\n error: 0xed4245,\n warn: 0xfee75c,\n info: 0x57f287,\n http: 0x5865f2,\n verbose: 0x9b59b6,\n debug: 0x3498db,\n silly: 0x95a5a6,\n};\n\ninterface DiscordEmbed {\n title: string;\n description: string;\n color: number;\n timestamp?: string;\n fields?: Array<{ name: string; value: string; inline?: boolean }>;\n}\n\ninterface DiscordWebhookPayload {\n username?: string;\n avatar_url?: string;\n content?: string;\n embeds?: DiscordEmbed[];\n}\n\nconst LEVEL_EMOJI: Record<LogLevel, string> = {\n off: '⚫',\n error: '🔴',\n warn: '🟡',\n info: '🟢',\n http: '🔵',\n verbose: '🟣',\n debug: '⚪',\n silly: '⚫',\n};\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10_000;\n\nexport class DiscordTransport extends BaseHttpTransport {\n private config: DiscordConfig;\n private requestTimeout: number;\n\n constructor(config: DiscordConfig) {\n super({\n batchSize: config.batchSize ?? 10,\n flushInterval: config.flushInterval ?? 2000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n maxQueueSize: config.maxQueueSize,\n dropPolicy: config.dropPolicy,\n onDrop: config.onDrop,\n onError: config.onError,\n });\n this.config = config;\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n protected async sendBatch(messages: BufferedMessage[]): Promise<void> {\n if (this.config.format === 'markdown') {\n await this.sendMarkdownBatch(messages);\n } else {\n await this.sendEmbedBatch(messages);\n }\n }\n\n private async sendEmbedBatch(messages: BufferedMessage[]): Promise<void> {\n // Discord allows max 10 embeds per message\n const chunks = this.chunkArray(messages, 10);\n\n for (const chunk of chunks) {\n const payload: DiscordWebhookPayload = {\n username: this.config.username,\n avatar_url: this.config.avatarUrl,\n embeds: chunk.map((msg) => this.createEmbed(msg)),\n };\n\n await this.sendWebhook(payload);\n }\n }\n\n private async sendMarkdownBatch(messages: BufferedMessage[]): Promise<void> {\n // Discord content limit is 2000 chars, send each message separately if needed\n const content = messages.map((msg) => this.formatMarkdown(msg)).join('\\n\\n---\\n\\n');\n\n // Split into chunks of ~1900 chars to stay under 2000 limit\n const chunks = this.splitContent(content, 1900);\n\n for (const chunk of chunks) {\n const payload: DiscordWebhookPayload = {\n username: this.config.username,\n avatar_url: this.config.avatarUrl,\n content: chunk,\n };\n\n await this.sendWebhook(payload);\n }\n }\n\n private formatMarkdown(msg: BufferedMessage): string {\n const emoji = LEVEL_EMOJI[msg.level];\n const level = msg.level.toUpperCase();\n const context = msg.context || 'APP';\n const timestamp = this.config.includeTimestamp !== false\n ? `\\`${msg.timestamp.toISOString()}\\``\n : '';\n\n let text = `${emoji} **${level}** [${context}] ${timestamp}\\n${msg.message}`;\n\n if (this.config.includeMeta !== false && msg.meta && Object.keys(msg.meta).length > 0) {\n text += '\\n```json\\n' + JSON.stringify(msg.meta, null, 2) + '\\n```';\n }\n\n return text;\n }\n\n private splitContent(content: string, maxLength: number): string[] {\n if (content.length <= maxLength) return [content];\n\n const chunks: string[] = [];\n let current = content;\n\n while (current.length > 0) {\n if (current.length <= maxLength) {\n chunks.push(current);\n break;\n }\n\n // Find a good split point (newline or space)\n let splitAt = current.lastIndexOf('\\n', maxLength);\n if (splitAt === -1 || splitAt < maxLength / 2) {\n splitAt = current.lastIndexOf(' ', maxLength);\n }\n if (splitAt === -1 || splitAt < maxLength / 2) {\n splitAt = maxLength;\n }\n\n chunks.push(current.slice(0, splitAt));\n current = current.slice(splitAt).trimStart();\n }\n\n return chunks;\n }\n\n private createEmbed(msg: BufferedMessage): DiscordEmbed {\n const color = this.config.embedColors?.[msg.level] ?? DEFAULT_EMBED_COLORS[msg.level];\n\n const embed: DiscordEmbed = {\n title: `[${msg.level.toUpperCase()}] ${msg.context || 'APP'}`,\n description: msg.message.slice(0, 4096), // Discord limit\n color,\n };\n\n if (this.config.includeTimestamp !== false) {\n embed.timestamp = msg.timestamp.toISOString();\n }\n\n if (this.config.includeMeta !== false && msg.meta) {\n embed.fields = this.metaToFields(msg.meta);\n }\n\n return embed;\n }\n\n private metaToFields(\n meta: Record<string, unknown>,\n ): Array<{ name: string; value: string; inline?: boolean }> {\n const maxFields = this.config.maxEmbedFields ?? 25;\n const fields: Array<{ name: string; value: string; inline?: boolean }> = [];\n\n for (const [key, value] of Object.entries(meta)) {\n if (fields.length >= maxFields) break;\n\n let strValue: string;\n if (typeof value === 'object') {\n strValue = '```json\\n' + JSON.stringify(value, null, 2).slice(0, 1000) + '\\n```';\n } else {\n strValue = String(value).slice(0, 1024);\n }\n\n fields.push({\n name: key.slice(0, 256),\n value: strValue,\n inline: typeof value !== 'object' && String(value).length < 50,\n });\n }\n\n return fields;\n }\n\n private async sendWebhook(payload: DiscordWebhookPayload): Promise<void> {\n const response = await fetch(this.config.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(this.requestTimeout),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Discord webhook failed: ${response.status} ${text}`);\n }\n }\n\n private chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n}\n","import { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { TelegramConfig, LogLevel } from '../types.js';\n\nconst LEVEL_EMOJI: Record<LogLevel, string> = {\n off: '',\n error: '🔴',\n warn: '🟡',\n info: '🟢',\n http: '🔵',\n verbose: '🟣',\n debug: '⚪',\n silly: '⚫',\n};\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10_000;\n\nexport class TelegramTransport extends BaseHttpTransport {\n private config: TelegramConfig;\n private apiUrl: string;\n private requestTimeout: number;\n\n constructor(config: TelegramConfig) {\n super({\n batchSize: config.batchSize ?? 20,\n flushInterval: config.flushInterval ?? 1000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n maxQueueSize: config.maxQueueSize,\n dropPolicy: config.dropPolicy,\n onDrop: config.onDrop,\n onError: config.onError,\n });\n this.config = config;\n this.apiUrl = `https://api.telegram.org/bot${config.botToken}`;\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n protected async sendBatch(messages: BufferedMessage[]): Promise<void> {\n const text = this.formatBatchMessage(messages);\n await this.sendMessage(text, messages);\n }\n\n private formatBatchMessage(messages: BufferedMessage[]): string {\n const parseMode = this.config.parseMode ?? 'HTML';\n\n return messages\n .map((msg) => {\n if (parseMode === 'HTML') {\n return this.formatHtml(msg);\n }\n return this.formatMarkdown(msg, parseMode === 'MarkdownV2');\n })\n .join('\\n\\n---\\n\\n');\n }\n\n private formatMarkdown(msg: BufferedMessage, v2: boolean): string {\n const emoji = LEVEL_EMOJI[msg.level];\n const escape = v2 ? this.escapeMarkdownV2.bind(this) : (s: string) => s;\n const bracket = v2 ? ['\\\\[', '\\\\]'] : ['[', ']'];\n\n let text = `${emoji} *${msg.level.toUpperCase()}* ${bracket[0]}${escape(msg.context || 'APP')}${bracket[1]}\\n`;\n text += escape(msg.message);\n\n if (msg.meta && Object.keys(msg.meta).length > 0) {\n const metaStr = JSON.stringify(msg.meta, null, 2);\n text += '\\n```json\\n' + metaStr + '\\n```';\n }\n\n return text;\n }\n\n private formatHtml(msg: BufferedMessage): string {\n const emoji = LEVEL_EMOJI[msg.level];\n\n let text = `${emoji} <b>${msg.level.toUpperCase()}</b> [${this.escapeHtml(msg.context || 'APP')}]\\n`;\n text += this.escapeHtml(msg.message);\n\n if (msg.meta && Object.keys(msg.meta).length > 0) {\n const metaStr = JSON.stringify(msg.meta, null, 2);\n text += '\\n<pre>' + this.escapeHtml(metaStr) + '</pre>';\n }\n\n return text;\n }\n\n private shouldMute(messages: BufferedMessage[]): boolean {\n if (this.config.disableNotification !== undefined) {\n return this.config.disableNotification;\n }\n // Don't mute if any message is error level\n return !messages.some((m) => m.level === 'error');\n }\n\n private async sendMessage(text: string, messages: BufferedMessage[]): Promise<void> {\n const body: Record<string, unknown> = {\n chat_id: this.config.chatId,\n text,\n parse_mode: this.config.parseMode ?? 'HTML',\n disable_notification: this.shouldMute(messages),\n };\n\n if (this.config.threadId) {\n body.message_thread_id = this.config.threadId;\n }\n\n if (this.config.replyToMessageId) {\n body.reply_to_message_id = this.config.replyToMessageId;\n }\n\n const response = await fetch(`${this.apiUrl}/sendMessage`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.requestTimeout),\n });\n\n if (!response.ok) {\n const result = await response.json();\n throw new Error(`Telegram API failed: ${response.status} ${JSON.stringify(result)}`);\n }\n }\n\n private escapeMarkdownV2(text: string): string {\n return text.replace(/[_*[\\]()~`>#+\\-=|{}.!]/g, '\\\\$&');\n }\n\n private escapeHtml(text: string): string {\n const entities: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n };\n return text.replace(/[&<>\"']/g, (c) => entities[c] || c);\n }\n}\n","import { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { ZohoCliqConfig, LogLevel } from '../types.js';\n\nconst LEVEL_EMOJI: Record<LogLevel, string> = {\n off: '',\n error: '🔴',\n warn: '🟡',\n info: '🟢',\n http: '🔵',\n verbose: '🟣',\n debug: '⚪',\n silly: '⚫',\n};\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10_000;\n// Zoho Cliq text field accepts up to 10,000 chars per message\nconst MAX_MESSAGE_LENGTH = 9_500;\n\nexport class ZohoCliqTransport extends BaseHttpTransport {\n private config: ZohoCliqConfig;\n private endpoint: string;\n private requestTimeout: number;\n\n constructor(config: ZohoCliqConfig) {\n super({\n batchSize: config.batchSize ?? 20,\n flushInterval: config.flushInterval ?? 2000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n maxQueueSize: config.maxQueueSize,\n dropPolicy: config.dropPolicy,\n onDrop: config.onDrop,\n onError: config.onError,\n });\n this.config = config;\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.endpoint = this.buildEndpoint();\n }\n\n private buildEndpoint(): string {\n if (this.config.webhookUrl) {\n return this.config.webhookUrl;\n }\n const region = this.config.region ?? 'eu';\n const companyId = this.config.companyId;\n const channel = encodeURIComponent(this.config.channel!);\n return `https://cliq.zoho.${region}/company/${companyId}/api/v2/channelsbyname/${channel}/message`;\n }\n\n protected async sendBatch(messages: BufferedMessage[]): Promise<void> {\n const text = messages.map((msg) => this.formatMessage(msg)).join('\\n\\n---\\n\\n');\n for (const chunk of this.splitContent(text, MAX_MESSAGE_LENGTH)) {\n await this.post(chunk);\n }\n }\n\n private formatMessage(msg: BufferedMessage): string {\n const emoji = LEVEL_EMOJI[msg.level];\n const level = msg.level.toUpperCase();\n const context = msg.context || 'APP';\n const timestamp = this.config.includeTimestamp !== false\n ? ` ${msg.timestamp.toISOString()}`\n : '';\n\n let text = `${emoji} *${level}* [${context}]${timestamp}\\n${msg.message}`;\n\n if (this.config.includeMeta !== false && msg.meta && Object.keys(msg.meta).length > 0) {\n text += '\\n```\\n' + JSON.stringify(msg.meta, null, 2) + '\\n```';\n }\n\n return text;\n }\n\n private splitContent(content: string, maxLength: number): string[] {\n if (content.length <= maxLength) return [content];\n\n const chunks: string[] = [];\n let current = content;\n\n while (current.length > 0) {\n if (current.length <= maxLength) {\n chunks.push(current);\n break;\n }\n let splitAt = current.lastIndexOf('\\n', maxLength);\n if (splitAt === -1 || splitAt < maxLength / 2) {\n splitAt = current.lastIndexOf(' ', maxLength);\n }\n if (splitAt === -1 || splitAt < maxLength / 2) {\n splitAt = maxLength;\n }\n chunks.push(current.slice(0, splitAt));\n current = current.slice(splitAt).trimStart();\n }\n\n return chunks;\n }\n\n private async post(text: string): Promise<void> {\n const url = new URL(this.endpoint);\n url.searchParams.set('zapikey', this.config.apiKey);\n if (this.config.bot?.name) {\n url.searchParams.set('bot_unique_name', this.config.bot.name);\n }\n\n const body: Record<string, unknown> = {\n text,\n broadcast: this.config.broadcast ?? true,\n };\n if (this.config.bot) {\n body.bot = this.config.bot;\n }\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.requestTimeout),\n });\n\n // Zoho Cliq returns 204 on success\n if (!response.ok && response.status !== 204) {\n const respText = await response.text().catch(() => '');\n throw new Error(`Zoho Cliq API failed: ${response.status} ${respText}`);\n }\n }\n}\n","import {\n CloudWatchLogsClient,\n PutLogEventsCommand,\n CreateLogGroupCommand,\n CreateLogStreamCommand,\n DescribeLogStreamsCommand,\n type InputLogEvent,\n} from '@aws-sdk/client-cloudwatch-logs';\nimport { hostname as osHostname } from 'os';\nimport { randomUUID } from 'crypto';\nimport { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { CloudWatchConfig, LogStreamName } from '../types.js';\n\n// Generate UUID once at module load for consistent stream names across the app lifecycle\nconst instanceUuid = randomUUID().slice(0, 8);\n\nfunction formatDate(): string {\n return new Date().toISOString().slice(0, 10); // YYYY-MM-DD\n}\n\nfunction formatDateTime(): string {\n return new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-'); // YYYY-MM-DD-HH-mm-ss\n}\n\nfunction resolveLogStreamName(config: LogStreamName | undefined, configHostname?: string): string {\n const hostname = configHostname || process.env.HOSTNAME || osHostname();\n\n // Default to hostname pattern if not specified\n if (!config) {\n return hostname;\n }\n\n // Plain string - use as-is\n if (typeof config === 'string') {\n return config;\n }\n\n // Pattern config\n if ('pattern' in config) {\n switch (config.pattern) {\n case 'hostname':\n return hostname;\n case 'hostname-date':\n return `${hostname}/${formatDate()}`;\n case 'hostname-uuid':\n return `${hostname}-${instanceUuid}`;\n case 'date':\n return formatDate();\n case 'uuid':\n return randomUUID();\n default:\n return hostname;\n }\n }\n\n // Template config\n if ('template' in config) {\n return config.template\n .replace(/\\{hostname\\}/g, hostname)\n .replace(/\\{date\\}/g, formatDate())\n .replace(/\\{datetime\\}/g, formatDateTime())\n .replace(/\\{uuid\\}/g, instanceUuid)\n .replace(/\\{pid\\}/g, String(process.pid))\n .replace(/\\{env\\}/g, process.env.NODE_ENV || 'development');\n }\n\n return hostname;\n}\n\nexport class CloudWatchTransport extends BaseHttpTransport {\n private config: CloudWatchConfig;\n private client: CloudWatchLogsClient;\n private sequenceToken: string | undefined;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n private resolvedLogStreamName: string;\n\n constructor(config: CloudWatchConfig, configHostname?: string) {\n super({\n batchSize: config.batchSize ?? 100,\n flushInterval: config.flushInterval ?? 1000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n maxQueueSize: config.maxQueueSize,\n dropPolicy: config.dropPolicy,\n onDrop: config.onDrop,\n onError: config.onError,\n });\n this.config = config;\n this.resolvedLogStreamName = resolveLogStreamName(config.logStreamName, configHostname);\n\n this.client = new CloudWatchLogsClient({\n region: config.region,\n credentials: {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n },\n });\n }\n\n protected async sendBatch(messages: BufferedMessage[]): Promise<void> {\n await this.ensureInitialized();\n\n const logEvents: InputLogEvent[] = messages.map((msg) => ({\n timestamp: msg.timestamp.getTime(),\n message: JSON.stringify({\n level: msg.level,\n message: msg.message,\n context: msg.context,\n ...msg.meta,\n }),\n }));\n\n // Sort by timestamp (CloudWatch requirement)\n logEvents.sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0));\n\n const command = new PutLogEventsCommand({\n logGroupName: this.config.logGroupName,\n logStreamName: this.resolvedLogStreamName,\n logEvents,\n sequenceToken: this.sequenceToken,\n });\n\n try {\n const response = await this.client.send(command);\n this.sequenceToken = response.nextSequenceToken;\n } catch (error: unknown) {\n // Handle InvalidSequenceTokenException by retrying with correct token\n if (this.isInvalidSequenceTokenError(error)) {\n await this.fetchSequenceToken();\n const retryCommand = new PutLogEventsCommand({\n logGroupName: this.config.logGroupName,\n logStreamName: this.resolvedLogStreamName,\n logEvents,\n sequenceToken: this.sequenceToken,\n });\n const response = await this.client.send(retryCommand);\n this.sequenceToken = response.nextSequenceToken;\n } else {\n throw error;\n }\n }\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n // If a previous initialize() failed (e.g. transient network blip,\n // credentials briefly invalid), a naive cache of the rejected promise\n // would leave the transport permanently dead. Reset the cached promise on\n // failure so the next `sendBatch` retries initialization from scratch.\n if (!this.initPromise) {\n this.initPromise = this.initialize().catch((err) => {\n this.initPromise = null;\n throw err;\n });\n }\n\n await this.initPromise;\n }\n\n private async initialize(): Promise<void> {\n if (this.config.createLogGroup) {\n await this.createLogGroupIfNotExists();\n }\n\n if (this.config.createLogStream !== false) {\n await this.createLogStreamIfNotExists();\n }\n\n await this.fetchSequenceToken();\n this.initialized = true;\n }\n\n private async createLogGroupIfNotExists(): Promise<void> {\n try {\n await this.client.send(\n new CreateLogGroupCommand({\n logGroupName: this.config.logGroupName,\n }),\n );\n } catch (error: unknown) {\n if (!this.isResourceAlreadyExistsError(error)) {\n throw error;\n }\n }\n }\n\n private async createLogStreamIfNotExists(): Promise<void> {\n try {\n await this.client.send(\n new CreateLogStreamCommand({\n logGroupName: this.config.logGroupName,\n logStreamName: this.resolvedLogStreamName,\n }),\n );\n } catch (error: unknown) {\n if (!this.isResourceAlreadyExistsError(error)) {\n throw error;\n }\n }\n }\n\n private async fetchSequenceToken(): Promise<void> {\n const response = await this.client.send(\n new DescribeLogStreamsCommand({\n logGroupName: this.config.logGroupName,\n logStreamNamePrefix: this.resolvedLogStreamName,\n limit: 1,\n }),\n );\n\n const stream = response.logStreams?.find((s) => s.logStreamName === this.resolvedLogStreamName);\n this.sequenceToken = stream?.uploadSequenceToken;\n }\n\n private isResourceAlreadyExistsError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'ResourceAlreadyExistsException'\n );\n }\n\n private isInvalidSequenceTokenError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'InvalidSequenceTokenException'\n );\n }\n}\n","import pino, { type DestinationStream, type StreamEntry } from 'pino';\nimport { Transform, Writable } from 'node:stream';\nimport { fileURLToPath } from 'node:url';\nimport { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createStream, type RotatingFileStream, type FileSize, type Interval } from 'rotating-file-stream';\nimport { LoggerStore } from './store.js';\nimport { getGlobalOverrideLevel, matchesContext, type LoggerState } from './state.js';\nimport { DiscordTransport } from './transports/discord.js';\nimport { TelegramTransport } from './transports/telegram.js';\nimport { ZohoCliqTransport } from './transports/zoho-cliq.js';\nimport { CloudWatchTransport } from './transports/cloudwatch.js';\nimport type { BaseHttpTransport } from './transports/base-http.js';\nimport {\n LOG_LEVELS,\n type LoggerConfig,\n type LoggerContext,\n type LogLevel,\n type LevelRule,\n} from './types.js';\n\nexport interface StreamsResult {\n destination: DestinationStream;\n transports: BaseHttpTransport[];\n}\n\n// Pino level values\nconst PINO_LEVELS: Record<string, number> = {\n fatal: 60,\n error: 50,\n warn: 40,\n info: 30,\n debug: 20,\n trace: 10,\n // Custom\n http: 25,\n verbose: 25,\n silly: 10,\n};\n\ninterface ParsedLog {\n level: number;\n time: number;\n msg: string;\n context?: string;\n /** Internal: runtime-override level embedded by Logger.log(). See M2 in streams.ts. */\n __or?: string;\n [key: string]: unknown;\n}\n\nfunction parseLogLine(line: string): ParsedLog | null {\n try {\n return JSON.parse(line) as ParsedLog;\n } catch {\n return null;\n }\n}\n\nfunction getLevelName(levelNum: number): LogLevel {\n if (levelNum >= 50) return 'error';\n if (levelNum >= 40) return 'warn';\n if (levelNum >= 30) return 'info';\n if (levelNum >= 25) return 'http';\n if (levelNum >= 20) return 'debug';\n return 'silly';\n}\n\n// Check if log should pass based on transport rules.\n// Precedence (most specific wins):\n// 1. Runtime override (setLevelOverride) — if any matches, use its level\n// 2. Per-transport rule (transport-local rules array) — if any matches, use its level\n// 3. Per-transport level — fallback for this transport\n// 4. Accept all (silly) — if no transport level is set\n// This ensures that `setLevelOverride({ context: 'X' }, 'debug')` lifts messages\n// through any downstream transport that would otherwise filter them out.\n//\n// M2: the logger embeds the matched runtime-override level in the log line as\n// `__or` (see Logger.log). Checking that single field replaces re-running the\n// full override matcher here — saves ~30% of per-log overhead under heavy\n// rule configurations and keeps behaviour identical.\nfunction shouldPassTransport<TContext extends LoggerContext>(\n log: ParsedLog,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n state: LoggerState<TContext>,\n): boolean {\n const logLevel = getLevelName(log.level);\n\n // 1. Runtime override — pre-computed by the logger.\n const embeddedOverride = log.__or;\n if (typeof embeddedOverride === 'string') {\n if (embeddedOverride === 'off') return false;\n const overrideLevel = embeddedOverride as LogLevel;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[overrideLevel];\n }\n\n // No runtime override — apply transport-local rules/level.\n const context = log.context;\n\n // 2. Per-transport rule (only extract meta if we actually have rules to match).\n if (rules && rules.length > 0) {\n const storeContext = state.store.getStore();\n const logMeta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(log)) {\n if (!RESERVED_LOG_FIELDS.has(key)) {\n logMeta[key] = value;\n }\n }\n const matchingRule = rules.find((rule) => matchesContext(storeContext, context, rule.match, logMeta));\n if (matchingRule) {\n if (matchingRule.level === 'off') return false;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[matchingRule.level];\n }\n }\n\n // 3. Per-transport level, or 4. accept-all fallback\n const effectiveLevel = level ?? 'silly';\n if (effectiveLevel === 'off') return false;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[effectiveLevel];\n}\n\nconst RESERVED_LOG_FIELDS = new Set(['level', 'time', 'msg', 'context', '__or']);\n\n// Format based on type\nfunction formatLog<TContext extends LoggerContext>(\n log: ParsedLog,\n format: 'json' | 'plain' | 'logfmt' | 'simple',\n store: LoggerStore<TContext>,\n): string {\n const levelName = getLevelName(log.level);\n const timestamp = new Date(log.time).toISOString();\n const context = log.context || 'APP';\n const message = log.msg || '';\n\n // Add store context\n const storeContext = store.getStore();\n const meta: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(log)) {\n if (!RESERVED_LOG_FIELDS.has(key)) {\n meta[key] = value;\n }\n }\n\n if (storeContext) {\n Object.assign(meta, storeContext);\n }\n\n if (format === 'json') {\n return JSON.stringify({\n level: levelName,\n timestamp,\n context,\n message,\n ...meta,\n }) + '\\n';\n }\n\n if (format === 'plain') {\n const LEVEL_COLORS: Record<string, string> = {\n error: '\\x1b[31m',\n warn: '\\x1b[33m',\n info: '\\x1b[32m',\n http: '\\x1b[35m',\n verbose: '\\x1b[36m',\n debug: '\\x1b[34m',\n silly: '\\x1b[90m',\n };\n const RESET = '\\x1b[0m';\n const color = LEVEL_COLORS[levelName] || '';\n const coloredLevel = color ? `${color}${levelName}${RESET}` : levelName;\n\n const formatValue = (key: string, value: unknown): string => {\n if (typeof value === 'string' && value.includes('\\n')) {\n // Multiline strings (like stack traces) - indent each line\n return '\\n ' + value.split('\\n').join('\\n ');\n }\n return JSON.stringify(value);\n };\n\n const metaStr = Object.keys(meta).length > 0\n ? '\\n ' + Object.entries(meta).map(([k, v]) => `${k}: ${formatValue(k, v)}`).join('\\n ')\n : '';\n return `[${timestamp}] ${coloredLevel} [${context}] ${message}${metaStr}\\n`;\n }\n\n if (format === 'logfmt') {\n const parts = [`level=${levelName}`, `msg=\"${message}\"`, `context=${context}`, `ts=${timestamp}`];\n for (const [k, v] of Object.entries(meta)) {\n parts.push(`${k}=${JSON.stringify(v)}`);\n }\n return parts.join(' ') + '\\n';\n }\n\n // simple\n return `[${timestamp}] ${levelName}: ${message}\\n`;\n}\n\n// Create a filtering + formatting transform stream\nfunction createFormattedFilterStream<TContext extends LoggerContext>(\n format: 'json' | 'plain' | 'logfmt' | 'simple',\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n state: LoggerState<TContext>,\n destination: NodeJS.WritableStream,\n): Transform {\n return new Transform({\n transform(chunk: Buffer, _encoding: string, callback) {\n const line = chunk.toString().trim();\n if (!line) {\n callback();\n return;\n }\n\n const log = parseLogLine(line);\n if (!log) {\n callback();\n return;\n }\n\n if (!shouldPassTransport(log, level, rules, state)) {\n callback();\n return;\n }\n\n const formatted = formatLog(log, format, state.store);\n destination.write(formatted);\n callback();\n },\n });\n}\n\nexport function createStreams<TContext extends LoggerContext>(\n config: LoggerConfig,\n state: LoggerState<TContext>,\n): StreamsResult {\n const streams: StreamEntry<'trace'>[] = [];\n const transports: BaseHttpTransport[] = [];\n\n // Console transport\n const consoleStream = createFormattedFilterStream(\n config.console.format,\n config.console.level,\n config.console.rules,\n state,\n process.stdout,\n );\n\n streams.push({\n level: 'trace',\n stream: consoleStream,\n });\n\n // File transport with rotation\n if (config.file) {\n const fileConfig = config.file;\n\n // Ensure directory exists\n mkdir(fileConfig.dirname, { recursive: true }).catch(() => {});\n\n // Normalize size unit to uppercase (rotating-file-stream requires uppercase: M, K, G)\n const normalizeSize = (size: string): FileSize => {\n return size.replace(/([kmg])$/i, (match) => match.toUpperCase()) as FileSize;\n };\n\n const rotatingStream = createStream(\n (time: Date | number, index?: number) => {\n const date = time instanceof Date ? time : new Date();\n const dateStr = date.toISOString().split('T')[0];\n const base = fileConfig.filename.replace('.log', '');\n return `${base}-${dateStr}${index ? `.${index}` : ''}.log`;\n },\n {\n path: fileConfig.dirname,\n size: normalizeSize(fileConfig.maxSize || '20M'),\n interval: (fileConfig.interval || (fileConfig.datePattern === 'YYYY-MM-DD-HH' ? '1h' : '1d')) as Interval,\n compress: fileConfig.zippedArchive ? 'gzip' : false,\n maxFiles: parseInt(fileConfig.maxFiles?.replace('d', '') || '14'),\n },\n );\n\n const fileStream = createFormattedFilterStream(\n fileConfig.format,\n fileConfig.level,\n fileConfig.rules,\n state,\n rotatingStream,\n );\n\n streams.push({\n level: 'trace',\n stream: fileStream,\n });\n }\n\n // HTTP transports - Discord\n for (const discordConfig of toArray(config.discord)) {\n const transport = new DiscordTransport(discordConfig);\n transports.push(transport);\n const discordStream = createHttpTransportStream(transport, discordConfig.level, discordConfig.rules, state);\n streams.push({\n level: 'trace',\n stream: discordStream,\n });\n }\n\n // HTTP transports - Telegram\n for (const telegramConfig of toArray(config.telegram)) {\n const transport = new TelegramTransport(telegramConfig);\n transports.push(transport);\n const telegramStream = createHttpTransportStream(transport, telegramConfig.level, telegramConfig.rules, state);\n streams.push({\n level: 'trace',\n stream: telegramStream,\n });\n }\n\n // HTTP transports - Zoho Cliq\n for (const zohoCliqConfig of toArray(config.zohoCliq)) {\n const transport = new ZohoCliqTransport(zohoCliqConfig);\n transports.push(transport);\n const zohoStream = createHttpTransportStream(transport, zohoCliqConfig.level, zohoCliqConfig.rules, state);\n streams.push({\n level: 'trace',\n stream: zohoStream,\n });\n }\n\n // HTTP transports - CloudWatch\n for (const cloudwatchConfig of toArray(config.cloudwatch)) {\n const transport = new CloudWatchTransport(cloudwatchConfig, config.hostname);\n transports.push(transport);\n const cwStream = createHttpTransportStream(transport, cloudwatchConfig.level, cloudwatchConfig.rules, state);\n streams.push({\n level: 'trace',\n stream: cwStream,\n });\n }\n\n // Relay transport (runs in worker thread via pino.transport)\n if (config.relay) {\n const relayStream = pino.transport({\n target: '@rawnodes/logger/relay',\n options: config.relay,\n });\n streams.push({\n level: 'trace',\n stream: relayStream as unknown as DestinationStream,\n });\n }\n\n return {\n destination: pino.multistream(streams),\n transports,\n };\n}\n\nfunction toArray<T>(value: T | T[] | undefined): T[] {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction createHttpTransportStream<TContext extends LoggerContext>(\n transport: DiscordTransport | TelegramTransport | CloudWatchTransport | ZohoCliqTransport,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n state: LoggerState<TContext>,\n): Writable {\n return new Writable({\n write(chunk: Buffer, _encoding: string, callback) {\n const line = chunk.toString().trim();\n if (!line) {\n callback();\n return;\n }\n\n const log = parseLogLine(line);\n if (!log) {\n callback();\n return;\n }\n\n if (!shouldPassTransport(log, level, rules, state)) {\n callback();\n return;\n }\n\n const levelName = getLevelName(log.level);\n const storeContext = state.store.getStore();\n\n const meta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(log)) {\n if (!RESERVED_LOG_FIELDS.has(key)) {\n meta[key] = value;\n }\n }\n\n if (storeContext) {\n Object.assign(meta, storeContext);\n }\n\n transport.log({\n level: levelName,\n message: log.msg || '',\n context: log.context,\n timestamp: new Date(log.time),\n ...meta,\n }, callback);\n },\n });\n}\n","import { hostname as osHostname } from 'os';\nimport pino, { type Logger as PinoBaseLogger, type DestinationStream, type LoggerOptions } from 'pino';\nimport { LoggerStore } from './store.js';\nimport {\n LOG_LEVELS,\n assertLogLevel,\n type LoggerConfig,\n type LoggerContext,\n type LevelOverride,\n type LogLevel,\n type LevelConfig,\n type CallerConfig,\n} from './types.js';\nimport { createStreams } from './streams.js';\nimport type { BaseHttpTransport } from './transports/base-http.js';\n\n// Custom levels for our logger\nconst CUSTOM_LEVELS = {\n http: 25,\n verbose: 25,\n silly: 10,\n} as const;\n\ntype CustomLevels = typeof CUSTOM_LEVELS;\ntype PinoLogger = PinoBaseLogger<keyof CustomLevels>;\n\nexport interface LoggerState<TContext extends LoggerContext> {\n pino: PinoLogger;\n store: LoggerStore<TContext>;\n defaultLevel: LogLevel;\n levelOverrides: Map<string, LevelOverride<TContext>>;\n // Index for O(1) context lookup\n contextIndex: Map<string, LevelOverride<TContext>>;\n // Complex rules that need full matching\n complexRules: LevelOverride<TContext>[];\n // Caller info config (undefined = disabled)\n callerConfig: CallerConfig | undefined;\n // HTTP transports for graceful shutdown\n transports: BaseHttpTransport[];\n}\n\nfunction parseLevelConfig(level: LevelConfig): { defaultLevel: LogLevel; rules: LevelOverride<LoggerContext>[] } {\n if (typeof level === 'string') {\n assertLogLevel(level);\n return { defaultLevel: level, rules: [] };\n }\n\n assertLogLevel(level.default);\n const rules: LevelOverride<LoggerContext>[] = (level.rules ?? []).map((rule) => {\n assertLogLevel(rule.level);\n return { match: rule.match, level: rule.level, readonly: true };\n });\n\n return { defaultLevel: level.default, rules };\n}\n\nfunction buildIndexes<TContext extends LoggerContext>(\n overrides: Map<string, LevelOverride<TContext>>,\n): { contextIndex: Map<string, LevelOverride<TContext>>; complexRules: LevelOverride<TContext>[] } {\n const contextIndex = new Map<string, LevelOverride<TContext>>();\n const complexRules: LevelOverride<TContext>[] = [];\n\n for (const override of overrides.values()) {\n const keys = Object.keys(override.match);\n // Simple rule: only has 'context' key\n if (keys.length === 1 && keys[0] === 'context' && typeof override.match.context === 'string') {\n contextIndex.set(override.match.context, override);\n } else {\n complexRules.push(override);\n }\n }\n\n return { contextIndex, complexRules };\n}\n\n/**\n * Produces a stable string key from a match object so that two calls with the\n * same fields in different declaration order hit the same entry in\n * `levelOverrides`. Without this, `setLevelOverride({a:1, b:2}, ...)` and\n * `setLevelOverride({b:2, a:1}, ...)` would create two distinct entries.\n */\nexport function canonicalMatchKey(match: Record<string, unknown>): string {\n const keys = Object.keys(match).sort();\n const sorted: Record<string, unknown> = {};\n for (const key of keys) {\n sorted[key] = match[key];\n }\n return JSON.stringify(sorted);\n}\n\nexport function createState<TContext extends LoggerContext>(\n config: LoggerConfig,\n store?: LoggerStore<TContext>,\n): LoggerState<TContext> {\n const { defaultLevel, rules } = parseLevelConfig(config.level);\n\n const loggerStore = store ?? new LoggerStore<TContext>();\n\n const levelOverrides = new Map<string, LevelOverride<TContext>>();\n for (const rule of rules) {\n const key = canonicalMatchKey(rule.match);\n levelOverrides.set(key, rule as LevelOverride<TContext>);\n }\n\n const { contextIndex, complexRules } = buildIndexes(levelOverrides);\n\n // Build a partially-populated state first so streams can read from it.\n // Fields populated after createStreams:\n // - pino (needs the multistream destination)\n // - transports (returned from createStreams)\n // We keep contextIndex as a stable Map reference so streams see override\n // mutations done via rebuildIndexes().\n const state: LoggerState<TContext> = {\n pino: null as unknown as PinoLogger,\n store: loggerStore,\n defaultLevel,\n levelOverrides,\n contextIndex,\n complexRules,\n callerConfig: undefined,\n transports: [],\n };\n\n const { destination, transports } = createStreams(config, state);\n state.transports = transports;\n\n const options: LoggerOptions<keyof CustomLevels> = {\n level: 'trace', // Accept all, we filter in shouldLog()\n customLevels: CUSTOM_LEVELS,\n base: { hostname: config.hostname ?? osHostname() },\n };\n\n state.pino = pino(options, destination) as PinoLogger;\n\n // Parse caller config\n if (config.caller === true) {\n state.callerConfig = {}; // Use defaults\n } else if (config.caller && typeof config.caller === 'object') {\n state.callerConfig = config.caller;\n }\n\n return state;\n}\n\nexport function rebuildIndexes<TContext extends LoggerContext>(state: LoggerState<TContext>): void {\n const { contextIndex, complexRules } = buildIndexes(state.levelOverrides);\n // Streams and log-level checks read `state.contextIndex` / `state.complexRules`\n // lazily through the state reference, so an atomic reassignment is enough.\n // In-place mutation would be O(n) per override change; reassignment is O(1)\n // and never leaves the indexes visibly partial between statements.\n state.contextIndex = contextIndex;\n state.complexRules = complexRules;\n}\n\nexport function shouldLog<TContext extends LoggerContext>(\n state: LoggerState<TContext>,\n level: LogLevel,\n context?: string,\n): boolean {\n const effectiveLevel = getEffectiveLevel(state, context);\n if (effectiveLevel === 'off') return false;\n return LOG_LEVELS[level] <= LOG_LEVELS[effectiveLevel];\n}\n\nfunction getEffectiveLevel<TContext extends LoggerContext>(\n state: LoggerState<TContext>,\n loggerContext?: string,\n): LogLevel {\n // O(1) lookup for simple context-only rules\n if (loggerContext) {\n const indexed = state.contextIndex.get(loggerContext);\n if (indexed) return indexed.level;\n }\n\n // Check complex rules O(k) where k << n\n const storeContext = state.store.getStore();\n for (const { match, level } of state.complexRules) {\n if (matchesContext(storeContext, loggerContext, match)) {\n return level;\n }\n }\n\n return state.defaultLevel;\n}\n\nexport function matchesContext(\n storeContext: LoggerContext | undefined,\n loggerContext: string | undefined,\n match: Record<string, unknown> & { context?: string },\n logMeta?: Record<string, unknown>,\n): boolean {\n const combined: Record<string, unknown> = { ...logMeta, ...storeContext, context: loggerContext };\n return Object.entries(match).every(([key, value]) => combined[key] === value);\n}\n\n/**\n * Returns the effective level from **runtime** overrides (setLevelOverride at\n * the API level), or `undefined` if no runtime override matches.\n *\n * Static `level.rules` from LoggerConfig are flagged `readonly: true` and are\n * deliberately excluded here — those represent baseline configuration and\n * should still be filterable by a transport's own `level`/`rules`. Only\n * dynamic, user-initiated overrides (e.g. from an HTTP debug endpoint) bypass\n * transport filters so targeted troubleshooting is guaranteed visible.\n */\nexport function getGlobalOverrideLevel<TContext extends LoggerContext>(\n state: LoggerState<TContext>,\n loggerContext: string | undefined,\n logMeta: Record<string, unknown>,\n): LogLevel | undefined {\n if (loggerContext) {\n const indexed = state.contextIndex.get(loggerContext);\n if (indexed && !indexed.readonly) return indexed.level;\n }\n const storeContext = state.store.getStore();\n for (const override of state.complexRules) {\n if (override.readonly) continue;\n if (matchesContext(storeContext, loggerContext, override.match, logMeta)) {\n return override.level;\n }\n }\n return undefined;\n}\n","import { z } from 'zod';\nimport type {\n LogLevel,\n LogFormat,\n LevelRule,\n ConsoleConfig,\n FileConfig,\n HttpTransportBaseConfig,\n DiscordConfig,\n TelegramConfig,\n CloudWatchConfig,\n ZohoCliqConfig,\n RelayConfig,\n LevelConfigObject,\n LevelConfig,\n LoggerConfig,\n CallerConfig,\n LogStreamPattern,\n LogStreamPatternConfig,\n LogStreamTemplateConfig,\n LogStreamName,\n AutoShutdownConfig,\n} from './types.js';\n\n// Log Level\nexport const LogLevelSchema: z.ZodType<LogLevel> = z.enum([\n 'off',\n 'error',\n 'warn',\n 'info',\n 'http',\n 'verbose',\n 'debug',\n 'silly',\n]);\n\n// Log Format\nexport const LogFormatSchema: z.ZodType<LogFormat> = z.enum(['json', 'plain', 'logfmt', 'simple']);\n\n// Level Rule\nexport const LevelRuleSchema: z.ZodType<LevelRule> = z.object({\n match: z.record(z.string(), z.unknown()),\n level: LogLevelSchema,\n});\n\n// Console Config\nexport const ConsoleConfigSchema: z.ZodType<ConsoleConfig> = z.object({\n format: LogFormatSchema,\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n});\n\n// File Config\nexport const FileConfigSchema: z.ZodType<FileConfig> = z.object({\n format: LogFormatSchema,\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n dirname: z.string().min(1, 'dirname is required'),\n filename: z.string().min(1, 'filename is required'),\n datePattern: z.string().optional(),\n interval: z.string().regex(/^\\d+[Mdhms]$/).optional(),\n zippedArchive: z.boolean().optional(),\n maxSize: z.string().optional(),\n maxFiles: z.string().optional(),\n});\n\n// HTTP Transport Base Config\nexport const HttpTransportBaseConfigSchema: z.ZodType<HttpTransportBaseConfig> = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n});\n\n// Discord Config\nexport const DiscordConfigSchema: z.ZodType<DiscordConfig> = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n webhookUrl: z.string().url('webhookUrl must be a valid URL'),\n format: z.enum(['embed', 'markdown']).optional(),\n username: z.string().optional(),\n avatarUrl: z.string().url().optional(),\n embedColors: z.record(z.string(), z.number().int()).optional(),\n includeTimestamp: z.boolean().optional(),\n includeMeta: z.boolean().optional(),\n maxEmbedFields: z.number().int().min(1).max(25).optional(),\n});\n\n// Telegram Config\nexport const TelegramConfigSchema: z.ZodType<TelegramConfig> = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n botToken: z.string().min(1, 'botToken is required'),\n chatId: z.union([z.string(), z.number()]),\n parseMode: z.enum(['Markdown', 'MarkdownV2', 'HTML']).optional(),\n disableNotification: z.boolean().optional(),\n threadId: z.number().int().optional(),\n replyToMessageId: z.number().int().optional(),\n});\n\n// Log Stream Name patterns and config\nexport const LogStreamPatternSchema: z.ZodType<LogStreamPattern> = z.enum([\n 'hostname',\n 'hostname-date',\n 'hostname-uuid',\n 'date',\n 'uuid',\n]);\n\nexport const LogStreamPatternConfigSchema: z.ZodType<LogStreamPatternConfig> = z.object({\n pattern: LogStreamPatternSchema,\n});\n\nexport const LogStreamTemplateConfigSchema: z.ZodType<LogStreamTemplateConfig> = z.object({\n template: z.string().min(1, 'template is required'),\n});\n\nexport const LogStreamNameSchema: z.ZodType<LogStreamName> = z.union([\n z.string().min(1, 'logStreamName string must not be empty'),\n LogStreamPatternConfigSchema,\n LogStreamTemplateConfigSchema,\n]);\n\n// CloudWatch Config\nexport const CloudWatchConfigSchema: z.ZodType<CloudWatchConfig> = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n logGroupName: z.string().min(1, 'logGroupName is required'),\n logStreamName: LogStreamNameSchema.optional(),\n region: z.string().min(1, 'region is required'),\n accessKeyId: z.string().min(1, 'accessKeyId is required'),\n secretAccessKey: z.string().min(1, 'secretAccessKey is required'),\n createLogGroup: z.boolean().optional(),\n createLogStream: z.boolean().optional(),\n});\n\n// Zoho Cliq Config\nconst ZohoCliqConfigBaseSchema = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n webhookUrl: z.string().url().optional(),\n companyId: z.string().min(1).optional(),\n channel: z.string().min(1).optional(),\n region: z.string().min(1).optional(),\n apiKey: z.string().min(1, 'apiKey is required'),\n broadcast: z.boolean().optional(),\n bot: z.object({\n name: z.string().min(1),\n image: z.string().url().optional(),\n }).optional(),\n includeTimestamp: z.boolean().optional(),\n includeMeta: z.boolean().optional(),\n});\n\nexport const ZohoCliqConfigSchema = ZohoCliqConfigBaseSchema.refine(\n (cfg) => Boolean(cfg.webhookUrl) || (Boolean(cfg.companyId) && Boolean(cfg.channel)),\n { message: 'Either webhookUrl or both companyId and channel must be provided' },\n) satisfies z.ZodType<ZohoCliqConfig>;\n\n// Relay Config\nexport const RelayConfigSchema: z.ZodType<RelayConfig> = z.object({\n apiUrl: z.string().url('apiUrl must be a valid URL'),\n token: z.string().min(1, 'token is required'),\n pollInterval: z.number().int().positive().optional(),\n bufferSize: z.number().int().positive().optional(),\n reconnectDelay: z.number().int().positive().optional(),\n maxReconnectDelay: z.number().int().positive().optional(),\n});\n\n// Level Config Object\nexport const LevelConfigObjectSchema: z.ZodType<LevelConfigObject> = z.object({\n default: LogLevelSchema,\n rules: z.array(LevelRuleSchema).optional(),\n});\n\n// Level Config (string or object)\nexport const LevelConfigSchema: z.ZodType<LevelConfig> = z.union([\n LogLevelSchema,\n LevelConfigObjectSchema,\n]);\n\n// Caller Config\nexport const CallerConfigSchema: z.ZodType<CallerConfig> = z.object({\n depth: z.number().int().nonnegative().optional(),\n fullPath: z.boolean().optional(),\n});\n\n// Auto Shutdown Config\nexport const AutoShutdownConfigSchema: z.ZodType<AutoShutdownConfig> = z.object({\n timeout: z.number().int().positive().optional(),\n signals: z.array(z.string()).optional() as z.ZodType<NodeJS.Signals[] | undefined>,\n});\n\n// Logger Config\nexport const LoggerConfigSchema = z.object({\n level: LevelConfigSchema,\n console: ConsoleConfigSchema,\n file: FileConfigSchema.optional(),\n discord: z.union([DiscordConfigSchema, z.array(DiscordConfigSchema)]).optional(),\n telegram: z.union([TelegramConfigSchema, z.array(TelegramConfigSchema)]).optional(),\n cloudwatch: z.union([CloudWatchConfigSchema, z.array(CloudWatchConfigSchema)]).optional(),\n zohoCliq: z.union([ZohoCliqConfigSchema, z.array(ZohoCliqConfigSchema)]).optional(),\n relay: RelayConfigSchema.optional(),\n caller: z.union([z.boolean(), CallerConfigSchema]).optional(),\n hostname: z.string().optional(),\n autoShutdown: z.union([z.boolean(), AutoShutdownConfigSchema]).optional(),\n}) satisfies z.ZodType<LoggerConfig>;\n\n// Validation function\nexport function validateConfig(config: unknown): z.infer<typeof LoggerConfigSchema> {\n return LoggerConfigSchema.parse(config);\n}\n\n// Safe validation (returns result instead of throwing)\nexport function safeValidateConfig(config: unknown) {\n return LoggerConfigSchema.safeParse(config);\n}\n","import type { CallerConfig, CallerInfo } from '../types.js';\nimport { basename, relative } from 'node:path';\n\n// Default stack depth offset:\n// 0: Error\n// 1: getCallerInfo\n// 2: log method (private)\n// 3: public method (info, error, etc.)\n// 4: actual caller\nconst BASE_STACK_OFFSET = 4;\n\n// Regex to parse V8 stack trace lines\n// Matches: \" at functionName (file:line:column)\" or \" at file:line:column\"\nconst STACK_LINE_REGEX = /^\\s*at\\s+(?:(.+?)\\s+\\()?(.+):(\\d+):(\\d+)\\)?$/;\n\nexport function getCallerInfo(config: CallerConfig, additionalOffset = 0): CallerInfo | undefined {\n const depth = config.depth ?? 0;\n const targetFrame = BASE_STACK_OFFSET + depth + additionalOffset;\n\n const originalPrepare = Error.prepareStackTrace;\n const originalLimit = Error.stackTraceLimit;\n\n try {\n // Capture more frames than we need\n Error.stackTraceLimit = targetFrame + 5;\n\n const err = new Error();\n const stack = err.stack;\n\n if (!stack) {\n return undefined;\n }\n\n const lines = stack.split('\\n');\n const targetLine = lines[targetFrame];\n\n if (!targetLine) {\n return undefined;\n }\n\n const match = targetLine.match(STACK_LINE_REGEX);\n if (!match) {\n return undefined;\n }\n\n const [, fnName, filePath, lineStr, colStr] = match;\n const line = parseInt(lineStr, 10);\n const column = parseInt(colStr, 10);\n\n // Process file path\n let file = filePath;\n\n // Handle file:// URLs (ESM)\n if (file.startsWith('file://')) {\n file = file.slice(7);\n }\n\n // Shorten path if fullPath is not enabled\n if (!config.fullPath) {\n // Try relative path first, fall back to basename\n try {\n const relativePath = relative(process.cwd(), file);\n // If relative path goes up too many directories, use basename\n if (relativePath.startsWith('..') && relativePath.split('/').filter(p => p === '..').length > 2) {\n file = basename(file);\n } else {\n file = relativePath;\n }\n } catch {\n file = basename(file);\n }\n }\n\n return {\n file,\n line,\n column: isNaN(column) ? undefined : column,\n function: fnName && fnName !== '<anonymous>' ? fnName : undefined,\n };\n } finally {\n Error.prepareStackTrace = originalPrepare;\n Error.stackTraceLimit = originalLimit;\n }\n}\n\nexport function formatCallerInfo(info: CallerInfo): string {\n const location = `${info.file}:${info.line}`;\n if (info.function) {\n return `${info.function} (${location})`;\n }\n return location;\n}\n","import type { Logger } from '../logger.js';\nimport type { LoggerContext } from '../types.js';\n\nexport interface GracefulShutdownOptions {\n /** Timeout in ms before forcing exit (default: 5000) */\n timeout?: number;\n /** Exit code on successful shutdown (default: 0) */\n exitCode?: number;\n /** Custom signals to handle (default: ['SIGTERM', 'SIGINT']) */\n signals?: NodeJS.Signals[];\n /** Called before shutdown starts */\n onShutdown?: () => void | Promise<void>;\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<GracefulShutdownOptions, 'onShutdown'>> = {\n timeout: 5000,\n exitCode: 0,\n signals: ['SIGTERM', 'SIGINT'],\n};\n\nlet registered = false;\n\n/**\n * Register graceful shutdown handlers for the logger.\n * Ensures all buffered logs are flushed before process exit.\n *\n * @example\n * ```typescript\n * const logger = Logger.create(config);\n * registerShutdown(logger);\n *\n * // Or with options:\n * registerShutdown(logger, {\n * timeout: 10000,\n * onShutdown: () => console.log('Shutting down...'),\n * });\n * ```\n */\nexport function registerShutdown<TContext extends LoggerContext>(\n logger: Logger<TContext>,\n options: GracefulShutdownOptions = {},\n): () => Promise<void> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const shutdown = async (signal?: string): Promise<void> => {\n if (signal) {\n console.error(`[Logger] Received ${signal}, shutting down gracefully...`);\n }\n\n try {\n // Call user's onShutdown hook\n if (opts.onShutdown) {\n await opts.onShutdown();\n }\n\n // Create a timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Shutdown timed out after ${opts.timeout}ms`));\n }, opts.timeout);\n });\n\n // Race between shutdown and timeout\n await Promise.race([\n logger.shutdown(),\n timeoutPromise,\n ]);\n\n if (signal) {\n console.error('[Logger] Graceful shutdown completed');\n process.exit(opts.exitCode);\n }\n } catch (error) {\n console.error('[Logger] Shutdown error:', error instanceof Error ? error.message : error);\n if (signal) {\n process.exit(1);\n }\n }\n };\n\n // Only register handlers once\n if (!registered) {\n for (const signal of opts.signals) {\n process.on(signal, () => void shutdown(signal));\n }\n\n // Also handle uncaught exceptions and unhandled rejections\n process.on('beforeExit', () => void shutdown());\n\n registered = true;\n }\n\n // Return manual shutdown function\n return shutdown;\n}\n","import type { AxiosError } from 'axios';\n\n/**\n * HTTP error data extracted from axios/fetch errors\n */\nexport interface HttpErrorData {\n /** HTTP status code (e.g., 400, 500) */\n status?: number;\n /** HTTP status text (e.g., \"Bad Request\") */\n statusText?: string;\n /** Response body data */\n responseData?: unknown;\n /** Request URL */\n url?: string;\n /** HTTP method (GET, POST, etc.) */\n method?: string;\n /** Error code (e.g., ECONNREFUSED, ETIMEDOUT) */\n code?: string;\n}\n\n/**\n * Serialized error data for logging\n */\nexport interface SerializedError {\n /** Error message */\n errorMessage: string;\n /** Stack trace */\n stack?: string;\n /** HTTP-specific data if present */\n http?: HttpErrorData;\n /** Error code for non-HTTP errors */\n code?: string;\n /** Error name/type */\n errorName?: string;\n}\n\n/**\n * Type guard for axios errors\n */\nfunction isAxiosError(error: unknown): error is AxiosError {\n return (\n error !== null &&\n typeof error === 'object' &&\n 'isAxiosError' in error &&\n (error as AxiosError).isAxiosError === true\n );\n}\n\n/**\n * Sanitizes response data to ensure it's safe for JSON serialization.\n * Truncates large strings and limits array/object sizes.\n */\nfunction sanitizeResponseData(data: unknown, maxStringLength = 10000): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (typeof data === 'string') {\n return data.length > maxStringLength ? `${data.slice(0, maxStringLength)}...[truncated]` : data;\n }\n\n if (typeof data === 'number' || typeof data === 'boolean') {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.slice(0, 100).map((item) => sanitizeResponseData(item, maxStringLength));\n }\n\n if (typeof data === 'object') {\n const result: Record<string, unknown> = {};\n const entries = Object.entries(data as Record<string, unknown>);\n for (const [key, value] of entries.slice(0, 50)) {\n result[key] = sanitizeResponseData(value, maxStringLength);\n }\n return result;\n }\n\n return String(data);\n}\n\n/**\n * Extracts HTTP data from axios error\n */\nfunction extractAxiosHttpData(error: AxiosError): HttpErrorData {\n const httpData: HttpErrorData = {};\n\n if (error.code) {\n httpData.code = error.code;\n }\n\n if (error.response) {\n httpData.status = error.response.status;\n httpData.statusText = error.response.statusText;\n if (error.response.data !== undefined) {\n httpData.responseData = sanitizeResponseData(error.response.data);\n }\n }\n\n if (error.config) {\n const { url, baseURL, method } = error.config;\n if (url) {\n httpData.url = baseURL && !url.startsWith('http') ? `${baseURL}${url}` : url;\n }\n if (method) {\n httpData.method = method.toUpperCase();\n }\n }\n\n return httpData;\n}\n\n/**\n * Extracts HTTP data from generic error object (fetch-style or custom)\n */\nfunction extractGenericHttpData(error: Record<string, unknown>): HttpErrorData | undefined {\n const httpData: HttpErrorData = {};\n let hasData = false;\n\n if (typeof error.code === 'string') {\n httpData.code = error.code;\n hasData = true;\n }\n\n const response = error.response as Record<string, unknown> | undefined;\n if (response && typeof response === 'object') {\n if (typeof response.status === 'number') {\n httpData.status = response.status;\n hasData = true;\n }\n if (typeof response.statusText === 'string') {\n httpData.statusText = response.statusText;\n hasData = true;\n }\n if (response.data !== undefined) {\n httpData.responseData = sanitizeResponseData(response.data);\n hasData = true;\n }\n }\n\n const config = error.config as Record<string, unknown> | undefined;\n if (config && typeof config === 'object') {\n const url = config.url as string | undefined;\n const baseURL = config.baseURL as string | undefined;\n if (typeof url === 'string') {\n httpData.url = baseURL && !url.startsWith('http') ? `${baseURL}${url}` : url;\n hasData = true;\n }\n if (typeof config.method === 'string') {\n httpData.method = config.method.toUpperCase();\n hasData = true;\n }\n }\n\n return hasData ? httpData : undefined;\n}\n\n/**\n * Serializes an Error object for logging, extracting HTTP-specific data\n * from axios/fetch errors while preserving standard error properties.\n *\n * @example\n * // Axios error\n * try {\n * await axios.get('/api/data');\n * } catch (error) {\n * const serialized = serializeError(error);\n * // serialized.http.status = 400\n * // serialized.http.responseData = { error: \"invalid input\" }\n * }\n */\nexport function serializeError(error: unknown): SerializedError {\n if (!(error instanceof Error)) {\n if (error === null || error === undefined) {\n return { errorMessage: 'Unknown error' };\n }\n if (typeof error === 'string') {\n return { errorMessage: error };\n }\n const httpData = typeof error === 'object' ? extractGenericHttpData(error as Record<string, unknown>) : undefined;\n return {\n errorMessage: String(error),\n http: httpData,\n };\n }\n\n const serialized: SerializedError = {\n errorMessage: error.message,\n stack: error.stack,\n };\n\n if (error.name && error.name !== 'Error') {\n serialized.errorName = error.name;\n }\n\n // Handle axios errors with full type safety\n if (isAxiosError(error)) {\n serialized.http = extractAxiosHttpData(error);\n return serialized;\n }\n\n // Handle generic errors with HTTP-like properties\n const errWithCode = error as Error & { code?: string };\n if (typeof errWithCode.code === 'string') {\n serialized.code = errWithCode.code;\n }\n\n const httpData = extractGenericHttpData(error as unknown as Record<string, unknown>);\n if (httpData) {\n serialized.http = httpData;\n }\n\n return serialized;\n}\n","import { LoggerStore } from './store.js';\nimport {\n canonicalMatchKey,\n createState,\n getGlobalOverrideLevel,\n shouldLog,\n rebuildIndexes,\n type LoggerState,\n} from './state.js';\nimport { validateConfig } from './schema.js';\nimport { assertLogLevel, type LoggerConfig, type LoggerContext, type LevelOverride, type LevelOverrideMatch, type LogLevel, type Meta } from './types.js';\nimport { getCallerInfo, formatCallerInfo } from './utils/caller.js';\nimport { registerShutdown } from './utils/shutdown.js';\nimport { serializeError } from './utils/error.js';\n\nexport class Logger<TContext extends LoggerContext = LoggerContext> {\n // Lazy: `.for()` creates many child loggers (hot path), most never call\n // `profile()`. Allocating a fresh Map per child wastes ~200 bytes each and\n // caused OOM in benchmarks creating millions of children.\n private profileTimers?: Map<string, number>;\n\n private constructor(\n private state: LoggerState<TContext>,\n private context: string,\n ) {}\n\n static create<TContext extends LoggerContext = LoggerContext>(\n config: LoggerConfig,\n store?: LoggerStore<TContext>,\n ): Logger<TContext> {\n const validatedConfig = validateConfig(config);\n const state = createState(validatedConfig as LoggerConfig, store);\n const logger = new Logger<TContext>(state, 'APP');\n\n // Auto-register shutdown handlers if configured\n if (validatedConfig.autoShutdown) {\n const shutdownConfig = typeof validatedConfig.autoShutdown === 'object'\n ? validatedConfig.autoShutdown\n : {};\n registerShutdown(logger, shutdownConfig);\n }\n\n return logger;\n }\n\n for(context: string): Logger<TContext> {\n return new Logger(this.state, context);\n }\n\n // State accessors\n\n getStore(): LoggerStore<TContext> {\n return this.state.store;\n }\n\n setLevelOverride(match: LevelOverrideMatch<TContext>, level: LogLevel): void {\n assertLogLevel(level);\n const key = canonicalMatchKey(match);\n this.state.levelOverrides.set(key, { match, level });\n rebuildIndexes(this.state);\n }\n\n removeLevelOverride(match: LevelOverrideMatch<TContext>): boolean {\n const key = canonicalMatchKey(match);\n const override = this.state.levelOverrides.get(key);\n if (override?.readonly) {\n return false;\n }\n const deleted = this.state.levelOverrides.delete(key);\n if (deleted) {\n rebuildIndexes(this.state);\n }\n return deleted;\n }\n\n clearLevelOverrides(): void {\n let changed = false;\n for (const [key, override] of this.state.levelOverrides) {\n if (!override.readonly) {\n this.state.levelOverrides.delete(key);\n changed = true;\n }\n }\n if (changed) {\n rebuildIndexes(this.state);\n }\n }\n\n getLevelOverrides(): LevelOverride<TContext>[] {\n return Array.from(this.state.levelOverrides.values());\n }\n\n // Shutdown\n\n /**\n * Gracefully shutdown the logger, flushing all pending messages.\n * Should be called before process exit to ensure no logs are lost.\n *\n * `timeoutMs` is forwarded to each transport's `close()` as a per-transport\n * cap; it prevents a dead transport from blocking the whole shutdown.\n * Default: 5000ms. Pass `Infinity` for legacy unbounded behaviour.\n */\n async shutdown(timeoutMs = 5000): Promise<void> {\n const closePromises = this.state.transports.map((transport) => transport.close(timeoutMs));\n await Promise.all(closePromises);\n }\n\n // Profiling\n\n profile(id: string, meta?: object): void {\n const timers = (this.profileTimers ??= new Map<string, number>());\n const existing = timers.get(id);\n if (existing) {\n const duration = Date.now() - existing;\n timers.delete(id);\n this.info(`${id} completed`, { ...meta, durationMs: duration });\n } else {\n timers.set(id, Date.now());\n }\n }\n\n // Logging methods\n\n /**\n * Log an error. Supported shapes:\n * error(message: string)\n * error(message: string, meta)\n * error(error: Error | unknown)\n * error(error: Error | unknown, message: string)\n * error(error: Error | unknown, meta)\n * error(error: Error | unknown, message: string, meta)\n *\n * The first argument is treated as an error value whenever it is not a string.\n * Non-Error values (plain objects, numbers, etc. — e.g. anything caught by\n * TypeScript's `catch (err)` clause, which is typed as `unknown`) are passed\n * through `serializeError` so they produce a sensible `errorMessage` and, when\n * possible, a `stack` / HTTP diagnostic payload.\n */\n error(errorOrMessage: Error | string | unknown, messageOrMeta?: string | Meta, meta?: Meta): void {\n if (!shouldLog(this.state, 'error', this.context)) return;\n\n if (typeof errorOrMessage === 'string') {\n // error(message), error(message, meta)\n this.log('error', errorOrMessage, messageOrMeta as Meta | undefined);\n return;\n }\n\n // Everything else (Error, plain objects, primitives, null, undefined) is\n // treated as an error value. `serializeError` handles the normalization.\n const errorValue = errorOrMessage;\n if (typeof messageOrMeta === 'string') {\n // (errorValue, message, meta?)\n this.log('error', messageOrMeta, meta, errorValue);\n } else {\n // (errorValue) or (errorValue, meta)\n // Fall back to the serialized message as the log line.\n const fallbackMessage =\n errorValue instanceof Error\n ? errorValue.message\n : serializeError(errorValue).errorMessage;\n this.log('error', fallbackMessage, messageOrMeta, errorValue);\n }\n }\n\n warn(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'warn', this.context)) return;\n this.log('warn', message, meta);\n }\n\n info(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'info', this.context)) return;\n this.log('info', message, meta);\n }\n\n http(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'http', this.context)) return;\n this.log('http', message, meta);\n }\n\n verbose(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'verbose', this.context)) return;\n this.log('verbose', message, meta);\n }\n\n debug(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'debug', this.context)) return;\n this.log('debug', message, meta);\n }\n\n silly(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'silly', this.context)) return;\n this.log('silly', message, meta);\n }\n\n // Private\n\n private log(level: LogLevel, message: string, meta?: Meta, error?: Error | unknown, callerOffset = 0): void {\n const resolved = typeof meta === 'function' ? meta() : meta;\n const logMeta: Record<string, unknown> = { context: this.context, ...resolved };\n\n // Add store context\n const storeContext = this.state.store.getStore();\n if (storeContext) {\n Object.assign(logMeta, storeContext);\n }\n\n // M2: we already matched this log against runtime overrides at the logger\n // gate (shouldLog). Compute the matching override level once here and\n // embed it so downstream transports can honour it without re-running the\n // full matcher. Stripped before the log line hits the wire (see streams.ts).\n const overrideLevel = getGlobalOverrideLevel(this.state, this.context, logMeta);\n if (overrideLevel !== undefined) {\n logMeta.__or = overrideLevel;\n }\n\n // Add caller info if enabled\n if (this.state.callerConfig) {\n const callerInfo = getCallerInfo(this.state.callerConfig, callerOffset);\n if (callerInfo) {\n logMeta.caller = formatCallerInfo(callerInfo);\n }\n }\n\n if (error !== undefined) {\n const serialized = serializeError(error);\n logMeta.errorMessage = serialized.errorMessage;\n logMeta.stack = serialized.stack;\n if (serialized.errorName) {\n logMeta.errorName = serialized.errorName;\n }\n if (serialized.code) {\n logMeta.errorCode = serialized.code;\n }\n if (serialized.http) {\n logMeta.http = serialized.http;\n }\n }\n\n // Use pino's logging - it will handle the streams\n const pinoMethod = this.getPinoMethod(level);\n pinoMethod.call(this.state.pino, logMeta, message);\n }\n\n private getPinoMethod(level: LogLevel): (obj: object, msg: string) => void {\n switch (level) {\n case 'error':\n return this.state.pino.error.bind(this.state.pino);\n case 'warn':\n return this.state.pino.warn.bind(this.state.pino);\n case 'info':\n return this.state.pino.info.bind(this.state.pino);\n case 'http':\n case 'verbose':\n // Use info level for http/verbose as they map to 25\n return (obj: object, msg: string) => {\n (this.state.pino as any)[level](obj, msg);\n };\n case 'debug':\n return this.state.pino.debug.bind(this.state.pino);\n case 'silly':\n return (obj: object, msg: string) => {\n (this.state.pino as any).silly(obj, msg);\n };\n default:\n return this.state.pino.info.bind(this.state.pino);\n }\n }\n}\n","import { Logger } from './logger.js';\nimport { LoggerStore } from './store.js';\nimport type { LoggerConfig, LoggerContext, LevelOverride, LogLevel } from './types.js';\n\nexport interface SingletonLogger<TContext extends LoggerContext> {\n init(config: LoggerConfig, store?: LoggerStore<TContext>): Logger<TContext>;\n get(): Logger<TContext>;\n for(context: string): Logger<TContext>;\n getStore(): LoggerStore<TContext>;\n setLevelOverride(match: Partial<TContext>, level: LogLevel): void;\n removeLevelOverride(match: Partial<TContext>): void;\n getLevelOverrides(): LevelOverride<TContext>[];\n clearLevelOverrides(): void;\n}\n\nexport function createSingletonLogger<\n TContext extends LoggerContext = LoggerContext,\n>(): SingletonLogger<TContext> {\n let root: Logger<TContext> | null = null;\n\n const ensureInit = (): Logger<TContext> => {\n if (!root) {\n throw new Error('Logger not initialized. Call init(config) first.');\n }\n return root;\n };\n\n return {\n init(config: LoggerConfig, store?: LoggerStore<TContext>): Logger<TContext> {\n if (!root) {\n root = Logger.create(config, store);\n }\n return root;\n },\n\n get(): Logger<TContext> {\n return ensureInit();\n },\n\n for(context: string): Logger<TContext> {\n return ensureInit().for(context);\n },\n\n getStore(): LoggerStore<TContext> {\n return ensureInit().getStore();\n },\n\n setLevelOverride(match: Partial<TContext>, level: LogLevel): void {\n ensureInit().setLevelOverride(match, level);\n },\n\n removeLevelOverride(match: Partial<TContext>): void {\n ensureInit().removeLevelOverride(match);\n },\n\n getLevelOverrides(): LevelOverride<TContext>[] {\n return ensureInit().getLevelOverrides();\n },\n\n clearLevelOverrides(): void {\n ensureInit().clearLevelOverrides();\n },\n };\n}\n","export interface TimingResult {\n label: string;\n durationMs: number;\n durationFormatted: string;\n}\n\nexport interface Timer {\n end: () => TimingResult;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms.toFixed(2)}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(1);\n return `${minutes}m ${seconds}s`;\n}\n\nexport function createTimer(label: string): Timer {\n const start = performance.now();\n\n return {\n end(): TimingResult {\n const durationMs = performance.now() - start;\n return {\n label,\n durationMs,\n durationFormatted: formatDuration(durationMs),\n };\n },\n };\n}\n\nexport async function measureAsync<T>(\n label: string,\n fn: () => Promise<T>,\n): Promise<{ result: T; timing: TimingResult }> {\n const timer = createTimer(label);\n const result = await fn();\n const timing = timer.end();\n return { result, timing };\n}\n\nexport function measureSync<T>(\n label: string,\n fn: () => T,\n): { result: T; timing: TimingResult } {\n const timer = createTimer(label);\n const result = fn();\n const timing = timer.end();\n return { result, timing };\n}\n","import { randomUUID } from 'crypto';\n\nexport interface RequestIdOptions {\n prefix?: string;\n short?: boolean;\n}\n\nexport function generateRequestId(options: RequestIdOptions = {}): string {\n const { prefix, short = false } = options;\n const uuid = randomUUID();\n const id = short ? uuid.split('-')[0] : uuid;\n return prefix ? `${prefix}-${id}` : id;\n}\n\nexport function extractRequestId(headers: Record<string, string | string[] | undefined>): string | undefined {\n const headerNames = ['x-request-id', 'x-correlation-id', 'x-trace-id'];\n\n for (const name of headerNames) {\n const value = headers[name];\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n if (Array.isArray(value) && value.length > 0) {\n return value[0];\n }\n }\n\n return undefined;\n}\n\nexport function getOrGenerateRequestId(\n headers: Record<string, string | string[] | undefined>,\n options: RequestIdOptions = {},\n): string {\n return extractRequestId(headers) ?? generateRequestId(options);\n}\n","const DEFAULT_SECRET_PATTERNS = [\n 'password',\n 'secret',\n 'token',\n 'apikey',\n 'api_key',\n 'api-key',\n 'auth',\n 'credential',\n 'private',\n];\n\nconst DEFAULT_MASK = '***';\n\nexport interface MaskSecretsOptions {\n patterns?: string[];\n mask?: string;\n deep?: boolean;\n}\n\nfunction isSecretKey(key: string, patterns: string[]): boolean {\n const lowerKey = key.toLowerCase();\n return patterns.some((pattern) => lowerKey.includes(pattern.toLowerCase()));\n}\n\nfunction maskUrlCredentials(url: string, mask: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.password) {\n parsed.password = mask;\n }\n if (parsed.username && parsed.password) {\n parsed.username = mask;\n }\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nexport function maskSecrets(\n obj: unknown,\n options: MaskSecretsOptions = {},\n): unknown {\n const { patterns = DEFAULT_SECRET_PATTERNS, mask = DEFAULT_MASK, deep = true } = options;\n\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (typeof obj === 'string') {\n if (obj.startsWith('http://') || obj.startsWith('https://')) {\n return maskUrlCredentials(obj, mask);\n }\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return deep ? obj.map((item) => maskSecrets(item, options)) : obj;\n }\n\n if (typeof obj === 'object') {\n const result: Record<string | symbol, unknown> = {};\n\n // Copy Symbol properties first (important for Winston's internal symbols)\n for (const sym of Object.getOwnPropertySymbols(obj)) {\n result[sym] = (obj as Record<symbol, unknown>)[sym];\n }\n\n // Process string keys\n for (const [key, value] of Object.entries(obj)) {\n if (isSecretKey(key, patterns)) {\n result[key] = mask;\n } else if (deep && typeof value === 'object' && value !== null) {\n result[key] = maskSecrets(value, options);\n } else if (typeof value === 'string') {\n result[key] = maskSecrets(value, options);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n }\n\n return obj;\n}\n\nexport function createMasker(options: MaskSecretsOptions = {}) {\n return (obj: unknown): unknown => maskSecrets(obj, options);\n}\n","import { inspect } from 'util';\nimport { LOG_LEVELS, type LogFormat, type LoggerContext, type LogLevel, type LevelRule } from './types.js';\n\nconst DEFAULT_CONTEXT = 'APP';\n\nconst LEVEL_COLORS: Record<string, string> = {\n error: '\\x1b[31m', // red\n warn: '\\x1b[33m', // yellow\n info: '\\x1b[32m', // green\n http: '\\x1b[35m', // magenta\n verbose: '\\x1b[36m', // cyan\n debug: '\\x1b[34m', // blue\n silly: '\\x1b[90m', // grey\n};\nconst RESET = '\\x1b[0m';\n\nexport function colorizeLevel(level: string): string {\n const color = LEVEL_COLORS[level] || '';\n return color ? `${color}${level}${RESET}` : level;\n}\n\nexport function formatMeta(meta: Record<string, unknown>, colors: boolean): string {\n return Object.entries(meta)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n if (typeof value === 'object') {\n const inspected = inspect(value, { depth: 4, colors, compact: false });\n return `\\n ${key}: ${inspected.split('\\n').join('\\n ')}`;\n }\n return `\\n ${key}: ${value}`;\n })\n .join('');\n}\n\nconst MAX_FLATTEN_DEPTH = 10;\nconst CIRCULAR_REF = '[Circular]';\n\nexport function flattenObject(\n obj: Record<string, unknown>,\n prefix = '',\n ancestors: WeakSet<object> = new WeakSet(),\n depth = 0,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Protect against too deep nesting\n if (depth > MAX_FLATTEN_DEPTH) {\n result[prefix || 'value'] = '[Max depth exceeded]';\n return result;\n }\n\n // Add current object to ancestors (current path in recursion)\n ancestors.add(obj);\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Error)) {\n // Check for circular reference (only in current path)\n if (ancestors.has(value as object)) {\n result[newKey] = CIRCULAR_REF;\n } else {\n Object.assign(result, flattenObject(value as Record<string, unknown>, newKey, ancestors, depth + 1));\n }\n } else {\n result[newKey] = value;\n }\n }\n\n // Remove from ancestors when leaving this level (allow reuse in sibling branches)\n ancestors.delete(obj);\n\n return result;\n}\n\nexport function formatLogfmtValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (typeof value === 'string') {\n if (value.includes(' ') || value.includes('\"') || value.includes('=')) {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (value instanceof Error) {\n return `\"${value.message.replace(/\"/g, '\\\\\"')}\"`;\n }\n\n if (Array.isArray(value)) {\n return `\"${JSON.stringify(value).replace(/\"/g, '\\\\\"')}\"`;\n }\n\n return `\"${JSON.stringify(value).replace(/\"/g, '\\\\\"')}\"`;\n}\n\nexport function formatLogfmt(data: Record<string, unknown>): string {\n const flattened = flattenObject(data);\n\n return Object.entries(flattened)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=${formatLogfmtValue(value)}`)\n .join(' ');\n}\n"]}
1
+ {"version":3,"sources":["../src/store.ts","../src/types.ts","../src/transports/buffer.ts","../src/transports/base-http.ts","../src/transports/discord.ts","../src/transports/telegram.ts","../src/transports/zoho-cliq.ts","../src/transports/cloudwatch.ts","../src/streams.ts","../src/utils/mask-secrets.ts","../src/state.ts","../src/schema.ts","../src/utils/caller.ts","../src/utils/shutdown.ts","../src/utils/error.ts","../src/logger.ts","../src/singleton.ts","../src/utils/timing.ts","../src/utils/request-id.ts","../src/formatters.ts"],"names":["LEVEL_EMOJI","DEFAULT_REQUEST_TIMEOUT_MS","hostname","osHostname","pino","getGlobalOverrideLevel","DEFAULT_OPTIONS","httpData","randomUUID"],"mappings":"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","file":"index.mjs","sourcesContent":["import { AsyncLocalStorage } from 'async_hooks';\nimport type { LoggerContext } from './types.js';\n\nexport class LoggerStore<TContext extends LoggerContext = LoggerContext> {\n private storage = new AsyncLocalStorage<TContext>();\n\n getStore(): TContext | undefined {\n return this.storage.getStore();\n }\n\n run<T>(context: TContext, fn: () => T): T {\n return this.storage.run(context, fn);\n }\n}\n","export const LOG_LEVELS = {\n off: -1,\n error: 0,\n warn: 1,\n info: 2,\n http: 3,\n verbose: 4,\n debug: 5,\n silly: 6,\n} as const;\n\nexport type LogLevel = keyof typeof LOG_LEVELS;\n\nexport function isValidLogLevel(level: string): level is LogLevel {\n return level in LOG_LEVELS;\n}\n\nexport function assertLogLevel(level: string): asserts level is LogLevel {\n if (!isValidLogLevel(level)) {\n throw new Error(`Invalid log level: \"${level}\". Valid levels: ${Object.keys(LOG_LEVELS).join(', ')}`);\n }\n}\n\nexport type LogFormat = 'json' | 'plain' | 'logfmt' | 'simple';\n\nexport interface LevelRule {\n match: Record<string, unknown> & { context?: string };\n level: LogLevel;\n}\n\n/**\n * Controls whether a transport respects runtime level overrides registered via\n * `setLevelOverride(...)` (or the top-level `level.rules` in the logger config).\n *\n * When `true` (the default for observability transports — console/file/cloudwatch/relay):\n * a matching override bypasses the transport's own `level`/`rules` so that\n * targeted troubleshooting actually surfaces logs in the viewing channels.\n *\n * When `false` (the default for alert-style transports — discord/telegram/zohoCliq):\n * the transport filters strictly by its own `level`/`rules` and ignores runtime\n * overrides, which prevents ad-hoc debug overrides from flooding user-facing\n * notification channels.\n *\n * Every transport config accepts this flag; the only time it needs to be set\n * explicitly is when overriding the default for the transport kind.\n */\nexport type RespectRuntimeOverrides = boolean;\n\nexport interface ConsoleConfig {\n format: LogFormat;\n level?: LogLevel;\n rules?: LevelRule[];\n respectRuntimeOverrides?: RespectRuntimeOverrides;\n}\n\nexport interface FileConfig {\n format: LogFormat;\n level?: LogLevel;\n rules?: LevelRule[];\n respectRuntimeOverrides?: RespectRuntimeOverrides;\n dirname: string;\n filename: string;\n datePattern?: string;\n interval?: string;\n zippedArchive?: boolean;\n maxSize?: string;\n maxFiles?: string;\n}\n\n// HTTP Transport base config\nexport interface HttpTransportBaseConfig {\n level?: LogLevel;\n rules?: LevelRule[];\n respectRuntimeOverrides?: RespectRuntimeOverrides;\n batchSize?: number;\n flushInterval?: number;\n maxRetries?: number;\n retryDelay?: number;\n /**\n * Maximum number of messages the in-memory queue will hold before dropping.\n * Provides a hard upper bound on memory usage when a transport is degraded\n * or offline — without this, a failing transport + steady log volume grows\n * the queue until OOM. Default: unbounded.\n *\n * Recommended for production: `10_000` — enough to absorb transient blips,\n * small enough to avoid runaway memory.\n */\n maxQueueSize?: number;\n /**\n * Policy applied when the queue is full.\n * - `'drop-oldest'` (default): prefers keeping recent events — during an\n * outage old logs are usually stale.\n * - `'drop-newest'`: prefers preserving historical context — useful if you\n * care more about the events leading up to the outage than the noise\n * happening during it.\n */\n dropPolicy?: 'drop-oldest' | 'drop-newest';\n /**\n * Called when messages are dropped due to queue overflow. Receives only the\n * messages that were discarded. If not provided, drops are silent.\n *\n * Callback MUST NOT throw; if it does, the exception is swallowed.\n */\n onDrop?: (droppedMessages: unknown[]) => void;\n /**\n * Called when a batch fails after all retries and messages are dropped.\n * If not provided, the error is logged to stderr.\n *\n * The callback MUST NOT throw; if it does, the failure is swallowed and a\n * stderr fallback is used. This is intentional — a logger must never\n * propagate its own transport errors back into the host application.\n */\n onError?: (error: Error, droppedMessages: unknown[]) => void;\n /**\n * Timeout in milliseconds for a single outbound HTTP request. Default:\n * `10_000`. Applies to Discord/Telegram `fetch`. CloudWatch uses the AWS\n * SDK's own timeout configuration.\n */\n requestTimeout?: number;\n}\n\n// Discord Transport\nexport interface DiscordConfig extends HttpTransportBaseConfig {\n webhookUrl: string;\n format?: 'embed' | 'markdown'; // default: 'embed'\n username?: string;\n avatarUrl?: string;\n embedColors?: Partial<Record<LogLevel, number>>;\n includeTimestamp?: boolean;\n includeMeta?: boolean;\n maxEmbedFields?: number;\n}\n\n// Telegram Transport\nexport interface TelegramConfig extends HttpTransportBaseConfig {\n botToken: string;\n chatId: string | number;\n parseMode?: 'Markdown' | 'MarkdownV2' | 'HTML';\n disableNotification?: boolean;\n threadId?: number;\n replyToMessageId?: number;\n}\n\n// Zoho Cliq Transport\nexport interface ZohoCliqBotConfig {\n /** Bot display name (shown in the channel). */\n name: string;\n /** Optional bot avatar URL. */\n image?: string;\n}\n\nexport interface ZohoCliqConfig extends HttpTransportBaseConfig {\n /**\n * Incoming webhook URL. If provided, `companyId`/`channel`/`region` are\n * ignored and this URL is used as-is (with `zapikey` appended as query).\n */\n webhookUrl?: string;\n /** Zoho Cliq company/org ID. Required unless `webhookUrl` is set. */\n companyId?: string;\n /** Target channel name (the `channelsbyname` API segment). Required unless `webhookUrl` is set. */\n channel?: string;\n /** Zoho region/TLD: 'eu' | 'com' | 'in' | etc. Default: 'eu'. */\n region?: string;\n /** Zoho API key (zapikey). Required. */\n apiKey: string;\n /** If true (default), message is posted as a broadcast so all members are notified. */\n broadcast?: boolean;\n /** Post as a custom bot instead of the default user. */\n bot?: ZohoCliqBotConfig;\n /** Include ISO timestamp in each formatted message. Default: true. */\n includeTimestamp?: boolean;\n /** Include meta as a fenced code block. Default: true. */\n includeMeta?: boolean;\n}\n\n// CloudWatch Log Stream Name patterns\nexport type LogStreamPattern = 'hostname' | 'hostname-date' | 'hostname-uuid' | 'date' | 'uuid';\n\nexport interface LogStreamPatternConfig {\n pattern: LogStreamPattern;\n}\n\nexport interface LogStreamTemplateConfig {\n /** Custom template with variables: {hostname}, {date}, {datetime}, {uuid}, {pid}, {env} */\n template: string;\n}\n\nexport type LogStreamName = string | LogStreamPatternConfig | LogStreamTemplateConfig;\n\n// Relay Transport (runs in worker thread via pino.transport)\nexport interface RelayConfig {\n /** URL of the relay API (e.g., https://relay.example.com) */\n apiUrl: string;\n /** Authentication token for the relay server */\n token: string;\n /** Polling interval in ms (default: 30000) */\n pollInterval?: number;\n /** Ring buffer capacity - max logs held during reconnect (default: 1000) */\n bufferSize?: number;\n /** WebSocket reconnect base delay in ms (default: 1000) */\n reconnectDelay?: number;\n /** Max reconnect delay in ms (default: 30000) */\n maxReconnectDelay?: number;\n /** See RespectRuntimeOverrides. Default: true (relay is an observability transport). */\n respectRuntimeOverrides?: RespectRuntimeOverrides;\n /**\n * Extra hostnames the server is allowed to direct WS streams to. By default\n * the relay only connects to a `wsUrl` whose origin matches `apiUrl` — this\n * prevents a compromised config endpoint from redirecting your logs to an\n * attacker-controlled host. Use this only when your relay backend lives on\n * a different host than its WebSocket gateway, and list those hosts here\n * explicitly.\n */\n allowedWsHosts?: string[];\n /**\n * Auto-mask secrets in lines forwarded over WebSocket. The relay runs in a\n * worker thread and does NOT inherit the parent logger's `maskSecrets`\n * setting automatically — pass it here too if you want forwarded logs\n * masked. Off by default.\n */\n maskSecrets?: boolean | import('./utils/mask-secrets.js').MaskSecretsOptions;\n}\n\n// CloudWatch Transport\nexport interface CloudWatchConfig extends HttpTransportBaseConfig {\n logGroupName: string;\n /** Log stream name - string, pattern config, or template config. Defaults to hostname pattern */\n logStreamName?: LogStreamName;\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n createLogGroup?: boolean;\n createLogStream?: boolean;\n}\n\nexport interface LevelConfigObject {\n default: LogLevel;\n rules?: LevelRule[];\n}\n\nexport type LevelConfig = LogLevel | LevelConfigObject;\n\nexport interface CallerConfig {\n /** Stack depth to capture (default: 1). Higher values trace further up the call stack */\n depth?: number;\n /** Include full file path (default: false). If false, shows relative or basename only */\n fullPath?: boolean;\n}\n\nexport interface CallerInfo {\n file: string;\n line: number;\n column?: number;\n function?: string;\n}\n\nexport interface AutoShutdownConfig {\n /** Timeout in ms before forcing exit (default: 5000) */\n timeout?: number;\n /** Custom signals to handle (default: ['SIGTERM', 'SIGINT']) */\n signals?: NodeJS.Signals[];\n}\n\nexport interface LoggerConfig {\n level: LevelConfig;\n console: ConsoleConfig;\n file?: FileConfig;\n discord?: DiscordConfig | DiscordConfig[];\n telegram?: TelegramConfig | TelegramConfig[];\n cloudwatch?: CloudWatchConfig | CloudWatchConfig[];\n zohoCliq?: ZohoCliqConfig | ZohoCliqConfig[];\n /** Relay transport config — streams logs to a remote server via WebSocket (runs in worker thread) */\n relay?: RelayConfig;\n /** Enable caller info (file:line) in logs. Pass true for defaults or CallerConfig for options */\n caller?: boolean | CallerConfig;\n /** Hostname to include in all log entries. Defaults to os.hostname() if not specified */\n hostname?: string;\n /** Auto-register graceful shutdown handlers. Pass true for defaults or config object */\n autoShutdown?: boolean | AutoShutdownConfig;\n /**\n * Auto-mask secrets (password/token/auth/etc. by default) in all formatted\n * output and HTTP transport payloads. Pass `true` to enable with defaults or\n * a `MaskSecretsOptions` object to customize patterns/mask string.\n */\n maskSecrets?: boolean | import('./utils/mask-secrets.js').MaskSecretsOptions;\n}\n\nexport type LoggerContext = Record<string, unknown>;\n\nexport type LevelOverrideMatch<TContext extends LoggerContext> = Partial<TContext> & { context?: string };\n\nexport interface LevelOverride<TContext extends LoggerContext> {\n match: LevelOverrideMatch<TContext>;\n level: LogLevel;\n readonly?: boolean;\n}\n\nexport type Meta = object | (() => object);\n","import type { LogLevel } from '../types.js';\n\nexport interface BufferedMessage {\n level: LogLevel;\n message: string;\n timestamp: Date;\n context?: string;\n meta?: Record<string, unknown>;\n}\n\nexport type DropPolicy = 'drop-oldest' | 'drop-newest';\n\nexport interface BufferOptions {\n batchSize: number;\n flushInterval: number;\n maxRetries: number;\n retryDelay: number;\n onFlush: (messages: BufferedMessage[]) => Promise<void>;\n onError?: (error: Error, messages: BufferedMessage[]) => void;\n /**\n * Maximum number of messages the queue will hold before dropping. When the\n * queue is full, behaviour follows `dropPolicy`. Default: unbounded.\n */\n maxQueueSize?: number;\n /**\n * Policy applied when the queue is at `maxQueueSize` and a new message\n * arrives. Default: `'drop-oldest'` — prefers keeping recent events, since\n * during an outage the old ones are usually stale anyway.\n */\n dropPolicy?: DropPolicy;\n /**\n * Called when messages are dropped due to queue overflow. Receives the\n * messages that were discarded (not the remaining queue). If not provided,\n * the drop is silent — consumers can still track it via buffer metrics.\n *\n * Callback MUST NOT throw; if it does, the exception is swallowed.\n */\n onDrop?: (droppedMessages: BufferedMessage[]) => void;\n}\n\nexport class MessageBuffer {\n private queue: BufferedMessage[] = [];\n private timer: NodeJS.Timeout | null = null;\n private flushing = false;\n private closed = false;\n private droppedCount = 0;\n\n constructor(private options: BufferOptions) {}\n\n add(message: BufferedMessage): void {\n if (this.closed) return;\n\n const limit = this.options.maxQueueSize;\n if (limit !== undefined && this.queue.length >= limit) {\n const policy = this.options.dropPolicy ?? 'drop-oldest';\n const dropped = policy === 'drop-oldest' ? [this.queue.shift()!] : [message];\n this.droppedCount += 1;\n\n if (this.options.onDrop) {\n try {\n this.options.onDrop(dropped);\n } catch {\n // onDrop must not throw — swallow silently. See contract in options.\n }\n }\n\n if (policy === 'drop-newest') {\n // New message was discarded; queue is unchanged, nothing to schedule.\n return;\n }\n }\n\n this.queue.push(message);\n\n if (this.queue.length >= this.options.batchSize) {\n void this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.flushing || this.queue.length === 0) return;\n\n this.flushing = true;\n this.clearTimer();\n\n const messages = this.queue.splice(0, this.options.batchSize);\n\n try {\n await this.sendWithRetry(messages);\n } catch (error) {\n this.options.onError?.(error as Error, messages);\n } finally {\n this.flushing = false;\n\n // If there are more messages, continue flushing\n if (this.queue.length > 0 && !this.closed) {\n void this.flush();\n }\n }\n }\n\n /**\n * Stops accepting new messages and attempts to flush what's already buffered.\n * Returns when the queue is drained OR when `timeoutMs` elapses. A timeout\n * is essential during graceful shutdown — without it, a dead transport would\n * block process exit indefinitely, and orchestrators like Kubernetes would\n * escalate to SIGKILL after their grace period.\n *\n * Default timeout: 5 seconds. Pass `Infinity` to preserve legacy behaviour.\n */\n async close(timeoutMs = 5000): Promise<void> {\n this.closed = true;\n this.clearTimer();\n\n const deadline = timeoutMs === Infinity ? Infinity : Date.now() + timeoutMs;\n\n while (this.queue.length > 0) {\n if (Date.now() >= deadline) {\n // Give up; messages still in the queue are lost. This is deliberate:\n // blocking shutdown on an unresponsive transport is worse than losing\n // a handful of in-flight log lines.\n return;\n }\n await this.flush();\n }\n }\n\n /** Current number of messages waiting in the queue. */\n get size(): number {\n return this.queue.length;\n }\n\n /** Total number of messages dropped due to queue overflow since creation. */\n get droppedTotal(): number {\n return this.droppedCount;\n }\n\n private scheduleFlush(): void {\n if (this.timer || this.closed) return;\n\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.flush();\n }, this.options.flushInterval);\n }\n\n private clearTimer(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n private async sendWithRetry(messages: BufferedMessage[]): Promise<void> {\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < this.options.maxRetries; attempt++) {\n try {\n await this.options.onFlush(messages);\n return;\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < this.options.maxRetries - 1) {\n await this.delay(this.options.retryDelay * Math.pow(2, attempt));\n }\n }\n }\n\n throw lastError;\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","import { MessageBuffer, type BufferedMessage, type DropPolicy } from './buffer.js';\nimport type { LogLevel } from '../types.js';\n\nexport interface BaseHttpTransportOptions {\n batchSize?: number;\n flushInterval?: number;\n maxRetries?: number;\n retryDelay?: number;\n maxQueueSize?: number;\n dropPolicy?: DropPolicy;\n onDrop?: (droppedMessages: BufferedMessage[]) => void;\n /**\n * Called when a batch fails after all retries and messages are dropped.\n * If not provided, the error is logged to stderr.\n *\n * The callback MUST NOT throw; if it does, the failure is swallowed and a\n * stderr fallback is used. A logger must never propagate transport errors\n * back into the host application.\n */\n onError?: (error: Error, droppedMessages: BufferedMessage[]) => void;\n /**\n * If provided, applied to `meta` once per message in `transformMessage`. Used\n * by transports that build payloads via `Object.entries(meta)` iteration\n * (Discord/Telegram/Zoho), where a JSON.stringify replacer can't reach the\n * top-level key. CloudWatch passes `undefined` here and uses a replacer in\n * its own `sendBatch` instead.\n */\n masker?: (value: unknown) => unknown;\n}\n\nconst DEFAULT_OPTIONS = {\n batchSize: 10,\n flushInterval: 5000,\n maxRetries: 3,\n retryDelay: 1000,\n};\n\nexport abstract class BaseHttpTransport {\n protected buffer: MessageBuffer;\n private onErrorCallback?: BaseHttpTransportOptions['onError'];\n private masker?: (value: unknown) => unknown;\n\n constructor(opts: BaseHttpTransportOptions = {}) {\n this.onErrorCallback = opts.onError;\n this.masker = opts.masker;\n\n this.buffer = new MessageBuffer({\n batchSize: opts.batchSize ?? DEFAULT_OPTIONS.batchSize,\n flushInterval: opts.flushInterval ?? DEFAULT_OPTIONS.flushInterval,\n maxRetries: opts.maxRetries ?? DEFAULT_OPTIONS.maxRetries,\n retryDelay: opts.retryDelay ?? DEFAULT_OPTIONS.retryDelay,\n maxQueueSize: opts.maxQueueSize,\n dropPolicy: opts.dropPolicy,\n onDrop: opts.onDrop,\n onFlush: this.sendBatch.bind(this),\n onError: this.handleError.bind(this),\n });\n }\n\n log(info: Record<string, unknown>, callback: () => void): void {\n const message = this.transformMessage(info);\n this.buffer.add(message);\n callback();\n }\n\n /**\n * Stop accepting new messages and flush what's buffered. `timeoutMs` caps\n * how long the flush may take; after that the remaining queue is discarded\n * so shutdown can complete. Default 5000ms.\n */\n close(timeoutMs?: number): Promise<void> {\n return this.buffer.close(timeoutMs);\n }\n\n /** Current buffered message count and total drops since creation. */\n getMetrics(): { queueSize: number; droppedTotal: number } {\n return {\n queueSize: this.buffer.size,\n droppedTotal: this.buffer.droppedTotal,\n };\n }\n\n protected transformMessage(info: Record<string, unknown>): BufferedMessage {\n const { level, message, timestamp, context, ...meta } = info;\n\n let resolvedMeta: Record<string, unknown> | undefined;\n if (Object.keys(meta).length > 0) {\n resolvedMeta = this.masker\n ? (this.masker(meta) as Record<string, unknown>)\n : meta;\n }\n\n return {\n level: level as LogLevel,\n message: String(message),\n timestamp: timestamp instanceof Date ? timestamp : (timestamp ? new Date(String(timestamp)) : new Date()),\n context: context as string | undefined,\n meta: resolvedMeta,\n };\n }\n\n protected handleError(error: Error, messages: BufferedMessage[]): void {\n if (this.onErrorCallback) {\n try {\n this.onErrorCallback(error, messages);\n return;\n } catch (callbackError) {\n // onError must not throw — fall through to stderr.\n // Use stderr to surface the programmer error without blowing up the app.\n // eslint-disable-next-line no-console\n console.error(\n `[${this.constructor.name}] onError callback threw:`,\n callbackError instanceof Error ? callbackError.message : callbackError,\n );\n }\n }\n\n // Default behavior: log to stderr. Avoids infinite loops — we never\n // write transport errors into the logger's own pipeline.\n // eslint-disable-next-line no-console\n console.error(\n `[${this.constructor.name}] Failed to send ${messages.length} messages:`,\n error.message,\n );\n }\n\n protected abstract sendBatch(messages: BufferedMessage[]): Promise<void>;\n}\n","import { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { DiscordConfig, LogLevel } from '../types.js';\n\nconst DEFAULT_EMBED_COLORS: Record<LogLevel, number> = {\n off: 0x000000,\n error: 0xed4245,\n warn: 0xfee75c,\n info: 0x57f287,\n http: 0x5865f2,\n verbose: 0x9b59b6,\n debug: 0x3498db,\n silly: 0x95a5a6,\n};\n\ninterface DiscordEmbed {\n title: string;\n description: string;\n color: number;\n timestamp?: string;\n fields?: Array<{ name: string; value: string; inline?: boolean }>;\n}\n\ninterface DiscordWebhookPayload {\n username?: string;\n avatar_url?: string;\n content?: string;\n embeds?: DiscordEmbed[];\n}\n\nconst LEVEL_EMOJI: Record<LogLevel, string> = {\n off: '⚫',\n error: '🔴',\n warn: '🟡',\n info: '🟢',\n http: '🔵',\n verbose: '🟣',\n debug: '⚪',\n silly: '⚫',\n};\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10_000;\n\nexport class DiscordTransport extends BaseHttpTransport {\n private config: DiscordConfig;\n private requestTimeout: number;\n\n constructor(config: DiscordConfig, masker?: (value: unknown) => unknown) {\n super({\n batchSize: config.batchSize ?? 10,\n flushInterval: config.flushInterval ?? 2000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n maxQueueSize: config.maxQueueSize,\n dropPolicy: config.dropPolicy,\n onDrop: config.onDrop,\n onError: config.onError,\n masker,\n });\n this.config = config;\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n protected async sendBatch(messages: BufferedMessage[]): Promise<void> {\n if (this.config.format === 'markdown') {\n await this.sendMarkdownBatch(messages);\n } else {\n await this.sendEmbedBatch(messages);\n }\n }\n\n private async sendEmbedBatch(messages: BufferedMessage[]): Promise<void> {\n // Discord allows max 10 embeds per message\n const chunks = this.chunkArray(messages, 10);\n\n for (const chunk of chunks) {\n const payload: DiscordWebhookPayload = {\n username: this.config.username,\n avatar_url: this.config.avatarUrl,\n embeds: chunk.map((msg) => this.createEmbed(msg)),\n };\n\n await this.sendWebhook(payload);\n }\n }\n\n private async sendMarkdownBatch(messages: BufferedMessage[]): Promise<void> {\n // Discord content limit is 2000 chars, send each message separately if needed\n const content = messages.map((msg) => this.formatMarkdown(msg)).join('\\n\\n---\\n\\n');\n\n // Split into chunks of ~1900 chars to stay under 2000 limit\n const chunks = this.splitContent(content, 1900);\n\n for (const chunk of chunks) {\n const payload: DiscordWebhookPayload = {\n username: this.config.username,\n avatar_url: this.config.avatarUrl,\n content: chunk,\n };\n\n await this.sendWebhook(payload);\n }\n }\n\n private formatMarkdown(msg: BufferedMessage): string {\n const emoji = LEVEL_EMOJI[msg.level];\n const level = msg.level.toUpperCase();\n const context = msg.context || 'APP';\n const timestamp = this.config.includeTimestamp !== false\n ? `\\`${msg.timestamp.toISOString()}\\``\n : '';\n\n let text = `${emoji} **${level}** [${context}] ${timestamp}\\n${msg.message}`;\n\n if (this.config.includeMeta !== false && msg.meta && Object.keys(msg.meta).length > 0) {\n text += '\\n```json\\n' + JSON.stringify(msg.meta, null, 2) + '\\n```';\n }\n\n return text;\n }\n\n private splitContent(content: string, maxLength: number): string[] {\n if (content.length <= maxLength) return [content];\n\n const chunks: string[] = [];\n let current = content;\n\n while (current.length > 0) {\n if (current.length <= maxLength) {\n chunks.push(current);\n break;\n }\n\n // Find a good split point (newline or space)\n let splitAt = current.lastIndexOf('\\n', maxLength);\n if (splitAt === -1 || splitAt < maxLength / 2) {\n splitAt = current.lastIndexOf(' ', maxLength);\n }\n if (splitAt === -1 || splitAt < maxLength / 2) {\n splitAt = maxLength;\n }\n\n chunks.push(current.slice(0, splitAt));\n current = current.slice(splitAt).trimStart();\n }\n\n return chunks;\n }\n\n private createEmbed(msg: BufferedMessage): DiscordEmbed {\n const color = this.config.embedColors?.[msg.level] ?? DEFAULT_EMBED_COLORS[msg.level];\n\n const embed: DiscordEmbed = {\n title: `[${msg.level.toUpperCase()}] ${msg.context || 'APP'}`,\n description: msg.message.slice(0, 4096), // Discord limit\n color,\n };\n\n if (this.config.includeTimestamp !== false) {\n embed.timestamp = msg.timestamp.toISOString();\n }\n\n if (this.config.includeMeta !== false && msg.meta) {\n embed.fields = this.metaToFields(msg.meta);\n }\n\n return embed;\n }\n\n private metaToFields(\n meta: Record<string, unknown>,\n ): Array<{ name: string; value: string; inline?: boolean }> {\n const maxFields = this.config.maxEmbedFields ?? 25;\n const fields: Array<{ name: string; value: string; inline?: boolean }> = [];\n\n for (const [key, value] of Object.entries(meta)) {\n if (fields.length >= maxFields) break;\n\n let strValue: string;\n if (typeof value === 'object') {\n strValue = '```json\\n' + JSON.stringify(value, null, 2).slice(0, 1000) + '\\n```';\n } else {\n strValue = String(value).slice(0, 1024);\n }\n\n fields.push({\n name: key.slice(0, 256),\n value: strValue,\n inline: typeof value !== 'object' && String(value).length < 50,\n });\n }\n\n return fields;\n }\n\n private async sendWebhook(payload: DiscordWebhookPayload): Promise<void> {\n const response = await fetch(this.config.webhookUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(this.requestTimeout),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Discord webhook failed: ${response.status} ${text}`);\n }\n }\n\n private chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n }\n}\n","import { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { TelegramConfig, LogLevel } from '../types.js';\n\nconst LEVEL_EMOJI: Record<LogLevel, string> = {\n off: '',\n error: '🔴',\n warn: '🟡',\n info: '🟢',\n http: '🔵',\n verbose: '🟣',\n debug: '⚪',\n silly: '⚫',\n};\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10_000;\n\nexport class TelegramTransport extends BaseHttpTransport {\n private config: TelegramConfig;\n private apiUrl: string;\n private requestTimeout: number;\n\n constructor(config: TelegramConfig, masker?: (value: unknown) => unknown) {\n super({\n batchSize: config.batchSize ?? 20,\n flushInterval: config.flushInterval ?? 1000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n maxQueueSize: config.maxQueueSize,\n dropPolicy: config.dropPolicy,\n onDrop: config.onDrop,\n onError: config.onError,\n masker,\n });\n this.config = config;\n this.apiUrl = `https://api.telegram.org/bot${config.botToken}`;\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n protected async sendBatch(messages: BufferedMessage[]): Promise<void> {\n const text = this.formatBatchMessage(messages);\n await this.sendMessage(text, messages);\n }\n\n private formatBatchMessage(messages: BufferedMessage[]): string {\n const parseMode = this.config.parseMode ?? 'HTML';\n\n return messages\n .map((msg) => {\n if (parseMode === 'HTML') {\n return this.formatHtml(msg);\n }\n return this.formatMarkdown(msg, parseMode === 'MarkdownV2');\n })\n .join('\\n\\n---\\n\\n');\n }\n\n private formatMarkdown(msg: BufferedMessage, v2: boolean): string {\n const emoji = LEVEL_EMOJI[msg.level];\n const escape = v2 ? this.escapeMarkdownV2.bind(this) : (s: string) => s;\n const bracket = v2 ? ['\\\\[', '\\\\]'] : ['[', ']'];\n\n let text = `${emoji} *${msg.level.toUpperCase()}* ${bracket[0]}${escape(msg.context || 'APP')}${bracket[1]}\\n`;\n text += escape(msg.message);\n\n if (msg.meta && Object.keys(msg.meta).length > 0) {\n const metaStr = JSON.stringify(msg.meta, null, 2);\n text += '\\n```json\\n' + metaStr + '\\n```';\n }\n\n return text;\n }\n\n private formatHtml(msg: BufferedMessage): string {\n const emoji = LEVEL_EMOJI[msg.level];\n\n let text = `${emoji} <b>${msg.level.toUpperCase()}</b> [${this.escapeHtml(msg.context || 'APP')}]\\n`;\n text += this.escapeHtml(msg.message);\n\n if (msg.meta && Object.keys(msg.meta).length > 0) {\n const metaStr = JSON.stringify(msg.meta, null, 2);\n text += '\\n<pre>' + this.escapeHtml(metaStr) + '</pre>';\n }\n\n return text;\n }\n\n private shouldMute(messages: BufferedMessage[]): boolean {\n if (this.config.disableNotification !== undefined) {\n return this.config.disableNotification;\n }\n // Don't mute if any message is error level\n return !messages.some((m) => m.level === 'error');\n }\n\n private async sendMessage(text: string, messages: BufferedMessage[]): Promise<void> {\n const body: Record<string, unknown> = {\n chat_id: this.config.chatId,\n text,\n parse_mode: this.config.parseMode ?? 'HTML',\n disable_notification: this.shouldMute(messages),\n };\n\n if (this.config.threadId) {\n body.message_thread_id = this.config.threadId;\n }\n\n if (this.config.replyToMessageId) {\n body.reply_to_message_id = this.config.replyToMessageId;\n }\n\n const response = await fetch(`${this.apiUrl}/sendMessage`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.requestTimeout),\n });\n\n if (!response.ok) {\n const result = await response.json();\n throw new Error(`Telegram API failed: ${response.status} ${JSON.stringify(result)}`);\n }\n }\n\n private escapeMarkdownV2(text: string): string {\n return text.replace(/[_*[\\]()~`>#+\\-=|{}.!]/g, '\\\\$&');\n }\n\n private escapeHtml(text: string): string {\n const entities: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n };\n return text.replace(/[&<>\"']/g, (c) => entities[c] || c);\n }\n}\n","import { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { ZohoCliqConfig, LogLevel } from '../types.js';\n\nconst LEVEL_EMOJI: Record<LogLevel, string> = {\n off: '',\n error: '🔴',\n warn: '🟡',\n info: '🟢',\n http: '🔵',\n verbose: '🟣',\n debug: '⚪',\n silly: '⚫',\n};\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10_000;\n// Zoho Cliq text field accepts up to 10,000 chars per message\nconst MAX_MESSAGE_LENGTH = 9_500;\n\nexport class ZohoCliqTransport extends BaseHttpTransport {\n private config: ZohoCliqConfig;\n private endpoint: string;\n private requestTimeout: number;\n\n constructor(config: ZohoCliqConfig, masker?: (value: unknown) => unknown) {\n super({\n batchSize: config.batchSize ?? 20,\n flushInterval: config.flushInterval ?? 2000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n maxQueueSize: config.maxQueueSize,\n dropPolicy: config.dropPolicy,\n onDrop: config.onDrop,\n onError: config.onError,\n masker,\n });\n this.config = config;\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.endpoint = this.buildEndpoint();\n }\n\n private buildEndpoint(): string {\n if (this.config.webhookUrl) {\n return this.config.webhookUrl;\n }\n const region = this.config.region ?? 'eu';\n const companyId = this.config.companyId;\n const channel = encodeURIComponent(this.config.channel!);\n return `https://cliq.zoho.${region}/company/${companyId}/api/v2/channelsbyname/${channel}/message`;\n }\n\n protected async sendBatch(messages: BufferedMessage[]): Promise<void> {\n const text = messages.map((msg) => this.formatMessage(msg)).join('\\n\\n---\\n\\n');\n for (const chunk of this.splitContent(text, MAX_MESSAGE_LENGTH)) {\n await this.post(chunk);\n }\n }\n\n private formatMessage(msg: BufferedMessage): string {\n const emoji = LEVEL_EMOJI[msg.level];\n const level = msg.level.toUpperCase();\n const context = msg.context || 'APP';\n const timestamp = this.config.includeTimestamp !== false\n ? ` ${msg.timestamp.toISOString()}`\n : '';\n\n let text = `${emoji} *${level}* [${context}]${timestamp}\\n${msg.message}`;\n\n if (this.config.includeMeta !== false && msg.meta && Object.keys(msg.meta).length > 0) {\n text += '\\n```\\n' + JSON.stringify(msg.meta, null, 2) + '\\n```';\n }\n\n return text;\n }\n\n private splitContent(content: string, maxLength: number): string[] {\n if (content.length <= maxLength) return [content];\n\n const chunks: string[] = [];\n let current = content;\n\n while (current.length > 0) {\n if (current.length <= maxLength) {\n chunks.push(current);\n break;\n }\n let splitAt = current.lastIndexOf('\\n', maxLength);\n if (splitAt === -1 || splitAt < maxLength / 2) {\n splitAt = current.lastIndexOf(' ', maxLength);\n }\n if (splitAt === -1 || splitAt < maxLength / 2) {\n splitAt = maxLength;\n }\n chunks.push(current.slice(0, splitAt));\n current = current.slice(splitAt).trimStart();\n }\n\n return chunks;\n }\n\n private async post(text: string): Promise<void> {\n const url = new URL(this.endpoint);\n url.searchParams.set('zapikey', this.config.apiKey);\n if (this.config.bot?.name) {\n url.searchParams.set('bot_unique_name', this.config.bot.name);\n }\n\n const body: Record<string, unknown> = {\n text,\n broadcast: this.config.broadcast ?? true,\n };\n if (this.config.bot) {\n body.bot = this.config.bot;\n }\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(this.requestTimeout),\n });\n\n // Zoho Cliq returns 204 on success\n if (!response.ok && response.status !== 204) {\n const respText = await response.text().catch(() => '');\n throw new Error(`Zoho Cliq API failed: ${response.status} ${respText}`);\n }\n }\n}\n","import {\n CloudWatchLogsClient,\n PutLogEventsCommand,\n CreateLogGroupCommand,\n CreateLogStreamCommand,\n DescribeLogStreamsCommand,\n type InputLogEvent,\n} from '@aws-sdk/client-cloudwatch-logs';\nimport { hostname as osHostname } from 'os';\nimport { randomUUID } from 'crypto';\nimport { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { CloudWatchConfig, LogStreamName } from '../types.js';\nimport type { MaskReplacer } from '../utils/mask-secrets.js';\n\n// Generate UUID once at module load for consistent stream names across the app lifecycle\nconst instanceUuid = randomUUID().slice(0, 8);\n\nfunction formatDate(): string {\n return new Date().toISOString().slice(0, 10); // YYYY-MM-DD\n}\n\nfunction formatDateTime(): string {\n return new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-'); // YYYY-MM-DD-HH-mm-ss\n}\n\nfunction resolveLogStreamName(config: LogStreamName | undefined, configHostname?: string): string {\n const hostname = configHostname || process.env.HOSTNAME || osHostname();\n\n // Default to hostname pattern if not specified\n if (!config) {\n return hostname;\n }\n\n // Plain string - use as-is\n if (typeof config === 'string') {\n return config;\n }\n\n // Pattern config\n if ('pattern' in config) {\n switch (config.pattern) {\n case 'hostname':\n return hostname;\n case 'hostname-date':\n return `${hostname}/${formatDate()}`;\n case 'hostname-uuid':\n return `${hostname}-${instanceUuid}`;\n case 'date':\n return formatDate();\n case 'uuid':\n return randomUUID();\n default:\n return hostname;\n }\n }\n\n // Template config\n if ('template' in config) {\n return config.template\n .replace(/\\{hostname\\}/g, hostname)\n .replace(/\\{date\\}/g, formatDate())\n .replace(/\\{datetime\\}/g, formatDateTime())\n .replace(/\\{uuid\\}/g, instanceUuid)\n .replace(/\\{pid\\}/g, String(process.pid))\n .replace(/\\{env\\}/g, process.env.NODE_ENV || 'development');\n }\n\n return hostname;\n}\n\nexport class CloudWatchTransport extends BaseHttpTransport {\n private config: CloudWatchConfig;\n private client: CloudWatchLogsClient;\n private sequenceToken: string | undefined;\n private initialized = false;\n private initPromise: Promise<void> | null = null;\n private resolvedLogStreamName: string;\n private maskReplacer: MaskReplacer | undefined;\n\n constructor(\n config: CloudWatchConfig,\n configHostname?: string,\n maskReplacerFn?: MaskReplacer,\n ) {\n // CloudWatch uses a replacer in sendBatch (zero-clone), so we deliberately\n // do NOT pass `masker` to the base — that would clone meta a second time.\n super({\n batchSize: config.batchSize ?? 100,\n flushInterval: config.flushInterval ?? 1000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n maxQueueSize: config.maxQueueSize,\n dropPolicy: config.dropPolicy,\n onDrop: config.onDrop,\n onError: config.onError,\n });\n this.maskReplacer = maskReplacerFn;\n this.config = config;\n this.resolvedLogStreamName = resolveLogStreamName(config.logStreamName, configHostname);\n\n this.client = new CloudWatchLogsClient({\n region: config.region,\n credentials: {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n },\n });\n }\n\n protected async sendBatch(messages: BufferedMessage[]): Promise<void> {\n await this.ensureInitialized();\n\n const replacer = this.maskReplacer;\n const logEvents: InputLogEvent[] = messages.map((msg) => ({\n timestamp: msg.timestamp.getTime(),\n message: JSON.stringify({\n level: msg.level,\n message: msg.message,\n context: msg.context,\n ...msg.meta,\n }, replacer),\n }));\n\n // Sort by timestamp (CloudWatch requirement)\n logEvents.sort((a, b) => (a.timestamp ?? 0) - (b.timestamp ?? 0));\n\n const command = new PutLogEventsCommand({\n logGroupName: this.config.logGroupName,\n logStreamName: this.resolvedLogStreamName,\n logEvents,\n sequenceToken: this.sequenceToken,\n });\n\n try {\n const response = await this.client.send(command);\n this.sequenceToken = response.nextSequenceToken;\n } catch (error: unknown) {\n // Handle InvalidSequenceTokenException by retrying with correct token\n if (this.isInvalidSequenceTokenError(error)) {\n await this.fetchSequenceToken();\n const retryCommand = new PutLogEventsCommand({\n logGroupName: this.config.logGroupName,\n logStreamName: this.resolvedLogStreamName,\n logEvents,\n sequenceToken: this.sequenceToken,\n });\n const response = await this.client.send(retryCommand);\n this.sequenceToken = response.nextSequenceToken;\n } else {\n throw error;\n }\n }\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n // If a previous initialize() failed (e.g. transient network blip,\n // credentials briefly invalid), a naive cache of the rejected promise\n // would leave the transport permanently dead. Reset the cached promise on\n // failure so the next `sendBatch` retries initialization from scratch.\n if (!this.initPromise) {\n this.initPromise = this.initialize().catch((err) => {\n this.initPromise = null;\n throw err;\n });\n }\n\n await this.initPromise;\n }\n\n private async initialize(): Promise<void> {\n if (this.config.createLogGroup) {\n await this.createLogGroupIfNotExists();\n }\n\n if (this.config.createLogStream !== false) {\n await this.createLogStreamIfNotExists();\n }\n\n await this.fetchSequenceToken();\n this.initialized = true;\n }\n\n private async createLogGroupIfNotExists(): Promise<void> {\n try {\n await this.client.send(\n new CreateLogGroupCommand({\n logGroupName: this.config.logGroupName,\n }),\n );\n } catch (error: unknown) {\n if (!this.isResourceAlreadyExistsError(error)) {\n throw error;\n }\n }\n }\n\n private async createLogStreamIfNotExists(): Promise<void> {\n try {\n await this.client.send(\n new CreateLogStreamCommand({\n logGroupName: this.config.logGroupName,\n logStreamName: this.resolvedLogStreamName,\n }),\n );\n } catch (error: unknown) {\n if (!this.isResourceAlreadyExistsError(error)) {\n throw error;\n }\n }\n }\n\n private async fetchSequenceToken(): Promise<void> {\n const response = await this.client.send(\n new DescribeLogStreamsCommand({\n logGroupName: this.config.logGroupName,\n logStreamNamePrefix: this.resolvedLogStreamName,\n limit: 1,\n }),\n );\n\n const stream = response.logStreams?.find((s) => s.logStreamName === this.resolvedLogStreamName);\n this.sequenceToken = stream?.uploadSequenceToken;\n }\n\n private isResourceAlreadyExistsError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'ResourceAlreadyExistsException'\n );\n }\n\n private isInvalidSequenceTokenError(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'name' in error &&\n error.name === 'InvalidSequenceTokenException'\n );\n }\n}\n","import pino, { type DestinationStream, type StreamEntry } from 'pino';\nimport { Transform, Writable } from 'node:stream';\nimport { fileURLToPath } from 'node:url';\nimport { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createStream, type RotatingFileStream, type FileSize, type Interval } from 'rotating-file-stream';\nimport { LoggerStore } from './store.js';\nimport { getGlobalOverrideLevel, matchesContext, type LoggerState } from './state.js';\nimport { DiscordTransport } from './transports/discord.js';\nimport { TelegramTransport } from './transports/telegram.js';\nimport { ZohoCliqTransport } from './transports/zoho-cliq.js';\nimport { CloudWatchTransport } from './transports/cloudwatch.js';\nimport type { BaseHttpTransport } from './transports/base-http.js';\nimport {\n LOG_LEVELS,\n type LoggerConfig,\n type LoggerContext,\n type LogLevel,\n type LevelRule,\n} from './types.js';\n\nexport interface StreamsResult {\n destination: DestinationStream;\n transports: BaseHttpTransport[];\n}\n\n// Pino level values\nconst PINO_LEVELS: Record<string, number> = {\n fatal: 60,\n error: 50,\n warn: 40,\n info: 30,\n debug: 20,\n trace: 10,\n // Custom\n http: 25,\n verbose: 25,\n silly: 10,\n};\n\ninterface ParsedLog {\n level: number;\n time: number;\n msg: string;\n context?: string;\n /** Internal: runtime-override level embedded by Logger.log(). See M2 in streams.ts. */\n __or?: string;\n [key: string]: unknown;\n}\n\nfunction parseLogLine(line: string): ParsedLog | null {\n try {\n return JSON.parse(line) as ParsedLog;\n } catch {\n return null;\n }\n}\n\nfunction getLevelName(levelNum: number): LogLevel {\n if (levelNum >= 50) return 'error';\n if (levelNum >= 40) return 'warn';\n if (levelNum >= 30) return 'info';\n if (levelNum >= 25) return 'http';\n if (levelNum >= 20) return 'debug';\n return 'silly';\n}\n\n// Default transport roles by kind. Observability transports (console/file/\n// cloudwatch/relay) are viewing channels and should honour runtime overrides\n// so that targeted troubleshooting actually surfaces logs. Alert transports\n// (discord/telegram/zohoCliq) are user-facing notification channels and\n// should stay strictly within their own level/rules to avoid accidental\n// flooding when an operator enables debug for a user or context.\nexport type TransportKind =\n | 'console'\n | 'file'\n | 'cloudwatch'\n | 'relay'\n | 'discord'\n | 'telegram'\n | 'zohoCliq';\n\nconst DEFAULT_RESPECTS_OVERRIDES: Record<TransportKind, boolean> = {\n console: true,\n file: true,\n cloudwatch: true,\n relay: true,\n discord: false,\n telegram: false,\n zohoCliq: false,\n};\n\nexport function resolveRespectsOverrides(\n kind: TransportKind,\n configFlag: boolean | undefined,\n): boolean {\n return configFlag ?? DEFAULT_RESPECTS_OVERRIDES[kind];\n}\n\n// Check if log should pass for a transport.\n// Precedence when `respectOverrides` is true (observability):\n// 1. Runtime override (setLevelOverride) — if any matches, use its level\n// 2. Per-transport rule — if any matches, use its level\n// 3. Per-transport level — fallback for this transport\n// 4. Accept all (silly) — if no transport level is set\n//\n// Precedence when `respectOverrides` is false (alert):\n// 1. Per-transport rule — if any matches, use its level\n// 2. Per-transport level — fallback for this transport\n// 3. Accept all (silly) — if no transport level is set\n//\n// M2: the logger embeds the matched runtime-override level in the log line as\n// `__or` (see Logger.log). Checking that single field replaces re-running the\n// full override matcher here — saves ~30% of per-log overhead under heavy\n// rule configurations and keeps behaviour identical.\nfunction shouldPassTransport<TContext extends LoggerContext>(\n log: ParsedLog,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n state: LoggerState<TContext>,\n respectOverrides: boolean,\n): boolean {\n const logLevel = getLevelName(log.level);\n\n // 1. Runtime override — only honoured when transport opts in.\n if (respectOverrides) {\n const embeddedOverride = log.__or;\n if (typeof embeddedOverride === 'string') {\n if (embeddedOverride === 'off') return false;\n const overrideLevel = embeddedOverride as LogLevel;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[overrideLevel];\n }\n }\n\n const context = log.context;\n\n // 2. Per-transport rule (only extract meta if we actually have rules to match).\n if (rules && rules.length > 0) {\n const storeContext = state.store.getStore();\n const logMeta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(log)) {\n if (!RESERVED_LOG_FIELDS.has(key)) {\n logMeta[key] = value;\n }\n }\n const matchingRule = rules.find((rule) => matchesContext(storeContext, context, rule.match, logMeta));\n if (matchingRule) {\n if (matchingRule.level === 'off') return false;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[matchingRule.level];\n }\n }\n\n // 3. Per-transport level, or 4. accept-all fallback\n const effectiveLevel = level ?? 'silly';\n if (effectiveLevel === 'off') return false;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[effectiveLevel];\n}\n\nconst RESERVED_LOG_FIELDS = new Set(['level', 'time', 'msg', 'context', '__or']);\n\n// Format based on type\nfunction formatLog<TContext extends LoggerContext>(\n log: ParsedLog,\n format: 'json' | 'plain' | 'logfmt' | 'simple',\n state: LoggerState<TContext>,\n): string {\n const levelName = getLevelName(log.level);\n const timestamp = new Date(log.time).toISOString();\n const context = log.context || 'APP';\n const message = log.msg || '';\n\n // Add store context\n const storeContext = state.store.getStore();\n const meta: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(log)) {\n if (!RESERVED_LOG_FIELDS.has(key)) {\n meta[key] = value;\n }\n }\n\n if (storeContext) {\n Object.assign(meta, storeContext);\n }\n\n const replacer = state.maskReplacer;\n\n if (format === 'json') {\n return JSON.stringify({\n level: levelName,\n timestamp,\n context,\n message,\n ...meta,\n }, replacer) + '\\n';\n }\n\n if (format === 'plain') {\n const LEVEL_COLORS: Record<string, string> = {\n error: '\\x1b[31m',\n warn: '\\x1b[33m',\n info: '\\x1b[32m',\n http: '\\x1b[35m',\n verbose: '\\x1b[36m',\n debug: '\\x1b[34m',\n silly: '\\x1b[90m',\n };\n const RESET = '\\x1b[0m';\n const color = LEVEL_COLORS[levelName] || '';\n const coloredLevel = color ? `${color}${levelName}${RESET}` : levelName;\n\n const formatValue = (key: string, value: unknown): string => {\n // Top-level secret keys are consumed by the iteration below, so the\n // JSON.stringify replacer never sees them — apply it manually here.\n const masked = replacer ? replacer.call(undefined, key, value) : value;\n if (typeof masked === 'string' && masked.includes('\\n')) {\n // Multiline strings (like stack traces) - indent each line\n return '\\n ' + masked.split('\\n').join('\\n ');\n }\n return JSON.stringify(masked, replacer);\n };\n\n const metaStr = Object.keys(meta).length > 0\n ? '\\n ' + Object.entries(meta).map(([k, v]) => `${k}: ${formatValue(k, v)}`).join('\\n ')\n : '';\n return `[${timestamp}] ${coloredLevel} [${context}] ${message}${metaStr}\\n`;\n }\n\n if (format === 'logfmt') {\n const parts = [`level=${levelName}`, `msg=\"${message}\"`, `context=${context}`, `ts=${timestamp}`];\n for (const [k, v] of Object.entries(meta)) {\n const masked = replacer ? replacer.call(undefined, k, v) : v;\n parts.push(`${k}=${JSON.stringify(masked, replacer)}`);\n }\n return parts.join(' ') + '\\n';\n }\n\n // simple\n return `[${timestamp}] ${levelName}: ${message}\\n`;\n}\n\n// Create a filtering + formatting transform stream\nfunction createFormattedFilterStream<TContext extends LoggerContext>(\n format: 'json' | 'plain' | 'logfmt' | 'simple',\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n state: LoggerState<TContext>,\n destination: NodeJS.WritableStream,\n respectOverrides: boolean,\n): Transform {\n return new Transform({\n transform(chunk: Buffer, _encoding: string, callback) {\n const line = chunk.toString().trim();\n if (!line) {\n callback();\n return;\n }\n\n const log = parseLogLine(line);\n if (!log) {\n callback();\n return;\n }\n\n if (!shouldPassTransport(log, level, rules, state, respectOverrides)) {\n callback();\n return;\n }\n\n const formatted = formatLog(log, format, state);\n destination.write(formatted);\n callback();\n },\n });\n}\n\nexport function createStreams<TContext extends LoggerContext>(\n config: LoggerConfig,\n state: LoggerState<TContext>,\n): StreamsResult {\n const streams: StreamEntry<'trace'>[] = [];\n const transports: BaseHttpTransport[] = [];\n\n // Console transport\n const consoleStream = createFormattedFilterStream(\n config.console.format,\n config.console.level,\n config.console.rules,\n state,\n process.stdout,\n resolveRespectsOverrides('console', config.console.respectRuntimeOverrides),\n );\n\n streams.push({\n level: 'trace',\n stream: consoleStream,\n });\n\n // File transport with rotation\n if (config.file) {\n const fileConfig = config.file;\n\n // Ensure directory exists\n mkdir(fileConfig.dirname, { recursive: true }).catch(() => {});\n\n // Normalize size unit to uppercase (rotating-file-stream requires uppercase: M, K, G)\n const normalizeSize = (size: string): FileSize => {\n return size.replace(/([kmg])$/i, (match) => match.toUpperCase()) as FileSize;\n };\n\n const rotatingStream = createStream(\n (time: Date | number, index?: number) => {\n const date = time instanceof Date ? time : new Date();\n const dateStr = date.toISOString().split('T')[0];\n const base = fileConfig.filename.replace('.log', '');\n return `${base}-${dateStr}${index ? `.${index}` : ''}.log`;\n },\n {\n path: fileConfig.dirname,\n size: normalizeSize(fileConfig.maxSize || '20M'),\n interval: (fileConfig.interval || (fileConfig.datePattern === 'YYYY-MM-DD-HH' ? '1h' : '1d')) as Interval,\n compress: fileConfig.zippedArchive ? 'gzip' : false,\n maxFiles: parseInt(fileConfig.maxFiles?.replace('d', '') || '14'),\n },\n );\n\n const fileStream = createFormattedFilterStream(\n fileConfig.format,\n fileConfig.level,\n fileConfig.rules,\n state,\n rotatingStream,\n resolveRespectsOverrides('file', fileConfig.respectRuntimeOverrides),\n );\n\n streams.push({\n level: 'trace',\n stream: fileStream,\n });\n }\n\n // HTTP transports - Discord\n for (const discordConfig of toArray(config.discord)) {\n const transport = new DiscordTransport(discordConfig, state.maskerFn);\n transports.push(transport);\n const discordStream = createHttpTransportStream(\n transport,\n discordConfig.level,\n discordConfig.rules,\n state,\n resolveRespectsOverrides('discord', discordConfig.respectRuntimeOverrides),\n );\n streams.push({\n level: 'trace',\n stream: discordStream,\n });\n }\n\n // HTTP transports - Telegram\n for (const telegramConfig of toArray(config.telegram)) {\n const transport = new TelegramTransport(telegramConfig, state.maskerFn);\n transports.push(transport);\n const telegramStream = createHttpTransportStream(\n transport,\n telegramConfig.level,\n telegramConfig.rules,\n state,\n resolveRespectsOverrides('telegram', telegramConfig.respectRuntimeOverrides),\n );\n streams.push({\n level: 'trace',\n stream: telegramStream,\n });\n }\n\n // HTTP transports - Zoho Cliq\n for (const zohoCliqConfig of toArray(config.zohoCliq)) {\n const transport = new ZohoCliqTransport(zohoCliqConfig, state.maskerFn);\n transports.push(transport);\n const zohoStream = createHttpTransportStream(\n transport,\n zohoCliqConfig.level,\n zohoCliqConfig.rules,\n state,\n resolveRespectsOverrides('zohoCliq', zohoCliqConfig.respectRuntimeOverrides),\n );\n streams.push({\n level: 'trace',\n stream: zohoStream,\n });\n }\n\n // HTTP transports - CloudWatch\n for (const cloudwatchConfig of toArray(config.cloudwatch)) {\n const transport = new CloudWatchTransport(cloudwatchConfig, config.hostname, state.maskReplacer);\n transports.push(transport);\n const cwStream = createHttpTransportStream(\n transport,\n cloudwatchConfig.level,\n cloudwatchConfig.rules,\n state,\n resolveRespectsOverrides('cloudwatch', cloudwatchConfig.respectRuntimeOverrides),\n );\n streams.push({\n level: 'trace',\n stream: cwStream,\n });\n }\n\n // Relay transport (runs in worker thread via pino.transport)\n if (config.relay) {\n const relayStream = pino.transport({\n target: '@rawnodes/logger/relay',\n options: config.relay,\n });\n streams.push({\n level: 'trace',\n stream: relayStream as unknown as DestinationStream,\n });\n }\n\n return {\n destination: pino.multistream(streams),\n transports,\n };\n}\n\nfunction toArray<T>(value: T | T[] | undefined): T[] {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction createHttpTransportStream<TContext extends LoggerContext>(\n transport: DiscordTransport | TelegramTransport | CloudWatchTransport | ZohoCliqTransport,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n state: LoggerState<TContext>,\n respectOverrides: boolean,\n): Writable {\n return new Writable({\n write(chunk: Buffer, _encoding: string, callback) {\n const line = chunk.toString().trim();\n if (!line) {\n callback();\n return;\n }\n\n const log = parseLogLine(line);\n if (!log) {\n callback();\n return;\n }\n\n if (!shouldPassTransport(log, level, rules, state, respectOverrides)) {\n callback();\n return;\n }\n\n const levelName = getLevelName(log.level);\n const storeContext = state.store.getStore();\n\n const meta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(log)) {\n if (!RESERVED_LOG_FIELDS.has(key)) {\n meta[key] = value;\n }\n }\n\n if (storeContext) {\n Object.assign(meta, storeContext);\n }\n\n transport.log({\n level: levelName,\n message: log.msg || '',\n context: log.context,\n timestamp: new Date(log.time),\n ...meta,\n }, callback);\n },\n });\n}\n","const DEFAULT_SECRET_PATTERNS = [\n 'password',\n 'secret',\n 'token',\n 'apikey',\n 'api_key',\n 'api-key',\n 'auth',\n 'credential',\n 'private',\n];\n\nconst DEFAULT_MASK = '***';\n\nexport interface MaskSecretsOptions {\n patterns?: string[];\n mask?: string;\n deep?: boolean;\n}\n\ninterface ResolvedOptions {\n /** Single combined case-insensitive regex; one .test() per key replaces N includes() + toLowerCase. */\n secretRe: RegExp;\n mask: string;\n deep: boolean;\n}\n\nconst REGEX_ESCAPE_RE = /[.*+?^${}()|[\\]\\\\]/g;\n\nfunction buildSecretRe(patterns: string[]): RegExp {\n const escaped = patterns.map((p) => p.replace(REGEX_ESCAPE_RE, '\\\\$&'));\n return new RegExp(escaped.join('|'), 'i');\n}\n\n// Pre-built once at module load — avoids `new RegExp()` on every `maskSecrets()`\n// or `maskReplacer()` call when defaults are used (the common case).\nconst DEFAULT_SECRET_RE = buildSecretRe(DEFAULT_SECRET_PATTERNS);\nconst DEFAULT_RESOLVED: ResolvedOptions = {\n secretRe: DEFAULT_SECRET_RE,\n mask: DEFAULT_MASK,\n deep: true,\n};\n\nfunction resolveOptions(options: MaskSecretsOptions): ResolvedOptions {\n // Fast path: defaults — return shared singleton, zero allocation.\n if (\n options.patterns === undefined &&\n options.mask === undefined &&\n options.deep === undefined\n ) {\n return DEFAULT_RESOLVED;\n }\n const { patterns = DEFAULT_SECRET_PATTERNS, mask = DEFAULT_MASK, deep = true } = options;\n return {\n secretRe: patterns === DEFAULT_SECRET_PATTERNS ? DEFAULT_SECRET_RE : buildSecretRe(patterns),\n mask,\n deep,\n };\n}\n\nfunction isSecretKey(key: string, secretRe: RegExp): boolean {\n return secretRe.test(key);\n}\n\nfunction maskUrlCredentials(url: string, mask: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.password) {\n parsed.password = mask;\n }\n if (parsed.username && parsed.password) {\n parsed.username = mask;\n }\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nfunction maskString(str: string, mask: string): string {\n // Cheap pre-checks before the O(n) indexOf scan and URL parse:\n // 1. Too short to be `http(s)://x:y@h` (10 chars min).\n // 2. First char must be 'h' (104) — bails on the vast majority of strings\n // with a single charCodeAt, no allocation.\n // 3. Then verify http/https prefix.\n // 4. Only then scan for '@'.\n if (str.length < 10) return str;\n if (str.charCodeAt(0) !== 104) return str;\n if (!str.startsWith('http://') && !str.startsWith('https://')) return str;\n if (str.indexOf('@') === -1) return str;\n return maskUrlCredentials(str, mask);\n}\n\nfunction maskInternal(obj: unknown, opts: ResolvedOptions): unknown {\n if (obj === null || obj === undefined) return obj;\n\n const t = typeof obj;\n if (t === 'string') return maskString(obj as string, opts.mask);\n if (t !== 'object') return obj;\n\n if (Array.isArray(obj)) {\n return opts.deep ? obj.map((item) => maskInternal(item, opts)) : obj;\n }\n\n const { secretRe, mask, deep } = opts;\n const result: Record<string | symbol, unknown> = {};\n\n // Symbol-keyed properties are preserved on the clone; JSON.stringify drops\n // them, but external callers may pass objects where these matter.\n const syms = Object.getOwnPropertySymbols(obj);\n for (let i = 0; i < syms.length; i++) {\n const sym = syms[i];\n result[sym] = (obj as Record<symbol, unknown>)[sym];\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (isSecretKey(key, secretRe)) {\n result[key] = mask;\n continue;\n }\n const vt = typeof value;\n if (vt === 'string') {\n result[key] = maskString(value as string, mask);\n } else if (deep && vt === 'object' && value !== null) {\n result[key] = maskInternal(value, opts);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\nexport function maskSecrets(\n obj: unknown,\n options: MaskSecretsOptions = {},\n): unknown {\n return maskInternal(obj, resolveOptions(options));\n}\n\nexport function createMasker(options: MaskSecretsOptions = {}) {\n const opts = resolveOptions(options);\n return (obj: unknown): unknown => maskInternal(obj, opts);\n}\n\nexport type MaskReplacer = (this: unknown, key: string, value: unknown) => unknown;\n\n/**\n * Returns a `JSON.stringify` replacer that masks secret-named keys and URL\n * credentials in-place during serialization. Unlike `maskSecrets`/`createMasker`\n * it allocates no intermediate object — the recursion is driven by `JSON.stringify`.\n *\n * Use it as `JSON.stringify(value, maskReplacer())` or\n * `JSON.stringify(value, maskReplacer(), 2)`.\n */\nexport function maskReplacer(options: MaskSecretsOptions = {}): MaskReplacer {\n const { secretRe, mask } = resolveOptions(options);\n return function (key, value) {\n // Hot path inlined: avoid extra function calls per key/value pair.\n // - Root call has key === '' (skip key check, fall through to string check).\n // - Most values are non-strings (objects/numbers/etc) — bail early.\n if (key !== '' && secretRe.test(key)) return mask;\n if (typeof value !== 'string') return value;\n // maskString hot path inlined for the same reason.\n if (value.length < 10) return value;\n if (value.charCodeAt(0) !== 104) return value;\n if (!value.startsWith('http://') && !value.startsWith('https://')) return value;\n if (value.indexOf('@') === -1) return value;\n return maskUrlCredentials(value, mask);\n };\n}\n","import { hostname as osHostname } from 'os';\nimport pino, { type Logger as PinoBaseLogger, type DestinationStream, type LoggerOptions } from 'pino';\nimport { LoggerStore } from './store.js';\nimport {\n LOG_LEVELS,\n assertLogLevel,\n type LoggerConfig,\n type LoggerContext,\n type LevelOverride,\n type LogLevel,\n type LevelConfig,\n type CallerConfig,\n} from './types.js';\nimport { createStreams } from './streams.js';\nimport { createMasker, maskReplacer, type MaskReplacer } from './utils/mask-secrets.js';\nimport type { BaseHttpTransport } from './transports/base-http.js';\n\n// Custom levels for our logger\nconst CUSTOM_LEVELS = {\n http: 25,\n verbose: 25,\n silly: 10,\n} as const;\n\ntype CustomLevels = typeof CUSTOM_LEVELS;\ntype PinoLogger = PinoBaseLogger<keyof CustomLevels>;\n\nexport interface LoggerState<TContext extends LoggerContext> {\n pino: PinoLogger;\n store: LoggerStore<TContext>;\n defaultLevel: LogLevel;\n levelOverrides: Map<string, LevelOverride<TContext>>;\n // Index for O(1) context lookup\n contextIndex: Map<string, LevelOverride<TContext>>;\n // Complex rules that need full matching\n complexRules: LevelOverride<TContext>[];\n // Caller info config (undefined = disabled)\n callerConfig: CallerConfig | undefined;\n // HTTP transports for graceful shutdown\n transports: BaseHttpTransport[];\n /**\n * JSON.stringify replacer applied at format time when `maskSecrets` is\n * enabled. Undefined when masking is off — call sites short-circuit on this.\n */\n maskReplacer: MaskReplacer | undefined;\n /**\n * Object-cloning masker, applied once per HTTP transport message in\n * BaseHttpTransport.transformMessage. Undefined when masking is off.\n */\n maskerFn: ((value: unknown) => unknown) | undefined;\n}\n\nfunction parseLevelConfig(level: LevelConfig): { defaultLevel: LogLevel; rules: LevelOverride<LoggerContext>[] } {\n if (typeof level === 'string') {\n assertLogLevel(level);\n return { defaultLevel: level, rules: [] };\n }\n\n assertLogLevel(level.default);\n const rules: LevelOverride<LoggerContext>[] = (level.rules ?? []).map((rule) => {\n assertLogLevel(rule.level);\n return { match: rule.match, level: rule.level, readonly: true };\n });\n\n return { defaultLevel: level.default, rules };\n}\n\nfunction buildIndexes<TContext extends LoggerContext>(\n overrides: Map<string, LevelOverride<TContext>>,\n): { contextIndex: Map<string, LevelOverride<TContext>>; complexRules: LevelOverride<TContext>[] } {\n const contextIndex = new Map<string, LevelOverride<TContext>>();\n const complexRules: LevelOverride<TContext>[] = [];\n\n for (const override of overrides.values()) {\n const keys = Object.keys(override.match);\n // Simple rule: only has 'context' key\n if (keys.length === 1 && keys[0] === 'context' && typeof override.match.context === 'string') {\n contextIndex.set(override.match.context, override);\n } else {\n complexRules.push(override);\n }\n }\n\n return { contextIndex, complexRules };\n}\n\n/**\n * Produces a stable string key from a match object so that two calls with the\n * same fields in different declaration order hit the same entry in\n * `levelOverrides`. Without this, `setLevelOverride({a:1, b:2}, ...)` and\n * `setLevelOverride({b:2, a:1}, ...)` would create two distinct entries.\n */\nexport function canonicalMatchKey(match: Record<string, unknown>): string {\n const keys = Object.keys(match).sort();\n const sorted: Record<string, unknown> = {};\n for (const key of keys) {\n sorted[key] = match[key];\n }\n return JSON.stringify(sorted);\n}\n\nexport function createState<TContext extends LoggerContext>(\n config: LoggerConfig,\n store?: LoggerStore<TContext>,\n): LoggerState<TContext> {\n const { defaultLevel, rules } = parseLevelConfig(config.level);\n\n const loggerStore = store ?? new LoggerStore<TContext>();\n\n const levelOverrides = new Map<string, LevelOverride<TContext>>();\n for (const rule of rules) {\n const key = canonicalMatchKey(rule.match);\n levelOverrides.set(key, rule as LevelOverride<TContext>);\n }\n\n const { contextIndex, complexRules } = buildIndexes(levelOverrides);\n\n // Build a partially-populated state first so streams can read from it.\n // Fields populated after createStreams:\n // - pino (needs the multistream destination)\n // - transports (returned from createStreams)\n // We keep contextIndex as a stable Map reference so streams see override\n // mutations done via rebuildIndexes().\n const maskOptions = config.maskSecrets === true ? {} : config.maskSecrets || undefined;\n const state: LoggerState<TContext> = {\n pino: null as unknown as PinoLogger,\n store: loggerStore,\n defaultLevel,\n levelOverrides,\n contextIndex,\n complexRules,\n callerConfig: undefined,\n transports: [],\n maskReplacer: maskOptions ? maskReplacer(maskOptions) : undefined,\n maskerFn: maskOptions ? createMasker(maskOptions) : undefined,\n };\n\n const { destination, transports } = createStreams(config, state);\n state.transports = transports;\n\n const options: LoggerOptions<keyof CustomLevels> = {\n level: 'trace', // Accept all, we filter in shouldLog()\n customLevels: CUSTOM_LEVELS,\n base: { hostname: config.hostname ?? osHostname() },\n };\n\n state.pino = pino(options, destination) as PinoLogger;\n\n // Parse caller config\n if (config.caller === true) {\n state.callerConfig = {}; // Use defaults\n } else if (config.caller && typeof config.caller === 'object') {\n state.callerConfig = config.caller;\n }\n\n return state;\n}\n\nexport function rebuildIndexes<TContext extends LoggerContext>(state: LoggerState<TContext>): void {\n const { contextIndex, complexRules } = buildIndexes(state.levelOverrides);\n // Streams and log-level checks read `state.contextIndex` / `state.complexRules`\n // lazily through the state reference, so an atomic reassignment is enough.\n // In-place mutation would be O(n) per override change; reassignment is O(1)\n // and never leaves the indexes visibly partial between statements.\n state.contextIndex = contextIndex;\n state.complexRules = complexRules;\n}\n\nexport function shouldLog<TContext extends LoggerContext>(\n state: LoggerState<TContext>,\n level: LogLevel,\n context?: string,\n): boolean {\n const effectiveLevel = getEffectiveLevel(state, context);\n if (effectiveLevel === 'off') return false;\n return LOG_LEVELS[level] <= LOG_LEVELS[effectiveLevel];\n}\n\nfunction getEffectiveLevel<TContext extends LoggerContext>(\n state: LoggerState<TContext>,\n loggerContext?: string,\n): LogLevel {\n // O(1) lookup for simple context-only rules\n if (loggerContext) {\n const indexed = state.contextIndex.get(loggerContext);\n if (indexed) return indexed.level;\n }\n\n // Check complex rules O(k) where k << n\n const storeContext = state.store.getStore();\n for (const { match, level } of state.complexRules) {\n if (matchesContext(storeContext, loggerContext, match)) {\n return level;\n }\n }\n\n return state.defaultLevel;\n}\n\nexport function matchesContext(\n storeContext: LoggerContext | undefined,\n loggerContext: string | undefined,\n match: Record<string, unknown> & { context?: string },\n logMeta?: Record<string, unknown>,\n): boolean {\n const combined: Record<string, unknown> = { ...logMeta, ...storeContext, context: loggerContext };\n return Object.entries(match).every(([key, value]) => combined[key] === value);\n}\n\n/**\n * Returns the effective level from **runtime** overrides (setLevelOverride at\n * the API level), or `undefined` if no runtime override matches.\n *\n * Static `level.rules` from LoggerConfig are flagged `readonly: true` and are\n * deliberately excluded here — those represent baseline configuration and\n * should still be filterable by a transport's own `level`/`rules`. Only\n * dynamic, user-initiated overrides (e.g. from an HTTP debug endpoint) bypass\n * transport filters so targeted troubleshooting is guaranteed visible.\n */\nexport function getGlobalOverrideLevel<TContext extends LoggerContext>(\n state: LoggerState<TContext>,\n loggerContext: string | undefined,\n logMeta: Record<string, unknown>,\n): LogLevel | undefined {\n if (loggerContext) {\n const indexed = state.contextIndex.get(loggerContext);\n if (indexed && !indexed.readonly) return indexed.level;\n }\n const storeContext = state.store.getStore();\n for (const override of state.complexRules) {\n if (override.readonly) continue;\n if (matchesContext(storeContext, loggerContext, override.match, logMeta)) {\n return override.level;\n }\n }\n return undefined;\n}\n","import { z } from 'zod';\nimport type {\n LogLevel,\n LogFormat,\n LevelRule,\n ConsoleConfig,\n FileConfig,\n HttpTransportBaseConfig,\n DiscordConfig,\n TelegramConfig,\n CloudWatchConfig,\n ZohoCliqConfig,\n RelayConfig,\n LevelConfigObject,\n LevelConfig,\n LoggerConfig,\n CallerConfig,\n LogStreamPattern,\n LogStreamPatternConfig,\n LogStreamTemplateConfig,\n LogStreamName,\n AutoShutdownConfig,\n} from './types.js';\n\n// Log Level\nexport const LogLevelSchema: z.ZodType<LogLevel> = z.enum([\n 'off',\n 'error',\n 'warn',\n 'info',\n 'http',\n 'verbose',\n 'debug',\n 'silly',\n]);\n\n// Log Format\nexport const LogFormatSchema: z.ZodType<LogFormat> = z.enum(['json', 'plain', 'logfmt', 'simple']);\n\n// Level Rule\nexport const LevelRuleSchema: z.ZodType<LevelRule> = z.object({\n match: z.record(z.string(), z.unknown()),\n level: LogLevelSchema,\n});\n\n// Console Config\nexport const ConsoleConfigSchema: z.ZodType<ConsoleConfig> = z.object({\n format: LogFormatSchema,\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n respectRuntimeOverrides: z.boolean().optional(),\n});\n\n// File Config\nexport const FileConfigSchema: z.ZodType<FileConfig> = z.object({\n format: LogFormatSchema,\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n respectRuntimeOverrides: z.boolean().optional(),\n dirname: z.string().min(1, 'dirname is required'),\n filename: z.string().min(1, 'filename is required'),\n datePattern: z.string().optional(),\n interval: z.string().regex(/^\\d+[Mdhms]$/).optional(),\n zippedArchive: z.boolean().optional(),\n maxSize: z.string().optional(),\n maxFiles: z.string().optional(),\n});\n\n// HTTP Transport Base Config\nexport const HttpTransportBaseConfigSchema: z.ZodType<HttpTransportBaseConfig> = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n respectRuntimeOverrides: z.boolean().optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n});\n\n// Discord Config\nexport const DiscordConfigSchema: z.ZodType<DiscordConfig> = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n respectRuntimeOverrides: z.boolean().optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n webhookUrl: z.string().url('webhookUrl must be a valid URL'),\n format: z.enum(['embed', 'markdown']).optional(),\n username: z.string().optional(),\n avatarUrl: z.string().url().optional(),\n embedColors: z.record(z.string(), z.number().int()).optional(),\n includeTimestamp: z.boolean().optional(),\n includeMeta: z.boolean().optional(),\n maxEmbedFields: z.number().int().min(1).max(25).optional(),\n});\n\n// Telegram Config\nexport const TelegramConfigSchema: z.ZodType<TelegramConfig> = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n respectRuntimeOverrides: z.boolean().optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n botToken: z.string().min(1, 'botToken is required'),\n chatId: z.union([z.string(), z.number()]),\n parseMode: z.enum(['Markdown', 'MarkdownV2', 'HTML']).optional(),\n disableNotification: z.boolean().optional(),\n threadId: z.number().int().optional(),\n replyToMessageId: z.number().int().optional(),\n});\n\n// Log Stream Name patterns and config\nexport const LogStreamPatternSchema: z.ZodType<LogStreamPattern> = z.enum([\n 'hostname',\n 'hostname-date',\n 'hostname-uuid',\n 'date',\n 'uuid',\n]);\n\nexport const LogStreamPatternConfigSchema: z.ZodType<LogStreamPatternConfig> = z.object({\n pattern: LogStreamPatternSchema,\n});\n\nexport const LogStreamTemplateConfigSchema: z.ZodType<LogStreamTemplateConfig> = z.object({\n template: z.string().min(1, 'template is required'),\n});\n\nexport const LogStreamNameSchema: z.ZodType<LogStreamName> = z.union([\n z.string().min(1, 'logStreamName string must not be empty'),\n LogStreamPatternConfigSchema,\n LogStreamTemplateConfigSchema,\n]);\n\n// CloudWatch Config\nexport const CloudWatchConfigSchema: z.ZodType<CloudWatchConfig> = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n respectRuntimeOverrides: z.boolean().optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n logGroupName: z.string().min(1, 'logGroupName is required'),\n logStreamName: LogStreamNameSchema.optional(),\n region: z.string().min(1, 'region is required'),\n accessKeyId: z.string().min(1, 'accessKeyId is required'),\n secretAccessKey: z.string().min(1, 'secretAccessKey is required'),\n createLogGroup: z.boolean().optional(),\n createLogStream: z.boolean().optional(),\n});\n\n// Zoho Cliq Config\nconst ZohoCliqConfigBaseSchema = z.object({\n level: LogLevelSchema.optional(),\n rules: z.array(LevelRuleSchema).optional(),\n respectRuntimeOverrides: z.boolean().optional(),\n batchSize: z.number().int().positive().optional(),\n flushInterval: z.number().int().positive().optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n retryDelay: z.number().int().positive().optional(),\n onError: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onError']>,\n onDrop: z.function().optional() as z.ZodType<HttpTransportBaseConfig['onDrop']>,\n maxQueueSize: z.number().int().positive().optional(),\n dropPolicy: z.enum(['drop-oldest', 'drop-newest']).optional(),\n requestTimeout: z.number().int().positive().optional(),\n webhookUrl: z.string().url().optional(),\n companyId: z.string().min(1).optional(),\n channel: z.string().min(1).optional(),\n region: z.string().min(1).optional(),\n apiKey: z.string().min(1, 'apiKey is required'),\n broadcast: z.boolean().optional(),\n bot: z.object({\n name: z.string().min(1),\n image: z.string().url().optional(),\n }).optional(),\n includeTimestamp: z.boolean().optional(),\n includeMeta: z.boolean().optional(),\n});\n\nexport const ZohoCliqConfigSchema = ZohoCliqConfigBaseSchema.refine(\n (cfg) => Boolean(cfg.webhookUrl) || (Boolean(cfg.companyId) && Boolean(cfg.channel)),\n { message: 'Either webhookUrl or both companyId and channel must be provided' },\n) satisfies z.ZodType<ZohoCliqConfig>;\n\n// Relay Config\nexport const RelayConfigSchema: z.ZodType<RelayConfig> = z.object({\n apiUrl: z.string().url('apiUrl must be a valid URL'),\n token: z.string().min(1, 'token is required'),\n pollInterval: z.number().int().positive().optional(),\n bufferSize: z.number().int().positive().optional(),\n reconnectDelay: z.number().int().positive().optional(),\n maxReconnectDelay: z.number().int().positive().optional(),\n respectRuntimeOverrides: z.boolean().optional(),\n allowedWsHosts: z.array(z.string()).optional(),\n maskSecrets: z.union([\n z.boolean(),\n z.object({\n patterns: z.array(z.string()).optional(),\n mask: z.string().optional(),\n deep: z.boolean().optional(),\n }),\n ]).optional(),\n});\n\n// Level Config Object\nexport const LevelConfigObjectSchema: z.ZodType<LevelConfigObject> = z.object({\n default: LogLevelSchema,\n rules: z.array(LevelRuleSchema).optional(),\n});\n\n// Level Config (string or object)\nexport const LevelConfigSchema: z.ZodType<LevelConfig> = z.union([\n LogLevelSchema,\n LevelConfigObjectSchema,\n]);\n\n// Caller Config\nexport const CallerConfigSchema: z.ZodType<CallerConfig> = z.object({\n depth: z.number().int().nonnegative().optional(),\n fullPath: z.boolean().optional(),\n});\n\n// Auto Shutdown Config\nexport const AutoShutdownConfigSchema: z.ZodType<AutoShutdownConfig> = z.object({\n timeout: z.number().int().positive().optional(),\n signals: z.array(z.string()).optional() as z.ZodType<NodeJS.Signals[] | undefined>,\n});\n\nconst MaskSecretsOptionsSchema = z.object({\n patterns: z.array(z.string()).optional(),\n mask: z.string().optional(),\n deep: z.boolean().optional(),\n});\n\n// Logger Config\nexport const LoggerConfigSchema = z.object({\n level: LevelConfigSchema,\n console: ConsoleConfigSchema,\n file: FileConfigSchema.optional(),\n discord: z.union([DiscordConfigSchema, z.array(DiscordConfigSchema)]).optional(),\n telegram: z.union([TelegramConfigSchema, z.array(TelegramConfigSchema)]).optional(),\n cloudwatch: z.union([CloudWatchConfigSchema, z.array(CloudWatchConfigSchema)]).optional(),\n zohoCliq: z.union([ZohoCliqConfigSchema, z.array(ZohoCliqConfigSchema)]).optional(),\n relay: RelayConfigSchema.optional(),\n caller: z.union([z.boolean(), CallerConfigSchema]).optional(),\n hostname: z.string().optional(),\n autoShutdown: z.union([z.boolean(), AutoShutdownConfigSchema]).optional(),\n maskSecrets: z.union([z.boolean(), MaskSecretsOptionsSchema]).optional(),\n}) satisfies z.ZodType<LoggerConfig>;\n\n// Validation function\nexport function validateConfig(config: unknown): z.infer<typeof LoggerConfigSchema> {\n return LoggerConfigSchema.parse(config);\n}\n\n// Safe validation (returns result instead of throwing)\nexport function safeValidateConfig(config: unknown) {\n return LoggerConfigSchema.safeParse(config);\n}\n","import type { CallerConfig, CallerInfo } from '../types.js';\nimport { basename, relative } from 'node:path';\n\n// Default stack depth offset:\n// 0: Error\n// 1: getCallerInfo\n// 2: log method (private)\n// 3: public method (info, error, etc.)\n// 4: actual caller\nconst BASE_STACK_OFFSET = 4;\n\n// Regex to parse V8 stack trace lines\n// Matches: \" at functionName (file:line:column)\" or \" at file:line:column\"\nconst STACK_LINE_REGEX = /^\\s*at\\s+(?:(.+?)\\s+\\()?(.+):(\\d+):(\\d+)\\)?$/;\n\nexport function getCallerInfo(config: CallerConfig, additionalOffset = 0): CallerInfo | undefined {\n const depth = config.depth ?? 0;\n const targetFrame = BASE_STACK_OFFSET + depth + additionalOffset;\n\n const originalPrepare = Error.prepareStackTrace;\n const originalLimit = Error.stackTraceLimit;\n\n try {\n // Capture more frames than we need\n Error.stackTraceLimit = targetFrame + 5;\n\n const err = new Error();\n const stack = err.stack;\n\n if (!stack) {\n return undefined;\n }\n\n const lines = stack.split('\\n');\n const targetLine = lines[targetFrame];\n\n if (!targetLine) {\n return undefined;\n }\n\n const match = targetLine.match(STACK_LINE_REGEX);\n if (!match) {\n return undefined;\n }\n\n const [, fnName, filePath, lineStr, colStr] = match;\n const line = parseInt(lineStr, 10);\n const column = parseInt(colStr, 10);\n\n // Process file path\n let file = filePath;\n\n // Handle file:// URLs (ESM)\n if (file.startsWith('file://')) {\n file = file.slice(7);\n }\n\n // Shorten path if fullPath is not enabled\n if (!config.fullPath) {\n // Try relative path first, fall back to basename\n try {\n const relativePath = relative(process.cwd(), file);\n // If relative path goes up too many directories, use basename\n if (relativePath.startsWith('..') && relativePath.split('/').filter(p => p === '..').length > 2) {\n file = basename(file);\n } else {\n file = relativePath;\n }\n } catch {\n file = basename(file);\n }\n }\n\n return {\n file,\n line,\n column: isNaN(column) ? undefined : column,\n function: fnName && fnName !== '<anonymous>' ? fnName : undefined,\n };\n } finally {\n Error.prepareStackTrace = originalPrepare;\n Error.stackTraceLimit = originalLimit;\n }\n}\n\nexport function formatCallerInfo(info: CallerInfo): string {\n const location = `${info.file}:${info.line}`;\n if (info.function) {\n return `${info.function} (${location})`;\n }\n return location;\n}\n","import type { Logger } from '../logger.js';\nimport type { LoggerContext } from '../types.js';\n\nexport interface GracefulShutdownOptions {\n /** Timeout in ms before forcing exit (default: 5000) */\n timeout?: number;\n /** Exit code on successful shutdown (default: 0) */\n exitCode?: number;\n /** Custom signals to handle (default: ['SIGTERM', 'SIGINT']) */\n signals?: NodeJS.Signals[];\n /** Called before shutdown starts */\n onShutdown?: () => void | Promise<void>;\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<GracefulShutdownOptions, 'onShutdown'>> = {\n timeout: 5000,\n exitCode: 0,\n signals: ['SIGTERM', 'SIGINT'],\n};\n\nlet registered = false;\n\n/**\n * Register graceful shutdown handlers for the logger.\n * Ensures all buffered logs are flushed before process exit.\n *\n * @example\n * ```typescript\n * const logger = Logger.create(config);\n * registerShutdown(logger);\n *\n * // Or with options:\n * registerShutdown(logger, {\n * timeout: 10000,\n * onShutdown: () => console.log('Shutting down...'),\n * });\n * ```\n */\nexport function registerShutdown<TContext extends LoggerContext>(\n logger: Logger<TContext>,\n options: GracefulShutdownOptions = {},\n): () => Promise<void> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const shutdown = async (signal?: string): Promise<void> => {\n if (signal) {\n console.error(`[Logger] Received ${signal}, shutting down gracefully...`);\n }\n\n try {\n // Call user's onShutdown hook\n if (opts.onShutdown) {\n await opts.onShutdown();\n }\n\n // Create a timeout promise\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Shutdown timed out after ${opts.timeout}ms`));\n }, opts.timeout);\n });\n\n // Race between shutdown and timeout\n await Promise.race([\n logger.shutdown(),\n timeoutPromise,\n ]);\n\n if (signal) {\n console.error('[Logger] Graceful shutdown completed');\n process.exit(opts.exitCode);\n }\n } catch (error) {\n console.error('[Logger] Shutdown error:', error instanceof Error ? error.message : error);\n if (signal) {\n process.exit(1);\n }\n }\n };\n\n // Only register handlers once\n if (!registered) {\n for (const signal of opts.signals) {\n process.on(signal, () => void shutdown(signal));\n }\n\n // Also handle uncaught exceptions and unhandled rejections\n process.on('beforeExit', () => void shutdown());\n\n registered = true;\n }\n\n // Return manual shutdown function\n return shutdown;\n}\n","import type { AxiosError } from 'axios';\n\n/**\n * HTTP error data extracted from axios/fetch errors\n */\nexport interface HttpErrorData {\n /** HTTP status code (e.g., 400, 500) */\n status?: number;\n /** HTTP status text (e.g., \"Bad Request\") */\n statusText?: string;\n /** Response body data */\n responseData?: unknown;\n /** Request URL */\n url?: string;\n /** HTTP method (GET, POST, etc.) */\n method?: string;\n /** Error code (e.g., ECONNREFUSED, ETIMEDOUT) */\n code?: string;\n}\n\n/**\n * Serialized error data for logging\n */\nexport interface SerializedError {\n /** Error message */\n errorMessage: string;\n /** Stack trace */\n stack?: string;\n /** HTTP-specific data if present */\n http?: HttpErrorData;\n /** Error code for non-HTTP errors */\n code?: string;\n /** Error name/type */\n errorName?: string;\n}\n\n/**\n * Type guard for axios errors\n */\nfunction isAxiosError(error: unknown): error is AxiosError {\n return (\n error !== null &&\n typeof error === 'object' &&\n 'isAxiosError' in error &&\n (error as AxiosError).isAxiosError === true\n );\n}\n\n/**\n * Sanitizes response data to ensure it's safe for JSON serialization.\n * Truncates large strings and limits array/object sizes.\n */\nfunction sanitizeResponseData(data: unknown, maxStringLength = 10000): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n if (typeof data === 'string') {\n return data.length > maxStringLength ? `${data.slice(0, maxStringLength)}...[truncated]` : data;\n }\n\n if (typeof data === 'number' || typeof data === 'boolean') {\n return data;\n }\n\n if (Array.isArray(data)) {\n return data.slice(0, 100).map((item) => sanitizeResponseData(item, maxStringLength));\n }\n\n if (typeof data === 'object') {\n const result: Record<string, unknown> = {};\n const entries = Object.entries(data as Record<string, unknown>);\n for (const [key, value] of entries.slice(0, 50)) {\n result[key] = sanitizeResponseData(value, maxStringLength);\n }\n return result;\n }\n\n return String(data);\n}\n\n/**\n * Extracts HTTP data from axios error\n */\nfunction extractAxiosHttpData(error: AxiosError): HttpErrorData {\n const httpData: HttpErrorData = {};\n\n if (error.code) {\n httpData.code = error.code;\n }\n\n if (error.response) {\n httpData.status = error.response.status;\n httpData.statusText = error.response.statusText;\n if (error.response.data !== undefined) {\n httpData.responseData = sanitizeResponseData(error.response.data);\n }\n }\n\n if (error.config) {\n const { url, baseURL, method } = error.config;\n if (url) {\n httpData.url = baseURL && !url.startsWith('http') ? `${baseURL}${url}` : url;\n }\n if (method) {\n httpData.method = method.toUpperCase();\n }\n }\n\n return httpData;\n}\n\n/**\n * Extracts HTTP data from generic error object (fetch-style or custom)\n */\nfunction extractGenericHttpData(error: Record<string, unknown>): HttpErrorData | undefined {\n const httpData: HttpErrorData = {};\n let hasData = false;\n\n if (typeof error.code === 'string') {\n httpData.code = error.code;\n hasData = true;\n }\n\n const response = error.response as Record<string, unknown> | undefined;\n if (response && typeof response === 'object') {\n if (typeof response.status === 'number') {\n httpData.status = response.status;\n hasData = true;\n }\n if (typeof response.statusText === 'string') {\n httpData.statusText = response.statusText;\n hasData = true;\n }\n if (response.data !== undefined) {\n httpData.responseData = sanitizeResponseData(response.data);\n hasData = true;\n }\n }\n\n const config = error.config as Record<string, unknown> | undefined;\n if (config && typeof config === 'object') {\n const url = config.url as string | undefined;\n const baseURL = config.baseURL as string | undefined;\n if (typeof url === 'string') {\n httpData.url = baseURL && !url.startsWith('http') ? `${baseURL}${url}` : url;\n hasData = true;\n }\n if (typeof config.method === 'string') {\n httpData.method = config.method.toUpperCase();\n hasData = true;\n }\n }\n\n return hasData ? httpData : undefined;\n}\n\n/**\n * Serializes an Error object for logging, extracting HTTP-specific data\n * from axios/fetch errors while preserving standard error properties.\n *\n * @example\n * // Axios error\n * try {\n * await axios.get('/api/data');\n * } catch (error) {\n * const serialized = serializeError(error);\n * // serialized.http.status = 400\n * // serialized.http.responseData = { error: \"invalid input\" }\n * }\n */\nexport function serializeError(error: unknown): SerializedError {\n if (!(error instanceof Error)) {\n if (error === null || error === undefined) {\n return { errorMessage: 'Unknown error' };\n }\n if (typeof error === 'string') {\n return { errorMessage: error };\n }\n const httpData = typeof error === 'object' ? extractGenericHttpData(error as Record<string, unknown>) : undefined;\n return {\n errorMessage: String(error),\n http: httpData,\n };\n }\n\n const serialized: SerializedError = {\n errorMessage: error.message,\n stack: error.stack,\n };\n\n if (error.name && error.name !== 'Error') {\n serialized.errorName = error.name;\n }\n\n // Handle axios errors with full type safety\n if (isAxiosError(error)) {\n serialized.http = extractAxiosHttpData(error);\n return serialized;\n }\n\n // Handle generic errors with HTTP-like properties\n const errWithCode = error as Error & { code?: string };\n if (typeof errWithCode.code === 'string') {\n serialized.code = errWithCode.code;\n }\n\n const httpData = extractGenericHttpData(error as unknown as Record<string, unknown>);\n if (httpData) {\n serialized.http = httpData;\n }\n\n return serialized;\n}\n","import { LoggerStore } from './store.js';\nimport {\n canonicalMatchKey,\n createState,\n getGlobalOverrideLevel,\n shouldLog,\n rebuildIndexes,\n type LoggerState,\n} from './state.js';\nimport { validateConfig } from './schema.js';\nimport { assertLogLevel, type LoggerConfig, type LoggerContext, type LevelOverride, type LevelOverrideMatch, type LogLevel, type Meta } from './types.js';\nimport { getCallerInfo, formatCallerInfo } from './utils/caller.js';\nimport { registerShutdown } from './utils/shutdown.js';\nimport { serializeError } from './utils/error.js';\n\nexport class Logger<TContext extends LoggerContext = LoggerContext> {\n // Lazy: `.for()` creates many child loggers (hot path), most never call\n // `profile()`. Allocating a fresh Map per child wastes ~200 bytes each and\n // caused OOM in benchmarks creating millions of children.\n private profileTimers?: Map<string, number>;\n\n private constructor(\n private state: LoggerState<TContext>,\n private context: string,\n ) {}\n\n static create<TContext extends LoggerContext = LoggerContext>(\n config: LoggerConfig,\n store?: LoggerStore<TContext>,\n ): Logger<TContext> {\n const validatedConfig = validateConfig(config);\n const state = createState(validatedConfig as LoggerConfig, store);\n const logger = new Logger<TContext>(state, 'APP');\n\n // Auto-register shutdown handlers if configured\n if (validatedConfig.autoShutdown) {\n const shutdownConfig = typeof validatedConfig.autoShutdown === 'object'\n ? validatedConfig.autoShutdown\n : {};\n registerShutdown(logger, shutdownConfig);\n }\n\n return logger;\n }\n\n for(context: string): Logger<TContext> {\n return new Logger(this.state, context);\n }\n\n // State accessors\n\n getStore(): LoggerStore<TContext> {\n return this.state.store;\n }\n\n setLevelOverride(match: LevelOverrideMatch<TContext>, level: LogLevel): void {\n assertLogLevel(level);\n const key = canonicalMatchKey(match);\n this.state.levelOverrides.set(key, { match, level });\n rebuildIndexes(this.state);\n }\n\n removeLevelOverride(match: LevelOverrideMatch<TContext>): boolean {\n const key = canonicalMatchKey(match);\n const override = this.state.levelOverrides.get(key);\n if (override?.readonly) {\n return false;\n }\n const deleted = this.state.levelOverrides.delete(key);\n if (deleted) {\n rebuildIndexes(this.state);\n }\n return deleted;\n }\n\n clearLevelOverrides(): void {\n let changed = false;\n for (const [key, override] of this.state.levelOverrides) {\n if (!override.readonly) {\n this.state.levelOverrides.delete(key);\n changed = true;\n }\n }\n if (changed) {\n rebuildIndexes(this.state);\n }\n }\n\n getLevelOverrides(): LevelOverride<TContext>[] {\n return Array.from(this.state.levelOverrides.values());\n }\n\n // Shutdown\n\n /**\n * Gracefully shutdown the logger, flushing all pending messages.\n * Should be called before process exit to ensure no logs are lost.\n *\n * `timeoutMs` is forwarded to each transport's `close()` as a per-transport\n * cap; it prevents a dead transport from blocking the whole shutdown.\n * Default: 5000ms. Pass `Infinity` for legacy unbounded behaviour.\n */\n async shutdown(timeoutMs = 5000): Promise<void> {\n const closePromises = this.state.transports.map((transport) => transport.close(timeoutMs));\n await Promise.all(closePromises);\n }\n\n // Profiling\n\n profile(id: string, meta?: object): void {\n const timers = (this.profileTimers ??= new Map<string, number>());\n const existing = timers.get(id);\n if (existing) {\n const duration = Date.now() - existing;\n timers.delete(id);\n this.info(`${id} completed`, { ...meta, durationMs: duration });\n } else {\n timers.set(id, Date.now());\n }\n }\n\n // Logging methods\n\n /**\n * Log an error. Supported shapes:\n * error(message: string)\n * error(message: string, meta)\n * error(error: Error | unknown)\n * error(error: Error | unknown, message: string)\n * error(error: Error | unknown, meta)\n * error(error: Error | unknown, message: string, meta)\n *\n * The first argument is treated as an error value whenever it is not a string.\n * Non-Error values (plain objects, numbers, etc. — e.g. anything caught by\n * TypeScript's `catch (err)` clause, which is typed as `unknown`) are passed\n * through `serializeError` so they produce a sensible `errorMessage` and, when\n * possible, a `stack` / HTTP diagnostic payload.\n */\n error(errorOrMessage: Error | string | unknown, messageOrMeta?: string | Meta, meta?: Meta): void {\n if (!shouldLog(this.state, 'error', this.context)) return;\n\n if (typeof errorOrMessage === 'string') {\n // error(message), error(message, meta)\n this.log('error', errorOrMessage, messageOrMeta as Meta | undefined);\n return;\n }\n\n // Everything else (Error, plain objects, primitives, null, undefined) is\n // treated as an error value. `serializeError` handles the normalization.\n const errorValue = errorOrMessage;\n if (typeof messageOrMeta === 'string') {\n // (errorValue, message, meta?)\n this.log('error', messageOrMeta, meta, errorValue);\n } else {\n // (errorValue) or (errorValue, meta)\n // Fall back to the serialized message as the log line.\n const fallbackMessage =\n errorValue instanceof Error\n ? errorValue.message\n : serializeError(errorValue).errorMessage;\n this.log('error', fallbackMessage, messageOrMeta, errorValue);\n }\n }\n\n warn(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'warn', this.context)) return;\n this.log('warn', message, meta);\n }\n\n info(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'info', this.context)) return;\n this.log('info', message, meta);\n }\n\n http(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'http', this.context)) return;\n this.log('http', message, meta);\n }\n\n verbose(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'verbose', this.context)) return;\n this.log('verbose', message, meta);\n }\n\n debug(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'debug', this.context)) return;\n this.log('debug', message, meta);\n }\n\n silly(message: string, meta?: Meta): void {\n if (!shouldLog(this.state, 'silly', this.context)) return;\n this.log('silly', message, meta);\n }\n\n // Private\n\n private log(level: LogLevel, message: string, meta?: Meta, error?: Error | unknown, callerOffset = 0): void {\n const resolved = typeof meta === 'function' ? meta() : meta;\n const logMeta: Record<string, unknown> = { context: this.context, ...resolved };\n\n // Add store context\n const storeContext = this.state.store.getStore();\n if (storeContext) {\n Object.assign(logMeta, storeContext);\n }\n\n // M2: we already matched this log against runtime overrides at the logger\n // gate (shouldLog). Compute the matching override level once here and\n // embed it so downstream transports can honour it without re-running the\n // full matcher. Stripped before the log line hits the wire (see streams.ts).\n const overrideLevel = getGlobalOverrideLevel(this.state, this.context, logMeta);\n if (overrideLevel !== undefined) {\n logMeta.__or = overrideLevel;\n }\n\n // Add caller info if enabled\n if (this.state.callerConfig) {\n const callerInfo = getCallerInfo(this.state.callerConfig, callerOffset);\n if (callerInfo) {\n logMeta.caller = formatCallerInfo(callerInfo);\n }\n }\n\n if (error !== undefined) {\n const serialized = serializeError(error);\n logMeta.errorMessage = serialized.errorMessage;\n logMeta.stack = serialized.stack;\n if (serialized.errorName) {\n logMeta.errorName = serialized.errorName;\n }\n if (serialized.code) {\n logMeta.errorCode = serialized.code;\n }\n if (serialized.http) {\n logMeta.http = serialized.http;\n }\n }\n\n // Use pino's logging - it will handle the streams\n const pinoMethod = this.getPinoMethod(level);\n pinoMethod.call(this.state.pino, logMeta, message);\n }\n\n private getPinoMethod(level: LogLevel): (obj: object, msg: string) => void {\n switch (level) {\n case 'error':\n return this.state.pino.error.bind(this.state.pino);\n case 'warn':\n return this.state.pino.warn.bind(this.state.pino);\n case 'info':\n return this.state.pino.info.bind(this.state.pino);\n case 'http':\n case 'verbose':\n // Use info level for http/verbose as they map to 25\n return (obj: object, msg: string) => {\n (this.state.pino as any)[level](obj, msg);\n };\n case 'debug':\n return this.state.pino.debug.bind(this.state.pino);\n case 'silly':\n return (obj: object, msg: string) => {\n (this.state.pino as any).silly(obj, msg);\n };\n default:\n return this.state.pino.info.bind(this.state.pino);\n }\n }\n}\n","import { Logger } from './logger.js';\nimport { LoggerStore } from './store.js';\nimport type { LoggerConfig, LoggerContext, LevelOverride, LogLevel } from './types.js';\n\nexport interface SingletonLogger<TContext extends LoggerContext> {\n init(config: LoggerConfig, store?: LoggerStore<TContext>): Logger<TContext>;\n get(): Logger<TContext>;\n for(context: string): Logger<TContext>;\n getStore(): LoggerStore<TContext>;\n setLevelOverride(match: Partial<TContext>, level: LogLevel): void;\n removeLevelOverride(match: Partial<TContext>): void;\n getLevelOverrides(): LevelOverride<TContext>[];\n clearLevelOverrides(): void;\n}\n\nexport function createSingletonLogger<\n TContext extends LoggerContext = LoggerContext,\n>(): SingletonLogger<TContext> {\n let root: Logger<TContext> | null = null;\n\n const ensureInit = (): Logger<TContext> => {\n if (!root) {\n throw new Error('Logger not initialized. Call init(config) first.');\n }\n return root;\n };\n\n return {\n init(config: LoggerConfig, store?: LoggerStore<TContext>): Logger<TContext> {\n if (!root) {\n root = Logger.create(config, store);\n }\n return root;\n },\n\n get(): Logger<TContext> {\n return ensureInit();\n },\n\n for(context: string): Logger<TContext> {\n return ensureInit().for(context);\n },\n\n getStore(): LoggerStore<TContext> {\n return ensureInit().getStore();\n },\n\n setLevelOverride(match: Partial<TContext>, level: LogLevel): void {\n ensureInit().setLevelOverride(match, level);\n },\n\n removeLevelOverride(match: Partial<TContext>): void {\n ensureInit().removeLevelOverride(match);\n },\n\n getLevelOverrides(): LevelOverride<TContext>[] {\n return ensureInit().getLevelOverrides();\n },\n\n clearLevelOverrides(): void {\n ensureInit().clearLevelOverrides();\n },\n };\n}\n","export interface TimingResult {\n label: string;\n durationMs: number;\n durationFormatted: string;\n}\n\nexport interface Timer {\n end: () => TimingResult;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms.toFixed(2)}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(1);\n return `${minutes}m ${seconds}s`;\n}\n\nexport function createTimer(label: string): Timer {\n const start = performance.now();\n\n return {\n end(): TimingResult {\n const durationMs = performance.now() - start;\n return {\n label,\n durationMs,\n durationFormatted: formatDuration(durationMs),\n };\n },\n };\n}\n\nexport async function measureAsync<T>(\n label: string,\n fn: () => Promise<T>,\n): Promise<{ result: T; timing: TimingResult }> {\n const timer = createTimer(label);\n const result = await fn();\n const timing = timer.end();\n return { result, timing };\n}\n\nexport function measureSync<T>(\n label: string,\n fn: () => T,\n): { result: T; timing: TimingResult } {\n const timer = createTimer(label);\n const result = fn();\n const timing = timer.end();\n return { result, timing };\n}\n","import { randomUUID } from 'crypto';\n\nexport interface RequestIdOptions {\n prefix?: string;\n short?: boolean;\n}\n\nexport function generateRequestId(options: RequestIdOptions = {}): string {\n const { prefix, short = false } = options;\n const uuid = randomUUID();\n const id = short ? uuid.split('-')[0] : uuid;\n return prefix ? `${prefix}-${id}` : id;\n}\n\nexport function extractRequestId(headers: Record<string, string | string[] | undefined>): string | undefined {\n const headerNames = ['x-request-id', 'x-correlation-id', 'x-trace-id'];\n\n for (const name of headerNames) {\n const value = headers[name];\n if (typeof value === 'string' && value.length > 0) {\n return value;\n }\n if (Array.isArray(value) && value.length > 0) {\n return value[0];\n }\n }\n\n return undefined;\n}\n\nexport function getOrGenerateRequestId(\n headers: Record<string, string | string[] | undefined>,\n options: RequestIdOptions = {},\n): string {\n return extractRequestId(headers) ?? generateRequestId(options);\n}\n","import { inspect } from 'util';\nimport { LOG_LEVELS, type LogFormat, type LoggerContext, type LogLevel, type LevelRule } from './types.js';\n\nconst DEFAULT_CONTEXT = 'APP';\n\nconst LEVEL_COLORS: Record<string, string> = {\n error: '\\x1b[31m', // red\n warn: '\\x1b[33m', // yellow\n info: '\\x1b[32m', // green\n http: '\\x1b[35m', // magenta\n verbose: '\\x1b[36m', // cyan\n debug: '\\x1b[34m', // blue\n silly: '\\x1b[90m', // grey\n};\nconst RESET = '\\x1b[0m';\n\nexport function colorizeLevel(level: string): string {\n const color = LEVEL_COLORS[level] || '';\n return color ? `${color}${level}${RESET}` : level;\n}\n\nexport function formatMeta(meta: Record<string, unknown>, colors: boolean): string {\n return Object.entries(meta)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n if (typeof value === 'object') {\n const inspected = inspect(value, { depth: 4, colors, compact: false });\n return `\\n ${key}: ${inspected.split('\\n').join('\\n ')}`;\n }\n return `\\n ${key}: ${value}`;\n })\n .join('');\n}\n\nconst MAX_FLATTEN_DEPTH = 10;\nconst CIRCULAR_REF = '[Circular]';\n\nexport function flattenObject(\n obj: Record<string, unknown>,\n prefix = '',\n ancestors: WeakSet<object> = new WeakSet(),\n depth = 0,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Protect against too deep nesting\n if (depth > MAX_FLATTEN_DEPTH) {\n result[prefix || 'value'] = '[Max depth exceeded]';\n return result;\n }\n\n // Add current object to ancestors (current path in recursion)\n ancestors.add(obj);\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Error)) {\n // Check for circular reference (only in current path)\n if (ancestors.has(value as object)) {\n result[newKey] = CIRCULAR_REF;\n } else {\n Object.assign(result, flattenObject(value as Record<string, unknown>, newKey, ancestors, depth + 1));\n }\n } else {\n result[newKey] = value;\n }\n }\n\n // Remove from ancestors when leaving this level (allow reuse in sibling branches)\n ancestors.delete(obj);\n\n return result;\n}\n\nexport function formatLogfmtValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (typeof value === 'string') {\n if (value.includes(' ') || value.includes('\"') || value.includes('=')) {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n if (value instanceof Error) {\n return `\"${value.message.replace(/\"/g, '\\\\\"')}\"`;\n }\n\n if (Array.isArray(value)) {\n return `\"${JSON.stringify(value).replace(/\"/g, '\\\\\"')}\"`;\n }\n\n return `\"${JSON.stringify(value).replace(/\"/g, '\\\\\"')}\"`;\n}\n\nexport function formatLogfmt(data: Record<string, unknown>): string {\n const flattened = flattenObject(data);\n\n return Object.entries(flattened)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=${formatLogfmtValue(value)}`)\n .join(' ');\n}\n"]}