autotel-edge 3.16.0 → 3.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/logger.ts"],"names":["api_context"],"mappings":"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","file":"logger.js","sourcesContent":["/**\n * Zero-dependency structured logger for edge environments\n *\n * This logger is ~100 LOC and provides:\n * - Structured JSON logging\n * - Auto trace context injection (traceId, spanId)\n * - Dynamic log level control (per-request via context)\n * - Level support (info, error, warn, debug)\n * - Zero dependencies (console-based)\n *\n * Unlike Pino/Winston (~500KB), this is <1KB minified!\n */\n\nimport { trace, context as api_context, createContextKey } from '@opentelemetry/api';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\n/**\n * Context key for storing active log level (enables per-request log levels)\n */\nconst LOG_LEVEL_KEY = createContextKey('autotel-edge-log-level');\n\nexport interface EdgeLogger {\n info(msg: string, attrs?: Record<string, any>): void;\n error(msg: string, error?: Error | unknown, attrs?: Record<string, any>): void;\n warn(msg: string, attrs?: Record<string, any>): void;\n debug(msg: string, attrs?: Record<string, any>): void;\n}\n\n/**\n * Get the active log level from context (if set)\n * Falls back to undefined if no log level is set in context\n */\nexport function getActiveLogLevel(): LogLevel | undefined {\n return api_context.active().getValue(LOG_LEVEL_KEY) as LogLevel | undefined;\n}\n\n/**\n * Run a function with a specific log level\n * The log level is stored in OpenTelemetry context and applies to all logger calls within the callback\n *\n * This works in edge runtimes (uses OTel context, not Node.js AsyncLocalStorage)\n *\n * @example\n * ```typescript\n * // Enable debug logging for a specific request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged')\n * processRequest()\n * })\n *\n * // Disable logging temporarily\n * runWithLogLevel('none', () => {\n * log.info('This will NOT be logged')\n * })\n * ```\n */\nexport function runWithLogLevel<T>(level: LogLevel, callback: () => T): T {\n const ctx = api_context.active().setValue(LOG_LEVEL_KEY, level);\n return api_context.with(ctx, callback);\n}\n\n/**\n * Get current trace context from active span\n */\nfunction getTraceContext():\n | { traceId: string; spanId: string; correlationId: string }\n | null {\n const span = trace.getActiveSpan();\n if (!span) return null;\n\n const ctx = span.spanContext();\n return {\n traceId: ctx.traceId,\n spanId: ctx.spanId,\n correlationId: ctx.traceId.slice(0, 16), // First 16 chars for grouping\n };\n}\n\n/**\n * Create a lightweight structured logger\n *\n * @param service - Service name for logging\n * @param options - Optional configuration\n *\n * @example\n * ```typescript\n * const log = createEdgeLogger('user-service')\n *\n * log.info('Creating user', { email: 'test@example.com' })\n * // Output: {\"level\":\"info\",\"service\":\"user-service\",\"msg\":\"Creating user\",\n * // \"email\":\"test@example.com\",\"traceId\":\"...\",\"spanId\":\"...\"}\n *\n * // Dynamic log level control per-request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged even if logger was created with level: \"info\"')\n * })\n * ```\n */\nexport function createEdgeLogger(\n service: string,\n options?: {\n level?: LogLevel;\n pretty?: boolean; // For development\n },\n): EdgeLogger {\n const defaultLevel = options?.level || 'info';\n const pretty = options?.pretty || false;\n\n const levelPriority: Record<LogLevel, number> = {\n none: -1,\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n };\n\n const shouldLog = (level: LogLevel): boolean => {\n // Priority: context level > options level > 'info' default\n const activeLevel = getActiveLogLevel() ?? defaultLevel;\n\n // 'none' means suppress all logging\n if (activeLevel === 'none') return false;\n\n return levelPriority[level] >= levelPriority[activeLevel];\n };\n\n const log = (\n level: 'info' | 'error' | 'warn' | 'debug',\n msg: string,\n attrs?: Record<string, any>,\n ) => {\n if (!shouldLog(level)) return;\n\n const ctx = getTraceContext();\n const logEntry: Record<string, any> = {\n level,\n service,\n msg,\n ...attrs,\n ...ctx, // Auto-inject traceId, spanId, correlationId\n timestamp: new Date().toISOString(),\n };\n\n if (pretty) {\n // Pretty print for development\n const traceInfo = ctx\n ? ` [${ctx.traceId.slice(0, 8)}.../${ctx.spanId.slice(0, 8)}...]`\n : '';\n console.log(\n `[${level.toUpperCase()}]${traceInfo} ${service}: ${msg}`,\n attrs || '',\n );\n } else {\n // Structured JSON for production\n console.log(JSON.stringify(logEntry));\n }\n };\n\n return {\n info: (msg: string, attrs?: Record<string, any>) => log('info', msg, attrs),\n\n error: (msg: string, error?: Error | unknown, attrs?: Record<string, any>) => {\n const errorAttrs = error instanceof Error\n ? {\n error: error.message,\n stack: error.stack,\n name: error.name,\n ...attrs,\n }\n : { error: String(error), ...attrs };\n\n log('error', msg, errorAttrs);\n },\n\n warn: (msg: string, attrs?: Record<string, any>) => log('warn', msg, attrs),\n\n debug: (msg: string, attrs?: Record<string, any>) => log('debug', msg, attrs),\n };\n}\n\n/**\n * Helper to get trace context (useful for BYOL - Bring Your Own Logger)\n *\n * @example\n * ```typescript\n * import bunyan from 'bunyan'\n * import { getEdgeTraceContext } from 'autotel-edge/api/logger'\n *\n * const bunyanLogger = bunyan.createLogger({ name: 'myapp' })\n * const ctx = getEdgeTraceContext()\n * bunyanLogger.info({ ...ctx, email: 'test@example.com' }, 'Creating user')\n * ```\n */\nexport function getEdgeTraceContext() {\n return getTraceContext();\n}\n"]}
1
+ {"version":3,"sources":["../src/api/redact.ts","../src/api/logger.ts"],"names":["api_context","msg","attrs"],"mappings":"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","file":"logger.js","sourcesContent":["/**\n * Redaction utility for structured log output\n *\n * Inspired by pino's redaction — zero-dependency, edge-compatible.\n * Supports deep paths, wildcards, and custom censor values.\n *\n * @example\n * ```typescript\n * const redactor = createRedactor({\n * paths: ['password', 'user.email', 'headers.authorization'],\n * })\n * const safe = redactor({ password: 'secret', user: { email: 'a@b.com' } })\n * // { password: '[Redacted]', user: { email: '[Redacted]' } }\n * ```\n */\n\nconst DEFAULT_CENSOR = '[Redacted]';\n\n/**\n * Validate and parse a dot/bracket path string into segments.\n *\n * Valid: \"user.email\", \"users[*].name\", \"headers.*\", \"[0].secret\"\n * Invalid: \"user..email\", \"user[\", \"foo.]bar\", \"\"\n */\nfunction parsePath(path: string): string[] {\n if (typeof path !== 'string' || path.length === 0) {\n throw new Error(\n `redact path must be a non-empty string, got: ${JSON.stringify(path)}`,\n );\n }\n\n // Reject obviously malformed paths\n if (path.includes('..')) {\n throw new Error(\n `redact path contains empty segment: ${JSON.stringify(path)}`,\n );\n }\n // Unmatched brackets: \"[\" with no \"]\" or vice versa\n const openBracket = path.indexOf('[');\n const closeBracket = path.indexOf(']');\n if (\n (openBracket !== -1 && closeBracket === -1) ||\n (closeBracket !== -1 && openBracket === -1)\n ) {\n throw new Error(\n `redact path has unclosed bracket: ${JSON.stringify(path)}`,\n );\n }\n if (openBracket !== -1 && closeBracket < openBracket) {\n throw new Error(\n `redact path has bracket close before open: ${JSON.stringify(path)}`,\n );\n }\n if (/\\[\\s*\\]$/.test(path)) {\n throw new Error(\n `redact path has unclosed bracket: ${JSON.stringify(path)}`,\n );\n }\n if (/\\][^.[\\]]/.test(path) && !/\\]\\[/.test(path)) {\n // e.g. \"foo.]bar\" — closing bracket not followed by dot, bracket, or end\n const afterClose = path.match(/\\]([^.[\\]]+)/);\n if (afterClose) {\n throw new Error(\n `redact path has invalid characters after ']': ${JSON.stringify(path)}`,\n );\n }\n }\n\n const segments: string[] = [];\n const rx = /[^.[\\]]+|\\[(\\d+|\\*)\\]/g;\n let match: RegExpExecArray | null;\n let lastIndex = 0;\n while ((match = rx.exec(path)) !== null) {\n segments.push(match[1] ?? match[0]);\n lastIndex = rx.lastIndex;\n }\n\n // If the regex didn't consume the whole string, something is malformed\n if (lastIndex < path.length) {\n throw new Error(\n `redact path has unexpected trailing content: ${JSON.stringify(path)}`,\n );\n }\n\n if (segments.length === 0) {\n throw new Error(\n `redact path produced no segments: ${JSON.stringify(path)}`,\n );\n }\n\n return segments;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== 'object') return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Deep clone plain objects and arrays only.\n * Non-plain objects (Date, Map, Set, class instances) are returned by reference.\n */\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map((v) => deepClone(v)) as T;\n if (!isPlainObject(value)) return value;\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n}\n\n/**\n * A node in the compiled path tree.\n *\n * Unlike a simple PathTree | null representation, a node can be both\n * a redact target AND a parent for deeper paths. This correctly handles\n * overlapping paths like ['user', 'user.email'].\n */\ninterface PathNode {\n redact?: boolean;\n children?: Record<string, PathNode>;\n}\n\n/**\n * Insert a parsed path into the tree.\n *\n * buildPathTree([['user'], ['user', 'email']]) produces:\n * { user: { redact: true, children: { email: { redact: true } } } }\n */\nfunction buildPathTree(paths: string[][]): PathNode {\n const root: PathNode = {};\n for (const segments of paths) {\n let node = root;\n for (let i = 0; i < segments.length; i++) {\n const seg = segments[i];\n const isLast = i === segments.length - 1;\n\n if (!node.children) node.children = {};\n if (!node.children[seg]) node.children[seg] = {};\n\n if (isLast) {\n node.children[seg].redact = true;\n }\n node = node.children[seg];\n }\n }\n return root;\n}\n\n/**\n * Walk a compiled path tree and redact matching values in `obj`.\n * Mutates `obj` in place (caller should clone before calling).\n */\nfunction redactWithTree(\n obj: Record<string, any>,\n node: PathNode,\n censor: Censor,\n remove: boolean,\n path: string[] = [],\n): void {\n if (!node.children) return;\n\n const applyCensor = (target: Record<string, any>, k: string, currentPath: string[]) => {\n if (remove) {\n delete target[k];\n } else {\n target[k] = typeof censor === 'function' ? censor(target[k], currentPath) : censor;\n }\n };\n\n for (const [key, childNode] of Object.entries(node.children)) {\n if (key === '*') {\n for (const k of Object.keys(obj)) {\n const wildcardPath = [...path, k];\n if (childNode.redact && !childNode.children) {\n applyCensor(obj, k, wildcardPath);\n } else if (childNode.redact && childNode.children) {\n const child = obj[k];\n if (\n child != null &&\n typeof child === 'object' &&\n !Array.isArray(child)\n ) {\n redactWithTree(child, childNode, censor, remove, wildcardPath);\n } else {\n applyCensor(obj, k, wildcardPath);\n }\n } else if (childNode.children) {\n const child = obj[k];\n if (child != null && typeof child === 'object') {\n redactWithTree(child, childNode, censor, remove, wildcardPath);\n }\n }\n }\n continue;\n }\n\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n const val = obj[key];\n const currentPath = [...path, key];\n\n if (childNode.redact && !childNode.children) {\n applyCensor(obj, key, currentPath);\n } else if (childNode.redact && childNode.children) {\n if (val != null && typeof val === 'object') {\n redactWithTree(val, childNode, censor, remove, currentPath);\n }\n } else if (childNode.children && val != null && typeof val === 'object') {\n redactWithTree(val, childNode, censor, remove, currentPath);\n }\n }\n}\n\nexport type Censor = string | ((value: unknown, path: string[]) => unknown);\n\nexport interface RedactorOptions {\n paths: string[];\n censor?: Censor;\n remove?: boolean;\n}\n\n/**\n * Preset name or explicit options\n */\nexport type RedactorConfig = RedactorOptions | RedactorPreset;\n\nexport type RedactorPreset = 'default' | 'strict' | 'pci-dss';\n\n/**\n * Paths that match the main autotel package's `sensitiveKey` pattern:\n * `/^(password|passwd|pwd|secret|token|api[_-]?key|auth|credential|private[_-]?key|authorization)$/i`\n *\n * Copied here so the edge logger stays zero-dependency.\n */\nconst SENSITIVE_KEY_PATHS = [\n 'password',\n 'passwd',\n 'pwd',\n 'secret',\n 'token',\n 'apiKey',\n 'api_key',\n 'auth',\n 'credential',\n 'privateKey',\n 'private_key',\n 'authorization',\n];\n\n/**\n * Common request header paths that often carry secrets.\n */\nconst SENSITIVE_HEADER_PATHS = [\n 'req.headers.authorization',\n 'req.headers.cookie',\n 'headers.authorization',\n 'headers.cookie',\n 'request.headers.authorization',\n 'request.headers.cookie',\n];\n\n/**\n * Built-in redactor presets.\n *\n * - `default` — sensitive keys + request headers (passwords, tokens, secrets, auth headers)\n * - `strict` — default + bearer/jwt/api-key patterns nested at any depth\n * - `pci-dss` — credit card and payment-related fields\n */\nexport const REDACT_PRESETS: Record<RedactorPreset, RedactorOptions> = {\n /**\n * Default: covers the same sensitive-key names as the main autotel package's\n * `sensitiveKey` pattern, plus common request header paths.\n *\n * Redacted keys: password, passwd, pwd, secret, token, apiKey, auth,\n * credential, privateKey, authorization\n * Redacted headers: req.headers.authorization, req.headers.cookie, etc.\n */\n default: {\n paths: [...SENSITIVE_KEY_PATHS, ...SENSITIVE_HEADER_PATHS],\n },\n\n /**\n * Strict: everything in default, plus nested paths for bearer tokens,\n * JWT fields, and API key fields at common depths.\n */\n strict: {\n paths: [\n ...SENSITIVE_KEY_PATHS,\n ...SENSITIVE_HEADER_PATHS,\n // Common nested auth shapes\n 'bearer',\n 'jwt',\n 'apiSecret',\n 'api_secret',\n 'accessToken',\n 'access_token',\n 'refreshToken',\n 'refresh_token',\n 'clientSecret',\n 'client_secret',\n ],\n },\n\n /**\n * PCI-DSS: credit card and payment-related fields.\n */\n 'pci-dss': {\n paths: [\n 'card',\n 'cardNumber',\n 'card_number',\n 'ccn',\n 'pan',\n 'cvv',\n 'cvc',\n 'expirationDate',\n 'expiration_date',\n 'exp',\n 'payment.card',\n 'payment.cardNumber',\n 'payment.cvv',\n ],\n },\n};\n\n/**\n * Resolve a preset name or explicit options into RedactorOptions.\n */\nfunction resolveConfig(config: RedactorConfig): RedactorOptions {\n if (typeof config === 'string') {\n const preset = REDACT_PRESETS[config];\n if (!preset) {\n throw new Error(\n `Unknown redactor preset: \"${config}\". Available: ${Object.keys(REDACT_PRESETS).join(', ')}`,\n );\n }\n return preset;\n }\n return config;\n}\n\n/**\n * Create a redactor function from a list of paths.\n *\n * Paths use dot notation for nested fields and `[*]` or `*` for wildcards:\n * - `\"password\"` — top-level key\n * - `\"user.email\"` — nested field\n * - `\"users[*].password\"` or `\"users.*.password\"` — all items in array/object\n * - `\"headers.authorization\"` — nested header\n * - `\"[*].secret\"` — wildcard at root\n *\n * Overlapping paths are supported — e.g. `['user', 'user.email']` will\n * redact `user` as a whole while still recursing into `user.email`.\n *\n * The returned function clones plain objects/arrays before mutating,\n * so the original is never modified. Non-plain objects (Date, Map, etc.)\n * are passed through by reference.\n *\n * @example\n * ```typescript\n * // Using a preset\n * const redactor = createRedactor('default')\n *\n * // Using explicit paths\n * const redactor = createRedactor({\n * paths: ['password', 'token', 'user.email', 'users[*].ssn'],\n * censor: '[Filtered]', // optional, default '[Redacted]'\n * })\n *\n * redactor({ password: 's3cret', user: { email: 'a@b.com' } })\n * // → { password: '[Filtered]', user: { email: '[Filtered]' } }\n *\n * // Custom censor function:\n * const mask = createRedactor({\n * paths: ['ccn'],\n * censor: (val) => '****' + String(val).slice(-4),\n * })\n * ```\n */\nexport function createRedactor(config: RedactorConfig): <T>(obj: T) => T {\n const { paths, censor = DEFAULT_CENSOR, remove = false } = resolveConfig(config);\n\n if (paths.length === 0) {\n return <T>(obj: T): T => obj;\n }\n\n const parsed = paths.map((p) => parsePath(p));\n const tree = buildPathTree(parsed);\n\n return function redactor<T>(obj: T): T {\n if (obj == null || typeof obj !== 'object') return obj;\n\n // Clone so we don't mutate the original log entry\n const clone = deepClone(obj) as Record<string, any>;\n redactWithTree(clone, tree, censor, remove);\n return clone as T;\n };\n}\n","/**\n * Pino-compatible structured logger for edge environments.\n *\n * Supports the practical Pino surface used by app code:\n * - Pino-style `LogFn` calls: string-first, object-first, and error-first\n * - Child loggers, level control, custom levels, and `msgPrefix`\n * - Serializers, formatters, mixins, redaction, and browser-style `transmit`\n * - Trace context injection (`traceId`, `spanId`, `correlationId`)\n * - Worker-safe EventEmitter-like methods for `level-change`\n *\n * The implementation stays dependency-light and console/write based so it\n * works in Cloudflare Workers and similar edge runtimes.\n */\n\nimport {\n trace,\n context as api_context,\n createContextKey,\n} from '@opentelemetry/api';\nimport { createRedactor, type RedactorConfig } from './redact';\n\nexport type LogLevel =\n | 'trace'\n | 'debug'\n | 'info'\n | 'warn'\n | 'error'\n | 'fatal'\n | 'silent';\ntype LogAttrs = Record<string, any>;\ntype LevelWithSilentOrString = LogLevel | (string & {});\ntype SerializerFn = (value: any) => any;\ntype LevelFormatter = (label: string, number: number) => object;\ntype BindingsFormatter = (bindings: LogAttrs) => object;\ntype LogFormatter = (object: Record<string, unknown>) => Record<string, unknown>;\ntype MixinFn = (mergeObject: object, level: number, logger: EdgeLogger) => object;\ntype MixinMergeStrategyFn = (mergeObject: object, mixinObject: object) => object;\ntype PlaceholderSpecifier = 'd' | 's' | 'j' | 'o' | 'O';\ntype PlaceholderTypeMapping<T extends PlaceholderSpecifier> = T extends 'd'\n ? number\n : T extends 's'\n ? unknown\n : T extends 'j' | 'o' | 'O'\n ? // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n {} | null\n : never;\ntype ParseLogFnArgs<T, Acc extends unknown[] = []> =\n T extends `${infer _}%${infer Placeholder}${infer Rest}`\n ? Placeholder extends PlaceholderSpecifier\n ? ParseLogFnArgs<Rest, [...Acc, PlaceholderTypeMapping<Placeholder>]>\n : ParseLogFnArgs<Rest, Acc>\n : Acc;\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface LogFnFields {}\ntype LogFn = {\n <TMsg extends string = string>(msg: TMsg, ...args: ParseLogFnArgs<TMsg>): void;\n <T, TMsg extends string = string>(\n obj: [T] extends [object] ? T & LogFnFields : T,\n msg?: T extends string ? never : TMsg,\n ...args: ParseLogFnArgs<TMsg> | []\n ): void;\n <T, TMsg extends string = string>(\n obj: [T] extends [object] ? T & LogFnFields : T,\n msg?: T extends string ? never : TMsg,\n ...args: ParseLogFnArgs<TMsg> extends [unknown, ...unknown[]]\n ? ParseLogFnArgs<TMsg>\n : unknown[]\n ): void;\n};\ntype ChildLoggerOptions = {\n level?: LevelWithSilentOrString;\n msgPrefix?: string;\n serializers?: Record<string, SerializerFn>;\n formatters?: {\n level?: LevelFormatter;\n bindings?: BindingsFormatter;\n log?: LogFormatter;\n };\n redact?: RedactorConfig;\n};\ntype LevelMapping = {\n values: Record<string, number>;\n labels: Record<number, string>;\n};\ntype LevelChangeEventListener = (\n levelLabel: LevelWithSilentOrString,\n levelValue: number,\n previousLevelLabel: LevelWithSilentOrString,\n previousLevelValue: number,\n logger: EdgeLogger,\n) => void;\ntype OnChildCallback = (child: EdgeLogger) => void;\ntype EventListener = (...args: any[]) => void;\nexport type WriteFn = (o: object) => void;\nexport type TimeFn = () => string;\n\nexport interface LogEvent {\n ts: number;\n messages: any[];\n bindings: LogAttrs[];\n level: { label: string; value: number };\n}\n\ninterface EdgeEventEmitter {\n addListener(event: string | symbol, listener: (...args: any[]) => any): any;\n emit(event: string | symbol, ...args: any[]): boolean;\n eventNames(): (string | symbol)[];\n getMaxListeners(): number;\n listenerCount(event: string | symbol): number;\n listeners(event: string | symbol): ((...args: any[]) => any)[];\n off(event: string | symbol, listener: (...args: any[]) => any): any;\n on(event: string | symbol, listener: (...args: any[]) => any): any;\n once(event: string | symbol, listener: (...args: any[]) => any): any;\n prependListener(event: string | symbol, listener: (...args: any[]) => any): any;\n prependOnceListener(event: string | symbol, listener: (...args: any[]) => any): any;\n rawListeners(event: string | symbol): ((...args: any[]) => any)[];\n removeAllListeners(event?: string | symbol): any;\n removeListener(event: string | symbol, listener: (...args: any[]) => any): any;\n setMaxListeners(n: number): any;\n}\n\n/**\n * Context key for storing active log level (enables per-request log levels)\n */\nconst LOG_LEVEL_KEY = createContextKey('autotel-edge-log-level');\n\nexport interface EdgeLogger extends EdgeEventEmitter {\n readonly version: string;\n readonly name: string | undefined;\n levels: LevelMapping;\n useLevelLabels: boolean;\n level: LevelWithSilentOrString;\n readonly levelVal: number;\n readonly msgPrefix: string | undefined;\n onChild: OnChildCallback;\n enabled: boolean;\n info: LogFn;\n error: LogFn;\n warn: LogFn;\n debug: LogFn;\n trace: LogFn;\n fatal: LogFn;\n silent: LogFn;\n /**\n * Create a child logger with merged bindings.\n * Like pino's child() — every log call from the child\n * includes the parent's attrs plus the child's bindings.\n */\n child(bindings: LogAttrs, options?: ChildLoggerOptions): EdgeLogger;\n isLevelEnabled(level: LevelWithSilentOrString): boolean;\n bindings(): LogAttrs;\n setBindings(bindings: LogAttrs): void;\n flush(cb?: (err?: Error) => void): void;\n on(event: 'level-change', listener: LevelChangeEventListener): EdgeLogger;\n addListener(\n event: 'level-change',\n listener: LevelChangeEventListener,\n ): EdgeLogger;\n once(event: 'level-change', listener: LevelChangeEventListener): EdgeLogger;\n prependListener(\n event: 'level-change',\n listener: LevelChangeEventListener,\n ): EdgeLogger;\n prependOnceListener(\n event: 'level-change',\n listener: LevelChangeEventListener,\n ): EdgeLogger;\n removeListener(\n event: 'level-change',\n listener: LevelChangeEventListener,\n ): EdgeLogger;\n [key: string]: unknown;\n}\n\nconst PINO_LEVELS: LevelMapping = {\n values: {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n fatal: 60,\n silent: Infinity,\n },\n labels: {\n 10: 'trace',\n 20: 'debug',\n 30: 'info',\n 40: 'warn',\n 50: 'error',\n 60: 'fatal',\n [Infinity]: 'silent',\n },\n};\nconst LOGGER_VERSION = 'autotel-edge';\n\n/**\n * Get the active log level from context (if set)\n * Falls back to undefined if no log level is set in context\n */\nexport function getActiveLogLevel(): LogLevel | undefined {\n return api_context.active().getValue(LOG_LEVEL_KEY) as LogLevel | undefined;\n}\n\n/**\n * Run a function with a specific log level\n * The log level is stored in OpenTelemetry context and applies to all logger calls within the callback\n *\n * This works in edge runtimes (uses OTel context, not Node.js AsyncLocalStorage)\n *\n * @example\n * ```typescript\n * // Enable debug logging for a specific request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged')\n * processRequest()\n * })\n *\n * // Disable logging temporarily\n * runWithLogLevel('silent', () => {\n * log.info('This will NOT be logged')\n * })\n * ```\n */\nexport function runWithLogLevel<T>(level: LogLevel, callback: () => T): T {\n const ctx = api_context.active().setValue(LOG_LEVEL_KEY, level);\n return api_context.with(ctx, callback);\n}\n\n/**\n * Get current trace context from active span\n */\nfunction getTraceContext(): {\n traceId: string;\n spanId: string;\n correlationId: string;\n} | null {\n const span = trace.getActiveSpan();\n if (!span) return null;\n\n const ctx = span.spanContext();\n return {\n traceId: ctx.traceId,\n spanId: ctx.spanId,\n correlationId: ctx.traceId.slice(0, 16), // First 16 chars for grouping\n };\n}\n\nfunction isRecord(value: unknown): value is LogAttrs {\n return typeof value === 'object' && value !== null;\n}\n\nfunction toErrorAttrs(error: unknown): LogAttrs {\n if (error instanceof Error) {\n return {\n error: {\n message: error.message,\n type: error.name,\n stack: error.stack,\n },\n };\n }\n\n return { error: { message: String(error), type: 'Error' } };\n}\n\nfunction formatMessage(template: string, args: unknown[]): string {\n if (args.length === 0) return template;\n\n let argIndex = 0;\n const formatted = template.replaceAll(/%[sdjifoO%]/g, (token) => {\n if (token === '%%') return '%';\n if (argIndex >= args.length) return token;\n\n const value = args[argIndex++];\n\n switch (token) {\n case '%d':\n case '%i':\n case '%f': {\n return String(Number(value));\n }\n case '%j': {\n try {\n return JSON.stringify(value);\n } catch {\n return '[Circular]';\n }\n }\n case '%s': {\n return String(value);\n }\n case '%o':\n case '%O': {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n }\n default: {\n return token;\n }\n }\n });\n\n return formatted;\n}\n\n// ANSI color helpers (no dependencies)\nconst ANSI_RESET = '\\u001B[0m';\nconst ANSI_DIM = '\\u001B[2m';\nconst ANSI_BOLD = '\\u001B[1m';\nconst ANSI_COLORS: Record<string, string> = {\n fatal: '\\u001B[41m\\u001B[37m', // white on red bg\n error: '\\u001B[31m', // red\n warn: '\\u001B[33m', // yellow\n info: '\\u001B[36m', // cyan\n debug: '\\u001B[34m', // blue\n trace: '\\u001B[90m', // gray\n};\nconst LEVEL_SYMBOLS: Record<string, string> = {\n fatal: '✗',\n error: '✗',\n warn: '⚠',\n info: '●',\n debug: '◦',\n trace: '…',\n};\n\nfunction formatPrettyTimestamp(): string {\n const d = new Date();\n const h = String(d.getHours()).padStart(2, '0');\n const m = String(d.getMinutes()).padStart(2, '0');\n const s = String(d.getSeconds()).padStart(2, '0');\n const ms = String(d.getMilliseconds()).padStart(3, '0');\n return `${h}:${m}:${s}.${ms}`;\n}\n\nfunction formatPrettyAttrs(attrs: Record<string, any>): string {\n const keys = Object.keys(attrs);\n if (keys.length === 0) return '';\n return '\\n' + JSON.stringify(attrs, null, 2)\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n}\n\nfunction safeStringify(\n obj: unknown,\n depthLimit: number,\n edgeLimit: number,\n): string {\n // Stack-based approach: track ancestors on the current path.\n // Objects are added when entered and removed when the replacer\n // moves back up, so shared (non-circular) references serialize\n // normally while true cycles produce '[Circular]'.\n const ancestors: object[] = [];\n\n return JSON.stringify(obj, function replacer(this: any, _key: string, value: unknown) {\n if (typeof value === 'object' && value !== null) {\n // Unwind: `this` is the object that owns the current key.\n // Pop ancestors until we find `this` (our direct parent).\n while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) {\n ancestors.pop();\n }\n\n // True circular reference: value is already an ancestor\n if (ancestors.includes(value as object)) return '[Circular]';\n\n if (ancestors.length >= depthLimit) return '[Object]';\n\n ancestors.push(value as object);\n\n if (!Array.isArray(value)) {\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.length > edgeLimit) {\n const truncated: Record<string, unknown> = {};\n for (let i = 0; i < edgeLimit; i++) {\n truncated[keys[i]] = (value as Record<string, unknown>)[keys[i]];\n }\n truncated['...'] = `[${keys.length - edgeLimit} more properties]`;\n return truncated;\n }\n }\n }\n return value;\n });\n}\n\nfunction parseLogArgs(args: unknown[]): { msg: string; attrs?: LogAttrs } {\n const [first, ...rest] = args;\n\n if (typeof first === 'string') {\n return {\n msg: formatMessage(first, rest),\n attrs: undefined,\n };\n }\n\n if (first instanceof Error) {\n return {\n msg:\n typeof rest[0] === 'string'\n ? formatMessage(rest[0], rest.slice(1))\n : first.message,\n attrs: toErrorAttrs(first),\n };\n }\n\n if (isRecord(first)) {\n return {\n msg:\n typeof rest[0] === 'string'\n ? formatMessage(rest[0], rest.slice(1))\n : '',\n attrs: first,\n };\n }\n\n return {\n msg: String(first ?? ''),\n attrs: undefined,\n };\n}\n\n/**\n * Create a lightweight structured logger\n *\n * @param service - Service name for logging\n * @param options - Optional configuration\n *\n * @example\n * ```typescript\n * const log = createEdgeLogger('user-service')\n *\n * log.info({ email: 'test@example.com' }, 'Creating user')\n * // Output: {\"level\":\"info\",\"service\":\"user-service\",\"msg\":\"Creating user\",\n * // \"email\":\"test@example.com\",\"traceId\":\"...\",\"spanId\":\"...\"}\n *\n * // Dynamic log level control per-request\n * runWithLogLevel('debug', () => {\n * log.debug('This will be logged even if logger was created with level: \"info\"')\n * })\n * ```\n */\nexport type EdgeLoggerOptions = {\n level?: LevelWithSilentOrString;\n pretty?: boolean;\n bindings?: Record<string, any>;\n redact?: RedactorConfig | string[];\n msgPrefix?: string;\n useLevelLabels?: boolean;\n onChild?: OnChildCallback;\n enabled?: boolean;\n messageKey?: string;\n errorKey?: string;\n nestedKey?: string;\n serializers?: Record<string, SerializerFn>;\n formatters?: {\n level?: LevelFormatter;\n bindings?: BindingsFormatter;\n log?: LogFormatter;\n };\n mixin?: MixinFn;\n mixinMergeStrategy?: MixinMergeStrategyFn;\n customLevels?: Record<string, number>;\n useOnlyCustomLevels?: boolean;\n levelComparison?: 'ASC' | 'DESC' | ((current: number, expected: number) => boolean);\n name?: string;\n base?: Record<string, any> | null;\n timestamp?: TimeFn | boolean;\n safe?: boolean;\n crlf?: boolean;\n depthLimit?: number;\n edgeLimit?: number;\n hooks?: {\n logMethod?: (\n args: Parameters<LogFn>,\n method: LogFn,\n level: number,\n ) => void;\n };\n write?: WriteFn | ({ [level: string]: WriteFn });\n transmit?: {\n level?: LevelWithSilentOrString;\n send: (level: string, logEvent: LogEvent) => void;\n };\n /** @internal Binding chain for hierarchical transmit bindings */\n _bindingsChain?: LogAttrs[];\n};\n\nexport function createEdgeLogger(\n service: string,\n options?: EdgeLoggerOptions,\n): EdgeLogger {\n const customLevels: Record<string, number> = {\n ...options?.customLevels,\n };\n const availableLevels: Record<string, number> = options?.useOnlyCustomLevels\n ? { ...customLevels, silent: Infinity }\n : { ...PINO_LEVELS.values, ...customLevels };\n const defaultLevel = options?.level ?? (options?.useOnlyCustomLevels ? Object.keys(customLevels)[0] : 'info') ?? 'info';\n let currentLevel = defaultLevel as LevelWithSilentOrString;\n const pretty = options?.pretty || false;\n const currentBindings = { ...options?.bindings };\n const resolvedRedact = Array.isArray(options?.redact)\n ? { paths: options.redact }\n : options?.redact;\n const redactor = resolvedRedact ? createRedactor(resolvedRedact) : null;\n const msgPrefix = options?.msgPrefix;\n const levelValues = availableLevels;\n const levelListeners: LevelChangeEventListener[] = [];\n const onChildCallback: OnChildCallback = options?.onChild ?? (() => {});\n const listeners = new Map<string | symbol, EventListener[]>();\n let maxListeners = 10;\n const messageKey = options?.messageKey ?? 'msg';\n const errorKey = options?.errorKey ?? 'err';\n const nestedKey = options?.nestedKey;\n const serializers = { ...options?.serializers };\n const bindingsFormatter = options?.formatters?.bindings;\n const levelFormatter = options?.formatters?.level;\n const logFormatter = options?.formatters?.log;\n const mixin = options?.mixin;\n const levelComparison = options?.levelComparison;\n const mixinMergeStrategy =\n options?.mixinMergeStrategy ?? ((mergeObject: object, mixinObject: object) => ({ ...mergeObject, ...mixinObject }));\n let enabled = options?.enabled ?? true;\n const loggerName = options?.name;\n const base = options?.base;\n const timestamp = options?.timestamp ?? true;\n const safe = options?.safe ?? true;\n const crlf = options?.crlf ?? false;\n const depthLimit = options?.depthLimit ?? 5;\n const edgeLimitOpt = options?.edgeLimit ?? 100;\n const hooks = options?.hooks;\n const writeFn = options?.write;\n const transmit = options?.transmit;\n const bindingsChain: LogAttrs[] = options?._bindingsChain ?? [];\n\n const compareLevels = (\n current: number,\n expected: number,\n comparison: 'ASC' | 'DESC' | ((current: number, expected: number) => boolean) | undefined,\n ) => {\n if (typeof comparison === 'function') return comparison(current, expected);\n if (comparison === 'DESC') return current <= expected;\n return current >= expected;\n };\n\n const addListener = (\n event: string | symbol,\n listener: EventListener,\n prepend = false,\n ) => {\n const activeListeners = listeners.get(event) ?? [];\n if (prepend) {\n activeListeners.unshift(listener);\n } else {\n activeListeners.push(listener);\n }\n listeners.set(event, activeListeners);\n if (event === 'level-change') {\n levelListeners.length = 0;\n levelListeners.push(\n ...(listeners.get(event) as LevelChangeEventListener[] | undefined ?? []),\n );\n }\n };\n\n const notifyLevelChange = (\n nextLevel: LevelWithSilentOrString,\n previousLevel: LevelWithSilentOrString,\n instance: EdgeLogger,\n ) => {\n const nextValue = levelValues[nextLevel] ?? Infinity;\n const previousValue = levelValues[previousLevel] ?? Infinity;\n const snapshot = [...levelListeners];\n for (const listener of snapshot) {\n listener(nextLevel, nextValue, previousLevel, previousValue, instance);\n }\n };\n\n const removeEventListener = (event: string | symbol, listener: EventListener) => {\n const activeListeners = listeners.get(event);\n if (!activeListeners) {\n return;\n }\n const index = activeListeners.indexOf(listener);\n if (index !== -1) {\n activeListeners.splice(index, 1);\n }\n if (activeListeners.length === 0) {\n listeners.delete(event);\n } else {\n listeners.set(event, activeListeners);\n }\n if (event === 'level-change') {\n levelListeners.length = 0;\n levelListeners.push(\n ...((listeners.get(event) as LevelChangeEventListener[] | undefined) ??\n []),\n );\n }\n };\n\n const shouldLog = (level: LevelWithSilentOrString): boolean => {\n if (!enabled) return false;\n\n // Priority: context level > options level > 'info' default\n const activeLevel = getActiveLogLevel() ?? currentLevel;\n\n // 'silent' means suppress all logging\n if (activeLevel === 'silent') return false;\n const currentValue = levelValues[activeLevel];\n const expectedValue = levelValues[level];\n if (currentValue === undefined || expectedValue === undefined) return false;\n\n return compareLevels(\n expectedValue,\n currentValue,\n levelComparison,\n );\n };\n\n const stringify = (obj: unknown): string => {\n if (safe) {\n return safeStringify(obj, depthLimit, edgeLimitOpt);\n }\n return JSON.stringify(obj);\n };\n\n const getTimestamp = (): string | undefined => {\n if (timestamp === false) return undefined;\n if (typeof timestamp === 'function') return timestamp();\n return new Date().toISOString();\n };\n\n const writeOutput = (level: LevelWithSilentOrString, logObject: Record<string, any>) => {\n if (writeFn) {\n if (typeof writeFn === 'function') {\n writeFn(logObject);\n } else if (typeof writeFn === 'object' && writeFn[level]) {\n writeFn[level](logObject);\n } else {\n console.log(stringify(logObject));\n }\n } else if (pretty) {\n return; // pretty mode handles its own output\n } else {\n const json = stringify(logObject);\n console.log(crlf ? json + '\\r\\n' : json);\n }\n };\n\n const applySerializers = (obj: Record<string, any>): Record<string, any> => {\n if (Object.keys(serializers).length === 0) return obj;\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [\n key,\n key in serializers ? serializers[key](value) : value,\n ]),\n );\n };\n\n const emitTransmit = (\n level: LevelWithSilentOrString,\n rawArgs: unknown[],\n ) => {\n if (!transmit) return;\n if (transmit.level) {\n const transmitValue = levelValues[transmit.level];\n const logValue = levelValues[level];\n if (transmitValue !== undefined && logValue !== undefined && logValue < transmitValue) {\n return;\n }\n }\n // Apply serializers then redaction to messages\n const processedMessages = rawArgs.map((m) => {\n if (typeof m !== 'object' || m === null) return m;\n const serialized = applySerializers(m as Record<string, any>);\n return redactor ? redactor(serialized) : serialized;\n });\n // Apply serializers then redaction to bindings\n const processedBindings = bindingsChain.map((b) => {\n const serialized = applySerializers({ ...b });\n return redactor ? (redactor(serialized) as LogAttrs) : serialized;\n });\n const logEvent: LogEvent = {\n ts: Date.now(),\n messages: processedMessages,\n bindings: processedBindings,\n level: { label: level, value: levelValues[level] },\n };\n transmit.send(level, logEvent);\n };\n\n const log = (\n level: LevelWithSilentOrString,\n msg: string,\n attrs?: Record<string, any>,\n rawArgs?: unknown[],\n ) => {\n if (!shouldLog(level)) return;\n\n const ctx = getTraceContext();\n const message = msgPrefix ? `${msgPrefix}${msg}` : msg;\n const baseBindings = bindingsFormatter\n ? (bindingsFormatter({ ...currentBindings }) as LogAttrs)\n : { ...currentBindings };\n const serializedAttrs = attrs\n ? Object.fromEntries(\n Object.entries(attrs).map(([key, value]) => [\n key,\n key in serializers ? serializers[key](value) : value,\n ]),\n )\n : undefined;\n const mergeObject = nestedKey\n ? ({ [nestedKey]: serializedAttrs ?? {} } as Record<string, unknown>)\n : (serializedAttrs ?? {});\n const mixinObject =\n mixin?.(mergeObject, levelValues[level], logger) ?? {};\n const mergedLogObject = mixinMergeStrategy(mergeObject, mixinObject) as Record<\n string,\n unknown\n >;\n const formattedLogObject = logFormatter\n ? logFormatter(mergedLogObject)\n : mergedLogObject;\n const formattedLevel = levelFormatter\n ? levelFormatter(level, levelValues[level])\n : {\n level: logger.useLevelLabels ? level : levelValues[level],\n };\n const ts = getTimestamp();\n const logEntry: Record<string, any> = {\n ...formattedLevel,\n ...(loggerName === undefined ? {} : { name: loggerName }),\n service,\n ...(message === '' ? {} : { [messageKey]: message }),\n ...(base === null || base === undefined ? {} : base),\n ...baseBindings,\n ...formattedLogObject,\n ...ctx, // Auto-inject traceId, spanId, correlationId\n ...(ts === undefined ? {} : { timestamp: ts }),\n };\n\n if (serializedAttrs && !nestedKey && errorKey !== 'error' && 'error' in logEntry) {\n logEntry[errorKey] = logEntry.error;\n delete logEntry.error;\n }\n\n if (pretty && !writeFn) {\n // Pretty print for development\n const color = ANSI_COLORS[level] ?? ANSI_COLORS.info;\n const symbol = LEVEL_SYMBOLS[level] ?? '●';\n const time = formatPrettyTimestamp();\n const traceInfo = ctx\n ? ` ${ANSI_DIM}[${ctx.traceId.slice(0, 8)}/${ctx.spanId.slice(0, 8)}]${ANSI_RESET}`\n : '';\n const prettyAttrs = {\n ...baseBindings,\n ...formattedLogObject,\n };\n const safeAttrs = redactor\n ? (redactor(prettyAttrs) as LogAttrs)\n : prettyAttrs;\n const attrsStr = formatPrettyAttrs(safeAttrs);\n console.log(\n `${ANSI_DIM}${time}${ANSI_RESET} ${color}${ANSI_BOLD}${symbol} ${level.toUpperCase()}${ANSI_RESET}${traceInfo} ${ANSI_DIM}(${service})${ANSI_RESET} ${message}${attrsStr}`,\n );\n } else {\n // Structured JSON for production (or custom write)\n const safeEntry = redactor ? (redactor(logEntry) as LogAttrs) : logEntry;\n writeOutput(level, safeEntry);\n }\n\n emitTransmit(level, rawArgs ?? []);\n };\n\n const makeLogMethod = (levelName: string): LogFn => {\n return ((...args: unknown[]) => {\n if (hooks?.logMethod) {\n const method = ((...methodArgs: unknown[]) => {\n const { msg, attrs } = parseLogArgs(methodArgs);\n log(levelName, msg, attrs, methodArgs);\n }) as LogFn;\n hooks.logMethod.call(logger, args as Parameters<LogFn>, method, levelValues[levelName]);\n return;\n }\n const { msg, attrs } = parseLogArgs(args);\n log(levelName, msg, attrs, args);\n }) as LogFn;\n };\n\n const logger: EdgeLogger = {\n version: LOGGER_VERSION,\n\n get name() {\n return loggerName;\n },\n\n levels: {\n values: levelValues,\n labels: Object.fromEntries(\n Object.entries(levelValues).map(([label, value]) => [value, label]),\n ),\n },\n useLevelLabels: options?.useLevelLabels ?? false,\n customLevels: { ...customLevels },\n useOnlyCustomLevels: options?.useOnlyCustomLevels ?? false,\n\n get level() {\n return currentLevel;\n },\n\n set level(level: LevelWithSilentOrString) {\n const previousLevel = currentLevel;\n currentLevel = level;\n notifyLevelChange(level, previousLevel, logger);\n },\n\n get levelVal() {\n return levelValues[currentLevel] ?? Infinity;\n },\n\n get msgPrefix() {\n return msgPrefix;\n },\n\n onChild: onChildCallback,\n get enabled() {\n return enabled;\n },\n\n set enabled(value: boolean) {\n enabled = value;\n },\n\n info: makeLogMethod('info'),\n\n error: makeLogMethod('error'),\n\n warn: makeLogMethod('warn'),\n\n debug: makeLogMethod('debug'),\n\n trace: makeLogMethod('trace'),\n\n fatal: makeLogMethod('fatal'),\n\n silent: (() => {}) as LogFn,\n\n child: (bindings: LogAttrs, childOptions?: ChildLoggerOptions) => {\n const childLogger = createEdgeLogger(service, {\n level: childOptions?.level ?? currentLevel,\n pretty,\n bindings: { ...currentBindings, ...bindings },\n redact: childOptions?.redact ?? options?.redact,\n msgPrefix:\n childOptions?.msgPrefix === undefined\n ? msgPrefix\n : `${msgPrefix ?? ''}${childOptions.msgPrefix}`,\n useLevelLabels: logger.useLevelLabels,\n onChild: onChildCallback,\n enabled,\n messageKey,\n errorKey,\n nestedKey,\n serializers: { ...serializers, ...childOptions?.serializers },\n formatters: {\n level: childOptions?.formatters?.level ?? levelFormatter,\n bindings: childOptions?.formatters?.bindings ?? bindingsFormatter,\n log: childOptions?.formatters?.log ?? logFormatter,\n },\n mixin,\n mixinMergeStrategy,\n customLevels,\n useOnlyCustomLevels: options?.useOnlyCustomLevels,\n levelComparison: options?.levelComparison,\n name: loggerName,\n base,\n timestamp,\n safe,\n crlf,\n depthLimit,\n edgeLimit: edgeLimitOpt,\n hooks,\n write: writeFn,\n transmit,\n _bindingsChain: [...bindingsChain, bindings],\n });\n onChildCallback(childLogger);\n return childLogger;\n },\n\n isLevelEnabled: (level: LevelWithSilentOrString) => shouldLog(level),\n\n bindings: () => ({ ...currentBindings }),\n\n setBindings: (bindings: LogAttrs) => {\n for (const [key, value] of Object.entries(bindings)) {\n if (!(key in currentBindings)) {\n currentBindings[key] = value;\n }\n }\n },\n\n flush: (cb?: (err?: Error) => void) => {\n cb?.();\n },\n\n emit: (event: string | symbol, ...args: any[]) => {\n const activeListeners = listeners.get(event);\n if (!activeListeners || activeListeners.length === 0) {\n return false;\n }\n const snapshot = [...activeListeners];\n for (const listener of snapshot) {\n listener(...args);\n }\n return true;\n },\n\n eventNames: () => [...listeners.keys()],\n\n getMaxListeners: () => maxListeners,\n\n listenerCount: (event: string | symbol) => listeners.get(event)?.length ?? 0,\n\n listeners: (event: string | symbol) => [...(listeners.get(event) ?? [])],\n\n on: (event: string | symbol, listener: EventListener) => {\n addListener(event, listener);\n return logger;\n },\n\n addListener: (event: string | symbol, listener: EventListener) => {\n addListener(event, listener);\n return logger;\n },\n\n once: (event: string | symbol, listener: EventListener) => {\n const wrapped: EventListener = (...args: any[]) => {\n removeEventListener(event, wrapped);\n listener(...args);\n };\n addListener(event, wrapped);\n return logger;\n },\n\n prependListener: (\n event: string | symbol,\n listener: EventListener,\n ) => {\n addListener(event, listener, true);\n return logger;\n },\n\n prependOnceListener: (\n event: string | symbol,\n listener: EventListener,\n ) => {\n const wrapped: EventListener = (...args: any[]) => {\n removeEventListener(event, wrapped);\n listener(...args);\n };\n addListener(event, wrapped, true);\n return logger;\n },\n\n rawListeners: (event: string | symbol) => [...(listeners.get(event) ?? [])],\n\n off: (event: string | symbol, listener: EventListener) => {\n removeEventListener(event, listener);\n return logger;\n },\n\n removeAllListeners: (event?: string | symbol) => {\n if (event === undefined) {\n listeners.clear();\n levelListeners.length = 0;\n return logger;\n }\n listeners.delete(event);\n if (event === 'level-change') {\n levelListeners.length = 0;\n }\n return logger;\n },\n\n removeListener: (\n event: string | symbol,\n listener: EventListener,\n ) => {\n removeEventListener(event, listener);\n return logger;\n },\n\n setMaxListeners: (n: number) => {\n maxListeners = n;\n return logger;\n },\n };\n\n for (const levelName of Object.keys(customLevels)) {\n logger[levelName] = makeLogMethod(levelName);\n }\n\n return logger;\n}\n\n/**\n * Helper to get trace context (useful for BYOL - Bring Your Own Logger)\n *\n * @example\n * ```typescript\n * import bunyan from 'bunyan'\n * import { getEdgeTraceContext } from 'autotel-edge/api/logger'\n *\n * const bunyanLogger = bunyan.createLogger({ name: 'myapp' })\n * const ctx = getEdgeTraceContext()\n * bunyanLogger.info({ ...ctx, email: 'test@example.com' }, 'Creating user')\n * ```\n */\nexport function getEdgeTraceContext() {\n return getTraceContext();\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { T as TailSampleFn, L as LocalTrace } from './types-BOs00OpG.js';
1
+ import { T as TailSampleFn, L as LocalTrace } from './types-CZFcIjJ4.js';
2
2
  import '@opentelemetry/api';
3
3
  import '@opentelemetry/sdk-trace-base';
4
4
 
@@ -193,4 +193,4 @@ interface HandlerInstrumentation<T extends Trigger, R extends any> {
193
193
  executionFailed?: (span: Span, trigger: T, error?: any) => void;
194
194
  }
195
195
 
196
- export type { ConfigurationOption as C, DOConstructorTrigger as D, EdgeEvent as E, FunnelStepStatus as F, HandlerInstrumentation as H, InstrumentationOptions as I, LocalTrace as L, OrPromise as O, PostProcessorFn as P, ResolvedEdgeConfig as R, ServiceConfig as S, TailSampleFn as T, WorkflowTrigger as W, OutcomeStatus as a, EdgeTrackEvent as b, EdgeFunnelStepEvent as c, EdgeOutcomeEvent as d, EdgeValueEvent as e, OTLPExporterConfig as f, EdgeConfig as g, Trigger as h, ExporterConfig as i, SamplingConfig as j, ResolveConfigFn as k, TraceFlushableSpanProcessor as l, InitialSpanInfo as m, EdgeSubscriber as n, DataSafetyConfig as o };
196
+ export type { ConfigurationOption as C, DOConstructorTrigger as D, EdgeEvent as E, FunnelStepStatus as F, HandlerInstrumentation as H, InitialSpanInfo as I, LocalTrace as L, OrPromise as O, PostProcessorFn as P, ResolvedEdgeConfig as R, SamplingConfig as S, TailSampleFn as T, WorkflowTrigger as W, OutcomeStatus as a, EdgeFunnelStepEvent as b, EdgeOutcomeEvent as c, EdgeTrackEvent as d, EdgeValueEvent as e, OTLPExporterConfig as f, Trigger as g, EdgeConfig as h, DataSafetyConfig as i, EdgeSubscriber as j, ExporterConfig as k, InstrumentationOptions as l, ResolveConfigFn as m, ServiceConfig as n, TraceFlushableSpanProcessor as o };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-edge",
3
- "version": "3.16.0",
3
+ "version": "3.16.2",
4
4
  "description": "Vendor-agnostic OpenTelemetry for edge runtimes - foundation for Cloudflare, Vercel, Netlify, Deno",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",