@rawnodes/logger 2.0.0 → 2.1.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.
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -604,7 +604,13 @@ function formatLog(log, format, store) {
|
|
|
604
604
|
const RESET = "\x1B[0m";
|
|
605
605
|
const color = LEVEL_COLORS[levelName] || "";
|
|
606
606
|
const coloredLevel = color ? `${color}${levelName}${RESET}` : levelName;
|
|
607
|
-
const
|
|
607
|
+
const formatValue = (key, value) => {
|
|
608
|
+
if (typeof value === "string" && value.includes("\n")) {
|
|
609
|
+
return "\n " + value.split("\n").join("\n ");
|
|
610
|
+
}
|
|
611
|
+
return JSON.stringify(value);
|
|
612
|
+
};
|
|
613
|
+
const metaStr = Object.keys(meta).length > 0 ? "\n " + Object.entries(meta).map(([k, v]) => `${k}: ${formatValue(k, v)}`).join("\n ") : "";
|
|
608
614
|
return `[${timestamp}] ${coloredLevel} [${context}] ${message}${metaStr}
|
|
609
615
|
`;
|
|
610
616
|
}
|
|
@@ -658,6 +664,9 @@ function createStreams(config, store) {
|
|
|
658
664
|
const fileConfig = config.file;
|
|
659
665
|
promises.mkdir(fileConfig.dirname, { recursive: true }).catch(() => {
|
|
660
666
|
});
|
|
667
|
+
const normalizeSize = (size) => {
|
|
668
|
+
return size.replace(/([kmg])$/i, (match) => match.toUpperCase());
|
|
669
|
+
};
|
|
661
670
|
const rotatingStream = rotatingFileStream.createStream(
|
|
662
671
|
(time, index) => {
|
|
663
672
|
const date = time instanceof Date ? time : /* @__PURE__ */ new Date();
|
|
@@ -667,7 +676,7 @@ function createStreams(config, store) {
|
|
|
667
676
|
},
|
|
668
677
|
{
|
|
669
678
|
path: fileConfig.dirname,
|
|
670
|
-
size: fileConfig.maxSize || "20M",
|
|
679
|
+
size: normalizeSize(fileConfig.maxSize || "20M"),
|
|
671
680
|
interval: fileConfig.datePattern === "YYYY-MM-DD-HH" ? "1h" : "1d",
|
|
672
681
|
compress: fileConfig.zippedArchive ? "gzip" : false,
|
|
673
682
|
maxFiles: parseInt(fileConfig.maxFiles?.replace("d", "") || "14")
|
package/dist/index.js.map
CHANGED
|
@@ -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/cloudwatch.ts","../src/streams.ts","../src/state.ts","../src/schema.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":["AsyncLocalStorage","EventEmitter","LEVEL_EMOJI","CloudWatchLogsClient","PutLogEventsCommand","CreateLogGroupCommand","CreateLogStreamCommand","DescribeLogStreamsCommand","Transform","mkdir","createStream","pino","Writable","z","randomUUID"],"mappings":"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","file":"index.js","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 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\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// CloudWatch Transport\nexport interface CloudWatchConfig extends HttpTransportBaseConfig {\n logGroupName: string;\n logStreamName: string;\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 LoggerConfig {\n level: LevelConfig;\n console: ConsoleConfig;\n file?: FileConfig;\n discord?: DiscordConfig | DiscordConfig[];\n telegram?: TelegramConfig | TelegramConfig[];\n cloudwatch?: CloudWatchConfig | CloudWatchConfig[];\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 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\nexport class MessageBuffer {\n private queue: BufferedMessage[] = [];\n private timer: NodeJS.Timeout | null = null;\n private flushing = false;\n private closed = false;\n\n constructor(private options: BufferOptions) {}\n\n add(message: BufferedMessage): void {\n if (this.closed) return;\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 async close(): Promise<void> {\n this.closed = true;\n this.clearTimer();\n\n // Flush remaining messages\n while (this.queue.length > 0) {\n await this.flush();\n }\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 { EventEmitter } from 'events';\nimport { MessageBuffer, type BufferedMessage } 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}\n\nconst DEFAULT_OPTIONS = {\n batchSize: 10,\n flushInterval: 5000,\n maxRetries: 3,\n retryDelay: 1000,\n};\n\nexport abstract class BaseHttpTransport extends EventEmitter {\n protected buffer: MessageBuffer;\n\n constructor(opts: BaseHttpTransportOptions = {}) {\n super();\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 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 close(): Promise<void> {\n return this.buffer.close();\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 // Log to stderr to avoid infinite loop\n console.error(\n `[${this.constructor.name}] Failed to send ${messages.length} messages:`,\n error.message,\n );\n\n // Emit error event\n this.emit('error', error);\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\nexport class DiscordTransport extends BaseHttpTransport {\n private config: DiscordConfig;\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 });\n this.config = config;\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 });\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\nexport class TelegramTransport extends BaseHttpTransport {\n private config: TelegramConfig;\n private apiUrl: string;\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 });\n this.config = config;\n this.apiUrl = `https://api.telegram.org/bot${config.botToken}`;\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 });\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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n };\n return text.replace(/[&<>\"']/g, (c) => entities[c] || c);\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 { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { CloudWatchConfig } from '../types.js';\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\n constructor(config: CloudWatchConfig) {\n super({\n batchSize: config.batchSize ?? 100,\n flushInterval: config.flushInterval ?? 1000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n });\n this.config = config;\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.config.logStreamName,\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.config.logStreamName,\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 (!this.initPromise) {\n this.initPromise = this.initialize();\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.config.logStreamName,\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.config.logStreamName,\n limit: 1,\n }),\n );\n\n const stream = response.logStreams?.find((s) => s.logStreamName === this.config.logStreamName);\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, PassThrough } from 'node:stream';\nimport { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createStream, type RotatingFileStream } from 'rotating-file-stream';\nimport { LoggerStore } from './store.js';\nimport { matchesContext } from './state.js';\nimport { DiscordTransport } from './transports/discord.js';\nimport { TelegramTransport } from './transports/telegram.js';\nimport { CloudWatchTransport } from './transports/cloudwatch.js';\nimport {\n LOG_LEVELS,\n type LoggerConfig,\n type LoggerContext,\n type LogLevel,\n type LevelRule,\n} from './types.js';\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 [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\nfunction shouldPassTransport<TContext extends LoggerContext>(\n log: ParsedLog,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n store: LoggerStore<TContext>,\n): boolean {\n const logLevel = getLevelName(log.level);\n const context = log.context;\n const storeContext = store.getStore();\n\n // Find matching rule\n const matchingRule = rules?.find((rule) => matchesContext(storeContext, context, rule.match));\n\n // Effective level: matching rule > transport default > accept all\n const effectiveLevel = matchingRule?.level ?? level ?? 'silly';\n\n if (effectiveLevel === 'off') return false;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[effectiveLevel];\n}\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 (!['level', 'time', 'msg', 'context'].includes(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 const metaStr = Object.keys(meta).length > 0\n ? '\\n ' + Object.entries(meta).map(([k, v]) => `${k}: ${JSON.stringify(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 store: LoggerStore<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, store)) {\n callback();\n return;\n }\n\n const formatted = formatLog(log, format, store);\n destination.write(formatted);\n callback();\n },\n });\n}\n\nexport function createStreams<TContext extends LoggerContext>(\n config: LoggerConfig,\n store: LoggerStore<TContext>,\n): DestinationStream {\n const streams: StreamEntry<'trace'>[] = [];\n\n // Console transport\n const consoleStream = createFormattedFilterStream(\n config.console.format,\n config.console.level,\n config.console.rules,\n store,\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 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: (fileConfig.maxSize || '20M') as `${number}M`,\n interval: fileConfig.datePattern === 'YYYY-MM-DD-HH' ? '1h' : '1d',\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 store,\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 const discordStream = createHttpTransportStream(transport, discordConfig.level, discordConfig.rules, store);\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 const telegramStream = createHttpTransportStream(transport, telegramConfig.level, telegramConfig.rules, store);\n streams.push({\n level: 'trace',\n stream: telegramStream,\n });\n }\n\n // HTTP transports - CloudWatch\n for (const cloudwatchConfig of toArray(config.cloudwatch)) {\n const transport = new CloudWatchTransport(cloudwatchConfig);\n const cwStream = createHttpTransportStream(transport, cloudwatchConfig.level, cloudwatchConfig.rules, store);\n streams.push({\n level: 'trace',\n stream: cwStream,\n });\n }\n\n return pino.multistream(streams);\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,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n store: LoggerStore<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, store)) {\n callback();\n return;\n }\n\n const levelName = getLevelName(log.level);\n const storeContext = store.getStore();\n\n const meta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(log)) {\n if (!['level', 'time', 'msg', 'context'].includes(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 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} from './types.js';\nimport { createStreams } from './streams.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}\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\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 = JSON.stringify(rule.match);\n levelOverrides.set(key, rule as LevelOverride<TContext>);\n }\n\n const { contextIndex, complexRules } = buildIndexes(levelOverrides);\n\n // Create pino with multistream\n const streams = createStreams(config, loggerStore);\n\n const options: LoggerOptions<keyof CustomLevels> = {\n level: 'trace', // Accept all, we filter in shouldLog()\n customLevels: CUSTOM_LEVELS,\n base: undefined, // Disable pid and hostname\n };\n\n const pinoLogger = pino(options, streams) as PinoLogger;\n\n return {\n pino: pinoLogger,\n store: loggerStore,\n defaultLevel,\n levelOverrides,\n contextIndex,\n complexRules,\n };\n}\n\nexport function rebuildIndexes<TContext extends LoggerContext>(state: LoggerState<TContext>): void {\n const { contextIndex, complexRules } = buildIndexes(state.levelOverrides);\n state.contextIndex = contextIndex;\n state.complexRules.length = 0;\n state.complexRules.push(...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): boolean {\n const combined: Record<string, unknown> = { ...storeContext, context: loggerContext };\n return Object.entries(match).every(([key, value]) => combined[key] === value);\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 LevelConfigObject,\n LevelConfig,\n LoggerConfig,\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 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});\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 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 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// 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 logGroupName: z.string().min(1, 'logGroupName is required'),\n logStreamName: z.string().min(1, 'logStreamName is required'),\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// 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// 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}) 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 { LoggerStore } from './store.js';\nimport { createState, shouldLog, rebuildIndexes, type LoggerState } 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';\n\nexport class Logger<TContext extends LoggerContext = LoggerContext> {\n private profileTimers = new 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 return new Logger(state, 'APP');\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 = JSON.stringify(match);\n this.state.levelOverrides.set(key, { match, level });\n rebuildIndexes(this.state);\n }\n\n removeLevelOverride(match: LevelOverrideMatch<TContext>): boolean {\n const key = JSON.stringify(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 // Profiling\n\n profile(id: string, meta?: object): void {\n const existing = this.profileTimers.get(id);\n if (existing) {\n const duration = Date.now() - existing;\n this.profileTimers.delete(id);\n this.info(`${id} completed`, { ...meta, durationMs: duration });\n } else {\n this.profileTimers.set(id, Date.now());\n }\n }\n\n // Logging methods\n\n error(errorOrMessage: Error | string, messageOrMeta?: string | Meta, meta?: Meta): void {\n if (!shouldLog(this.state, 'error', this.context)) return;\n\n if (errorOrMessage instanceof Error) {\n // error(Error), error(Error, meta), error(Error, message), error(Error, message, meta)\n if (typeof messageOrMeta === 'string') {\n this.log('error', messageOrMeta, meta, errorOrMessage);\n } else {\n this.log('error', errorOrMessage.message, messageOrMeta, errorOrMessage);\n }\n } else {\n // error(message), error(message, meta)\n this.log('error', errorOrMessage, messageOrMeta as Meta | undefined);\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): 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 if (error instanceof Error) {\n logMeta.errorMessage = error.message;\n logMeta.stack = error.stack;\n } else if (error !== undefined) {\n logMeta.error = error;\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\nexport function flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\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 Object.assign(result, flattenObject(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\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/cloudwatch.ts","../src/streams.ts","../src/state.ts","../src/schema.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":["AsyncLocalStorage","EventEmitter","LEVEL_EMOJI","CloudWatchLogsClient","PutLogEventsCommand","CreateLogGroupCommand","CreateLogStreamCommand","DescribeLogStreamsCommand","Transform","mkdir","createStream","pino","Writable","z","randomUUID"],"mappings":"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","file":"index.js","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 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\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// CloudWatch Transport\nexport interface CloudWatchConfig extends HttpTransportBaseConfig {\n logGroupName: string;\n logStreamName: string;\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 LoggerConfig {\n level: LevelConfig;\n console: ConsoleConfig;\n file?: FileConfig;\n discord?: DiscordConfig | DiscordConfig[];\n telegram?: TelegramConfig | TelegramConfig[];\n cloudwatch?: CloudWatchConfig | CloudWatchConfig[];\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 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\nexport class MessageBuffer {\n private queue: BufferedMessage[] = [];\n private timer: NodeJS.Timeout | null = null;\n private flushing = false;\n private closed = false;\n\n constructor(private options: BufferOptions) {}\n\n add(message: BufferedMessage): void {\n if (this.closed) return;\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 async close(): Promise<void> {\n this.closed = true;\n this.clearTimer();\n\n // Flush remaining messages\n while (this.queue.length > 0) {\n await this.flush();\n }\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 { EventEmitter } from 'events';\nimport { MessageBuffer, type BufferedMessage } 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}\n\nconst DEFAULT_OPTIONS = {\n batchSize: 10,\n flushInterval: 5000,\n maxRetries: 3,\n retryDelay: 1000,\n};\n\nexport abstract class BaseHttpTransport extends EventEmitter {\n protected buffer: MessageBuffer;\n\n constructor(opts: BaseHttpTransportOptions = {}) {\n super();\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 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 close(): Promise<void> {\n return this.buffer.close();\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 // Log to stderr to avoid infinite loop\n console.error(\n `[${this.constructor.name}] Failed to send ${messages.length} messages:`,\n error.message,\n );\n\n // Emit error event\n this.emit('error', error);\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\nexport class DiscordTransport extends BaseHttpTransport {\n private config: DiscordConfig;\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 });\n this.config = config;\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 });\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\nexport class TelegramTransport extends BaseHttpTransport {\n private config: TelegramConfig;\n private apiUrl: string;\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 });\n this.config = config;\n this.apiUrl = `https://api.telegram.org/bot${config.botToken}`;\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 });\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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n };\n return text.replace(/[&<>\"']/g, (c) => entities[c] || c);\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 { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { CloudWatchConfig } from '../types.js';\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\n constructor(config: CloudWatchConfig) {\n super({\n batchSize: config.batchSize ?? 100,\n flushInterval: config.flushInterval ?? 1000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n });\n this.config = config;\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.config.logStreamName,\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.config.logStreamName,\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 (!this.initPromise) {\n this.initPromise = this.initialize();\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.config.logStreamName,\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.config.logStreamName,\n limit: 1,\n }),\n );\n\n const stream = response.logStreams?.find((s) => s.logStreamName === this.config.logStreamName);\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, PassThrough } from 'node:stream';\nimport { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createStream, type RotatingFileStream } from 'rotating-file-stream';\nimport { LoggerStore } from './store.js';\nimport { matchesContext } from './state.js';\nimport { DiscordTransport } from './transports/discord.js';\nimport { TelegramTransport } from './transports/telegram.js';\nimport { CloudWatchTransport } from './transports/cloudwatch.js';\nimport {\n LOG_LEVELS,\n type LoggerConfig,\n type LoggerContext,\n type LogLevel,\n type LevelRule,\n} from './types.js';\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 [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\nfunction shouldPassTransport<TContext extends LoggerContext>(\n log: ParsedLog,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n store: LoggerStore<TContext>,\n): boolean {\n const logLevel = getLevelName(log.level);\n const context = log.context;\n const storeContext = store.getStore();\n\n // Find matching rule\n const matchingRule = rules?.find((rule) => matchesContext(storeContext, context, rule.match));\n\n // Effective level: matching rule > transport default > accept all\n const effectiveLevel = matchingRule?.level ?? level ?? 'silly';\n\n if (effectiveLevel === 'off') return false;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[effectiveLevel];\n}\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 (!['level', 'time', 'msg', 'context'].includes(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 store: LoggerStore<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, store)) {\n callback();\n return;\n }\n\n const formatted = formatLog(log, format, store);\n destination.write(formatted);\n callback();\n },\n });\n}\n\nexport function createStreams<TContext extends LoggerContext>(\n config: LoggerConfig,\n store: LoggerStore<TContext>,\n): DestinationStream {\n const streams: StreamEntry<'trace'>[] = [];\n\n // Console transport\n const consoleStream = createFormattedFilterStream(\n config.console.format,\n config.console.level,\n config.console.rules,\n store,\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): string => {\n return size.replace(/([kmg])$/i, (match) => match.toUpperCase());\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.datePattern === 'YYYY-MM-DD-HH' ? '1h' : '1d',\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 store,\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 const discordStream = createHttpTransportStream(transport, discordConfig.level, discordConfig.rules, store);\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 const telegramStream = createHttpTransportStream(transport, telegramConfig.level, telegramConfig.rules, store);\n streams.push({\n level: 'trace',\n stream: telegramStream,\n });\n }\n\n // HTTP transports - CloudWatch\n for (const cloudwatchConfig of toArray(config.cloudwatch)) {\n const transport = new CloudWatchTransport(cloudwatchConfig);\n const cwStream = createHttpTransportStream(transport, cloudwatchConfig.level, cloudwatchConfig.rules, store);\n streams.push({\n level: 'trace',\n stream: cwStream,\n });\n }\n\n return pino.multistream(streams);\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,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n store: LoggerStore<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, store)) {\n callback();\n return;\n }\n\n const levelName = getLevelName(log.level);\n const storeContext = store.getStore();\n\n const meta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(log)) {\n if (!['level', 'time', 'msg', 'context'].includes(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 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} from './types.js';\nimport { createStreams } from './streams.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}\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\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 = JSON.stringify(rule.match);\n levelOverrides.set(key, rule as LevelOverride<TContext>);\n }\n\n const { contextIndex, complexRules } = buildIndexes(levelOverrides);\n\n // Create pino with multistream\n const streams = createStreams(config, loggerStore);\n\n const options: LoggerOptions<keyof CustomLevels> = {\n level: 'trace', // Accept all, we filter in shouldLog()\n customLevels: CUSTOM_LEVELS,\n base: undefined, // Disable pid and hostname\n };\n\n const pinoLogger = pino(options, streams) as PinoLogger;\n\n return {\n pino: pinoLogger,\n store: loggerStore,\n defaultLevel,\n levelOverrides,\n contextIndex,\n complexRules,\n };\n}\n\nexport function rebuildIndexes<TContext extends LoggerContext>(state: LoggerState<TContext>): void {\n const { contextIndex, complexRules } = buildIndexes(state.levelOverrides);\n state.contextIndex = contextIndex;\n state.complexRules.length = 0;\n state.complexRules.push(...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): boolean {\n const combined: Record<string, unknown> = { ...storeContext, context: loggerContext };\n return Object.entries(match).every(([key, value]) => combined[key] === value);\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 LevelConfigObject,\n LevelConfig,\n LoggerConfig,\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 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});\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 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 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// 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 logGroupName: z.string().min(1, 'logGroupName is required'),\n logStreamName: z.string().min(1, 'logStreamName is required'),\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// 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// 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}) 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 { LoggerStore } from './store.js';\nimport { createState, shouldLog, rebuildIndexes, type LoggerState } 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';\n\nexport class Logger<TContext extends LoggerContext = LoggerContext> {\n private profileTimers = new 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 return new Logger(state, 'APP');\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 = JSON.stringify(match);\n this.state.levelOverrides.set(key, { match, level });\n rebuildIndexes(this.state);\n }\n\n removeLevelOverride(match: LevelOverrideMatch<TContext>): boolean {\n const key = JSON.stringify(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 // Profiling\n\n profile(id: string, meta?: object): void {\n const existing = this.profileTimers.get(id);\n if (existing) {\n const duration = Date.now() - existing;\n this.profileTimers.delete(id);\n this.info(`${id} completed`, { ...meta, durationMs: duration });\n } else {\n this.profileTimers.set(id, Date.now());\n }\n }\n\n // Logging methods\n\n error(errorOrMessage: Error | string, messageOrMeta?: string | Meta, meta?: Meta): void {\n if (!shouldLog(this.state, 'error', this.context)) return;\n\n if (errorOrMessage instanceof Error) {\n // error(Error), error(Error, meta), error(Error, message), error(Error, message, meta)\n if (typeof messageOrMeta === 'string') {\n this.log('error', messageOrMeta, meta, errorOrMessage);\n } else {\n this.log('error', errorOrMessage.message, messageOrMeta, errorOrMessage);\n }\n } else {\n // error(message), error(message, meta)\n this.log('error', errorOrMessage, messageOrMeta as Meta | undefined);\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): 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 if (error instanceof Error) {\n logMeta.errorMessage = error.message;\n logMeta.stack = error.stack;\n } else if (error !== undefined) {\n logMeta.error = error;\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\nexport function flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\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 Object.assign(result, flattenObject(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -598,7 +598,13 @@ function formatLog(log, format, store) {
|
|
|
598
598
|
const RESET = "\x1B[0m";
|
|
599
599
|
const color = LEVEL_COLORS[levelName] || "";
|
|
600
600
|
const coloredLevel = color ? `${color}${levelName}${RESET}` : levelName;
|
|
601
|
-
const
|
|
601
|
+
const formatValue = (key, value) => {
|
|
602
|
+
if (typeof value === "string" && value.includes("\n")) {
|
|
603
|
+
return "\n " + value.split("\n").join("\n ");
|
|
604
|
+
}
|
|
605
|
+
return JSON.stringify(value);
|
|
606
|
+
};
|
|
607
|
+
const metaStr = Object.keys(meta).length > 0 ? "\n " + Object.entries(meta).map(([k, v]) => `${k}: ${formatValue(k, v)}`).join("\n ") : "";
|
|
602
608
|
return `[${timestamp}] ${coloredLevel} [${context}] ${message}${metaStr}
|
|
603
609
|
`;
|
|
604
610
|
}
|
|
@@ -652,6 +658,9 @@ function createStreams(config, store) {
|
|
|
652
658
|
const fileConfig = config.file;
|
|
653
659
|
mkdir(fileConfig.dirname, { recursive: true }).catch(() => {
|
|
654
660
|
});
|
|
661
|
+
const normalizeSize = (size) => {
|
|
662
|
+
return size.replace(/([kmg])$/i, (match) => match.toUpperCase());
|
|
663
|
+
};
|
|
655
664
|
const rotatingStream = createStream(
|
|
656
665
|
(time, index) => {
|
|
657
666
|
const date = time instanceof Date ? time : /* @__PURE__ */ new Date();
|
|
@@ -661,7 +670,7 @@ function createStreams(config, store) {
|
|
|
661
670
|
},
|
|
662
671
|
{
|
|
663
672
|
path: fileConfig.dirname,
|
|
664
|
-
size: fileConfig.maxSize || "20M",
|
|
673
|
+
size: normalizeSize(fileConfig.maxSize || "20M"),
|
|
665
674
|
interval: fileConfig.datePattern === "YYYY-MM-DD-HH" ? "1h" : "1d",
|
|
666
675
|
compress: fileConfig.zippedArchive ? "gzip" : false,
|
|
667
676
|
maxFiles: parseInt(fileConfig.maxFiles?.replace("d", "") || "14")
|
package/dist/index.mjs.map
CHANGED
|
@@ -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/cloudwatch.ts","../src/streams.ts","../src/state.ts","../src/schema.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","pino"],"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 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\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// CloudWatch Transport\nexport interface CloudWatchConfig extends HttpTransportBaseConfig {\n logGroupName: string;\n logStreamName: string;\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 LoggerConfig {\n level: LevelConfig;\n console: ConsoleConfig;\n file?: FileConfig;\n discord?: DiscordConfig | DiscordConfig[];\n telegram?: TelegramConfig | TelegramConfig[];\n cloudwatch?: CloudWatchConfig | CloudWatchConfig[];\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 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\nexport class MessageBuffer {\n private queue: BufferedMessage[] = [];\n private timer: NodeJS.Timeout | null = null;\n private flushing = false;\n private closed = false;\n\n constructor(private options: BufferOptions) {}\n\n add(message: BufferedMessage): void {\n if (this.closed) return;\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 async close(): Promise<void> {\n this.closed = true;\n this.clearTimer();\n\n // Flush remaining messages\n while (this.queue.length > 0) {\n await this.flush();\n }\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 { EventEmitter } from 'events';\nimport { MessageBuffer, type BufferedMessage } 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}\n\nconst DEFAULT_OPTIONS = {\n batchSize: 10,\n flushInterval: 5000,\n maxRetries: 3,\n retryDelay: 1000,\n};\n\nexport abstract class BaseHttpTransport extends EventEmitter {\n protected buffer: MessageBuffer;\n\n constructor(opts: BaseHttpTransportOptions = {}) {\n super();\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 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 close(): Promise<void> {\n return this.buffer.close();\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 // Log to stderr to avoid infinite loop\n console.error(\n `[${this.constructor.name}] Failed to send ${messages.length} messages:`,\n error.message,\n );\n\n // Emit error event\n this.emit('error', error);\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\nexport class DiscordTransport extends BaseHttpTransport {\n private config: DiscordConfig;\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 });\n this.config = config;\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 });\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\nexport class TelegramTransport extends BaseHttpTransport {\n private config: TelegramConfig;\n private apiUrl: string;\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 });\n this.config = config;\n this.apiUrl = `https://api.telegram.org/bot${config.botToken}`;\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 });\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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n };\n return text.replace(/[&<>\"']/g, (c) => entities[c] || c);\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 { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { CloudWatchConfig } from '../types.js';\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\n constructor(config: CloudWatchConfig) {\n super({\n batchSize: config.batchSize ?? 100,\n flushInterval: config.flushInterval ?? 1000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n });\n this.config = config;\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.config.logStreamName,\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.config.logStreamName,\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 (!this.initPromise) {\n this.initPromise = this.initialize();\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.config.logStreamName,\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.config.logStreamName,\n limit: 1,\n }),\n );\n\n const stream = response.logStreams?.find((s) => s.logStreamName === this.config.logStreamName);\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, PassThrough } from 'node:stream';\nimport { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createStream, type RotatingFileStream } from 'rotating-file-stream';\nimport { LoggerStore } from './store.js';\nimport { matchesContext } from './state.js';\nimport { DiscordTransport } from './transports/discord.js';\nimport { TelegramTransport } from './transports/telegram.js';\nimport { CloudWatchTransport } from './transports/cloudwatch.js';\nimport {\n LOG_LEVELS,\n type LoggerConfig,\n type LoggerContext,\n type LogLevel,\n type LevelRule,\n} from './types.js';\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 [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\nfunction shouldPassTransport<TContext extends LoggerContext>(\n log: ParsedLog,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n store: LoggerStore<TContext>,\n): boolean {\n const logLevel = getLevelName(log.level);\n const context = log.context;\n const storeContext = store.getStore();\n\n // Find matching rule\n const matchingRule = rules?.find((rule) => matchesContext(storeContext, context, rule.match));\n\n // Effective level: matching rule > transport default > accept all\n const effectiveLevel = matchingRule?.level ?? level ?? 'silly';\n\n if (effectiveLevel === 'off') return false;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[effectiveLevel];\n}\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 (!['level', 'time', 'msg', 'context'].includes(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 const metaStr = Object.keys(meta).length > 0\n ? '\\n ' + Object.entries(meta).map(([k, v]) => `${k}: ${JSON.stringify(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 store: LoggerStore<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, store)) {\n callback();\n return;\n }\n\n const formatted = formatLog(log, format, store);\n destination.write(formatted);\n callback();\n },\n });\n}\n\nexport function createStreams<TContext extends LoggerContext>(\n config: LoggerConfig,\n store: LoggerStore<TContext>,\n): DestinationStream {\n const streams: StreamEntry<'trace'>[] = [];\n\n // Console transport\n const consoleStream = createFormattedFilterStream(\n config.console.format,\n config.console.level,\n config.console.rules,\n store,\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 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: (fileConfig.maxSize || '20M') as `${number}M`,\n interval: fileConfig.datePattern === 'YYYY-MM-DD-HH' ? '1h' : '1d',\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 store,\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 const discordStream = createHttpTransportStream(transport, discordConfig.level, discordConfig.rules, store);\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 const telegramStream = createHttpTransportStream(transport, telegramConfig.level, telegramConfig.rules, store);\n streams.push({\n level: 'trace',\n stream: telegramStream,\n });\n }\n\n // HTTP transports - CloudWatch\n for (const cloudwatchConfig of toArray(config.cloudwatch)) {\n const transport = new CloudWatchTransport(cloudwatchConfig);\n const cwStream = createHttpTransportStream(transport, cloudwatchConfig.level, cloudwatchConfig.rules, store);\n streams.push({\n level: 'trace',\n stream: cwStream,\n });\n }\n\n return pino.multistream(streams);\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,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n store: LoggerStore<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, store)) {\n callback();\n return;\n }\n\n const levelName = getLevelName(log.level);\n const storeContext = store.getStore();\n\n const meta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(log)) {\n if (!['level', 'time', 'msg', 'context'].includes(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 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} from './types.js';\nimport { createStreams } from './streams.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}\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\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 = JSON.stringify(rule.match);\n levelOverrides.set(key, rule as LevelOverride<TContext>);\n }\n\n const { contextIndex, complexRules } = buildIndexes(levelOverrides);\n\n // Create pino with multistream\n const streams = createStreams(config, loggerStore);\n\n const options: LoggerOptions<keyof CustomLevels> = {\n level: 'trace', // Accept all, we filter in shouldLog()\n customLevels: CUSTOM_LEVELS,\n base: undefined, // Disable pid and hostname\n };\n\n const pinoLogger = pino(options, streams) as PinoLogger;\n\n return {\n pino: pinoLogger,\n store: loggerStore,\n defaultLevel,\n levelOverrides,\n contextIndex,\n complexRules,\n };\n}\n\nexport function rebuildIndexes<TContext extends LoggerContext>(state: LoggerState<TContext>): void {\n const { contextIndex, complexRules } = buildIndexes(state.levelOverrides);\n state.contextIndex = contextIndex;\n state.complexRules.length = 0;\n state.complexRules.push(...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): boolean {\n const combined: Record<string, unknown> = { ...storeContext, context: loggerContext };\n return Object.entries(match).every(([key, value]) => combined[key] === value);\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 LevelConfigObject,\n LevelConfig,\n LoggerConfig,\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 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});\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 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 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// 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 logGroupName: z.string().min(1, 'logGroupName is required'),\n logStreamName: z.string().min(1, 'logStreamName is required'),\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// 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// 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}) 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 { LoggerStore } from './store.js';\nimport { createState, shouldLog, rebuildIndexes, type LoggerState } 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';\n\nexport class Logger<TContext extends LoggerContext = LoggerContext> {\n private profileTimers = new 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 return new Logger(state, 'APP');\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 = JSON.stringify(match);\n this.state.levelOverrides.set(key, { match, level });\n rebuildIndexes(this.state);\n }\n\n removeLevelOverride(match: LevelOverrideMatch<TContext>): boolean {\n const key = JSON.stringify(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 // Profiling\n\n profile(id: string, meta?: object): void {\n const existing = this.profileTimers.get(id);\n if (existing) {\n const duration = Date.now() - existing;\n this.profileTimers.delete(id);\n this.info(`${id} completed`, { ...meta, durationMs: duration });\n } else {\n this.profileTimers.set(id, Date.now());\n }\n }\n\n // Logging methods\n\n error(errorOrMessage: Error | string, messageOrMeta?: string | Meta, meta?: Meta): void {\n if (!shouldLog(this.state, 'error', this.context)) return;\n\n if (errorOrMessage instanceof Error) {\n // error(Error), error(Error, meta), error(Error, message), error(Error, message, meta)\n if (typeof messageOrMeta === 'string') {\n this.log('error', messageOrMeta, meta, errorOrMessage);\n } else {\n this.log('error', errorOrMessage.message, messageOrMeta, errorOrMessage);\n }\n } else {\n // error(message), error(message, meta)\n this.log('error', errorOrMessage, messageOrMeta as Meta | undefined);\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): 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 if (error instanceof Error) {\n logMeta.errorMessage = error.message;\n logMeta.stack = error.stack;\n } else if (error !== undefined) {\n logMeta.error = error;\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\nexport function flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\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 Object.assign(result, flattenObject(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\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/cloudwatch.ts","../src/streams.ts","../src/state.ts","../src/schema.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","pino"],"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 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\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// CloudWatch Transport\nexport interface CloudWatchConfig extends HttpTransportBaseConfig {\n logGroupName: string;\n logStreamName: string;\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 LoggerConfig {\n level: LevelConfig;\n console: ConsoleConfig;\n file?: FileConfig;\n discord?: DiscordConfig | DiscordConfig[];\n telegram?: TelegramConfig | TelegramConfig[];\n cloudwatch?: CloudWatchConfig | CloudWatchConfig[];\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 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\nexport class MessageBuffer {\n private queue: BufferedMessage[] = [];\n private timer: NodeJS.Timeout | null = null;\n private flushing = false;\n private closed = false;\n\n constructor(private options: BufferOptions) {}\n\n add(message: BufferedMessage): void {\n if (this.closed) return;\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 async close(): Promise<void> {\n this.closed = true;\n this.clearTimer();\n\n // Flush remaining messages\n while (this.queue.length > 0) {\n await this.flush();\n }\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 { EventEmitter } from 'events';\nimport { MessageBuffer, type BufferedMessage } 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}\n\nconst DEFAULT_OPTIONS = {\n batchSize: 10,\n flushInterval: 5000,\n maxRetries: 3,\n retryDelay: 1000,\n};\n\nexport abstract class BaseHttpTransport extends EventEmitter {\n protected buffer: MessageBuffer;\n\n constructor(opts: BaseHttpTransportOptions = {}) {\n super();\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 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 close(): Promise<void> {\n return this.buffer.close();\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 // Log to stderr to avoid infinite loop\n console.error(\n `[${this.constructor.name}] Failed to send ${messages.length} messages:`,\n error.message,\n );\n\n // Emit error event\n this.emit('error', error);\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\nexport class DiscordTransport extends BaseHttpTransport {\n private config: DiscordConfig;\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 });\n this.config = config;\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 });\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\nexport class TelegramTransport extends BaseHttpTransport {\n private config: TelegramConfig;\n private apiUrl: string;\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 });\n this.config = config;\n this.apiUrl = `https://api.telegram.org/bot${config.botToken}`;\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 });\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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n };\n return text.replace(/[&<>\"']/g, (c) => entities[c] || c);\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 { BaseHttpTransport } from './base-http.js';\nimport type { BufferedMessage } from './buffer.js';\nimport type { CloudWatchConfig } from '../types.js';\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\n constructor(config: CloudWatchConfig) {\n super({\n batchSize: config.batchSize ?? 100,\n flushInterval: config.flushInterval ?? 1000,\n maxRetries: config.maxRetries,\n retryDelay: config.retryDelay,\n });\n this.config = config;\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.config.logStreamName,\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.config.logStreamName,\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 (!this.initPromise) {\n this.initPromise = this.initialize();\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.config.logStreamName,\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.config.logStreamName,\n limit: 1,\n }),\n );\n\n const stream = response.logStreams?.find((s) => s.logStreamName === this.config.logStreamName);\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, PassThrough } from 'node:stream';\nimport { createWriteStream } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { createStream, type RotatingFileStream } from 'rotating-file-stream';\nimport { LoggerStore } from './store.js';\nimport { matchesContext } from './state.js';\nimport { DiscordTransport } from './transports/discord.js';\nimport { TelegramTransport } from './transports/telegram.js';\nimport { CloudWatchTransport } from './transports/cloudwatch.js';\nimport {\n LOG_LEVELS,\n type LoggerConfig,\n type LoggerContext,\n type LogLevel,\n type LevelRule,\n} from './types.js';\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 [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\nfunction shouldPassTransport<TContext extends LoggerContext>(\n log: ParsedLog,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n store: LoggerStore<TContext>,\n): boolean {\n const logLevel = getLevelName(log.level);\n const context = log.context;\n const storeContext = store.getStore();\n\n // Find matching rule\n const matchingRule = rules?.find((rule) => matchesContext(storeContext, context, rule.match));\n\n // Effective level: matching rule > transport default > accept all\n const effectiveLevel = matchingRule?.level ?? level ?? 'silly';\n\n if (effectiveLevel === 'off') return false;\n return LOG_LEVELS[logLevel] <= LOG_LEVELS[effectiveLevel];\n}\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 (!['level', 'time', 'msg', 'context'].includes(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 store: LoggerStore<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, store)) {\n callback();\n return;\n }\n\n const formatted = formatLog(log, format, store);\n destination.write(formatted);\n callback();\n },\n });\n}\n\nexport function createStreams<TContext extends LoggerContext>(\n config: LoggerConfig,\n store: LoggerStore<TContext>,\n): DestinationStream {\n const streams: StreamEntry<'trace'>[] = [];\n\n // Console transport\n const consoleStream = createFormattedFilterStream(\n config.console.format,\n config.console.level,\n config.console.rules,\n store,\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): string => {\n return size.replace(/([kmg])$/i, (match) => match.toUpperCase());\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.datePattern === 'YYYY-MM-DD-HH' ? '1h' : '1d',\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 store,\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 const discordStream = createHttpTransportStream(transport, discordConfig.level, discordConfig.rules, store);\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 const telegramStream = createHttpTransportStream(transport, telegramConfig.level, telegramConfig.rules, store);\n streams.push({\n level: 'trace',\n stream: telegramStream,\n });\n }\n\n // HTTP transports - CloudWatch\n for (const cloudwatchConfig of toArray(config.cloudwatch)) {\n const transport = new CloudWatchTransport(cloudwatchConfig);\n const cwStream = createHttpTransportStream(transport, cloudwatchConfig.level, cloudwatchConfig.rules, store);\n streams.push({\n level: 'trace',\n stream: cwStream,\n });\n }\n\n return pino.multistream(streams);\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,\n level: LogLevel | undefined,\n rules: LevelRule[] | undefined,\n store: LoggerStore<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, store)) {\n callback();\n return;\n }\n\n const levelName = getLevelName(log.level);\n const storeContext = store.getStore();\n\n const meta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(log)) {\n if (!['level', 'time', 'msg', 'context'].includes(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 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} from './types.js';\nimport { createStreams } from './streams.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}\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\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 = JSON.stringify(rule.match);\n levelOverrides.set(key, rule as LevelOverride<TContext>);\n }\n\n const { contextIndex, complexRules } = buildIndexes(levelOverrides);\n\n // Create pino with multistream\n const streams = createStreams(config, loggerStore);\n\n const options: LoggerOptions<keyof CustomLevels> = {\n level: 'trace', // Accept all, we filter in shouldLog()\n customLevels: CUSTOM_LEVELS,\n base: undefined, // Disable pid and hostname\n };\n\n const pinoLogger = pino(options, streams) as PinoLogger;\n\n return {\n pino: pinoLogger,\n store: loggerStore,\n defaultLevel,\n levelOverrides,\n contextIndex,\n complexRules,\n };\n}\n\nexport function rebuildIndexes<TContext extends LoggerContext>(state: LoggerState<TContext>): void {\n const { contextIndex, complexRules } = buildIndexes(state.levelOverrides);\n state.contextIndex = contextIndex;\n state.complexRules.length = 0;\n state.complexRules.push(...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): boolean {\n const combined: Record<string, unknown> = { ...storeContext, context: loggerContext };\n return Object.entries(match).every(([key, value]) => combined[key] === value);\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 LevelConfigObject,\n LevelConfig,\n LoggerConfig,\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 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});\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 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 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// 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 logGroupName: z.string().min(1, 'logGroupName is required'),\n logStreamName: z.string().min(1, 'logStreamName is required'),\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// 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// 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}) 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 { LoggerStore } from './store.js';\nimport { createState, shouldLog, rebuildIndexes, type LoggerState } 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';\n\nexport class Logger<TContext extends LoggerContext = LoggerContext> {\n private profileTimers = new 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 return new Logger(state, 'APP');\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 = JSON.stringify(match);\n this.state.levelOverrides.set(key, { match, level });\n rebuildIndexes(this.state);\n }\n\n removeLevelOverride(match: LevelOverrideMatch<TContext>): boolean {\n const key = JSON.stringify(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 // Profiling\n\n profile(id: string, meta?: object): void {\n const existing = this.profileTimers.get(id);\n if (existing) {\n const duration = Date.now() - existing;\n this.profileTimers.delete(id);\n this.info(`${id} completed`, { ...meta, durationMs: duration });\n } else {\n this.profileTimers.set(id, Date.now());\n }\n }\n\n // Logging methods\n\n error(errorOrMessage: Error | string, messageOrMeta?: string | Meta, meta?: Meta): void {\n if (!shouldLog(this.state, 'error', this.context)) return;\n\n if (errorOrMessage instanceof Error) {\n // error(Error), error(Error, meta), error(Error, message), error(Error, message, meta)\n if (typeof messageOrMeta === 'string') {\n this.log('error', messageOrMeta, meta, errorOrMessage);\n } else {\n this.log('error', errorOrMessage.message, messageOrMeta, errorOrMessage);\n }\n } else {\n // error(message), error(message, meta)\n this.log('error', errorOrMessage, messageOrMeta as Meta | undefined);\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): 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 if (error instanceof Error) {\n logMeta.errorMessage = error.message;\n logMeta.stack = error.stack;\n } else if (error !== undefined) {\n logMeta.error = error;\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\nexport function flattenObject(obj: Record<string, unknown>, prefix = ''): Record<string, unknown> {\n const result: Record<string, unknown> = {};\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 Object.assign(result, flattenObject(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\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"]}
|
package/package.json
CHANGED