autotel-edge 3.16.13 → 3.16.15

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.
Files changed (45) hide show
  1. package/dist/config-0FktBGyj.js +290 -0
  2. package/dist/config-0FktBGyj.js.map +1 -0
  3. package/dist/events.d.ts +42 -43
  4. package/dist/events.d.ts.map +1 -0
  5. package/dist/events.js +144 -137
  6. package/dist/events.js.map +1 -1
  7. package/dist/execution-logger-BWlya70r.d.ts +137 -0
  8. package/dist/execution-logger-BWlya70r.d.ts.map +1 -0
  9. package/dist/execution-logger-CoxSsBmU.js +247 -0
  10. package/dist/execution-logger-CoxSsBmU.js.map +1 -0
  11. package/dist/index.d.ts +192 -276
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +930 -1060
  14. package/dist/index.js.map +1 -1
  15. package/dist/logger.d.ts +122 -136
  16. package/dist/logger.d.ts.map +1 -0
  17. package/dist/logger.js +783 -774
  18. package/dist/logger.js.map +1 -1
  19. package/dist/parse-error.d.ts +12 -10
  20. package/dist/parse-error.d.ts.map +1 -0
  21. package/dist/parse-error.js +55 -2
  22. package/dist/parse-error.js.map +1 -1
  23. package/dist/sampling.d.ts +51 -76
  24. package/dist/sampling.d.ts.map +1 -0
  25. package/dist/sampling.js +155 -90
  26. package/dist/sampling.js.map +1 -1
  27. package/dist/testing.d.ts +1 -2
  28. package/dist/testing.js +1 -3
  29. package/dist/types-HCbsjZzp.d.ts +214 -0
  30. package/dist/types-HCbsjZzp.d.ts.map +1 -0
  31. package/package.json +6 -6
  32. package/src/core/buffer.ts +4 -3
  33. package/src/core/provider.context.test.ts +55 -0
  34. package/src/core/provider.ts +18 -1
  35. package/binding.gyp +0 -9
  36. package/dist/chunk-AL7ZD64M.js +0 -291
  37. package/dist/chunk-AL7ZD64M.js.map +0 -1
  38. package/dist/chunk-INQQQVXN.js +0 -310
  39. package/dist/chunk-INQQQVXN.js.map +0 -1
  40. package/dist/chunk-M7Z4P5MC.js +0 -64
  41. package/dist/chunk-M7Z4P5MC.js.map +0 -1
  42. package/dist/execution-logger-77TRRoWn.d.ts +0 -84
  43. package/dist/testing.js.map +0 -1
  44. package/dist/types-uulICZo7.d.ts +0 -216
  45. package/index.js +0 -1
@@ -1 +1 @@
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
+ {"version":3,"file":"logger.js","names":["api_context"],"sources":["../src/api/redact.ts","../src/api/logger.ts"],"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"],"mappings":"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"}
@@ -1,13 +1,15 @@
1
+ //#region src/parse-error.d.ts
1
2
  interface ParsedError {
2
- message: string;
3
- status: number;
4
- why?: string;
5
- fix?: string;
6
- link?: string;
7
- code?: string | number;
8
- details?: Record<string, unknown>;
9
- raw: unknown;
3
+ message: string;
4
+ status: number;
5
+ why?: string;
6
+ fix?: string;
7
+ link?: string;
8
+ code?: string | number;
9
+ details?: Record<string, unknown>;
10
+ raw: unknown;
10
11
  }
11
12
  declare function parseError(error: unknown): ParsedError;
12
-
13
- export { type ParsedError, parseError };
13
+ //#endregion
14
+ export { ParsedError, parseError };
15
+ //# sourceMappingURL=parse-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-error.d.ts","names":[],"sources":["../src/parse-error.ts"],"mappings":";UAAiB,WAAA;EACf,OAAA;EACA,MAAA;EACA,GAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA;EACA,OAAA,GAAU,MAAM;EAChB,GAAA;AAAA;AAAA,iBAwCc,UAAA,CAAW,KAAA,YAAiB,WAAW"}
@@ -1,3 +1,56 @@
1
- export { parseError } from './chunk-M7Z4P5MC.js';
2
- //# sourceMappingURL=parse-error.js.map
1
+ //#region src/parse-error.ts
2
+ function toStatus(value) {
3
+ if (typeof value === "number" && Number.isFinite(value)) return value;
4
+ if (typeof value === "string") {
5
+ const n = Number(value);
6
+ if (Number.isFinite(n)) return n;
7
+ }
8
+ }
9
+ function pickString(value) {
10
+ return typeof value === "string" && value.length > 0 ? value : void 0;
11
+ }
12
+ function pickCode(value) {
13
+ if (typeof value === "string" || typeof value === "number") return value;
14
+ }
15
+ function pickDetails(value) {
16
+ if (value && typeof value === "object" && value.constructor === Object) return value;
17
+ }
18
+ function parseError(error) {
19
+ if (error instanceof Error) {
20
+ const structured = error;
21
+ return {
22
+ message: error.message || "An error occurred",
23
+ status: toStatus(structured.status) ?? 500,
24
+ why: pickString(structured.why),
25
+ fix: pickString(structured.fix),
26
+ link: pickString(structured.link),
27
+ code: pickCode(structured.code),
28
+ details: pickDetails(structured.details),
29
+ raw: error
30
+ };
31
+ }
32
+ if (error && typeof error === "object") {
33
+ const err = error;
34
+ const data = err.data && typeof err.data === "object" ? err.data : void 0;
35
+ const payload = (data?.data && typeof data.data === "object" ? data.data : void 0) ?? data;
36
+ return {
37
+ message: pickString(data?.statusText) || pickString(data?.statusMessage) || pickString(data?.message) || pickString(payload?.statusText) || pickString(payload?.statusMessage) || pickString(payload?.message) || pickString(err.message) || "An error occurred",
38
+ status: toStatus(payload?.status) || toStatus(payload?.statusCode) || toStatus(err.status) || toStatus(err.statusCode) || 500,
39
+ why: pickString(payload?.why) || pickString(err.why),
40
+ fix: pickString(payload?.fix) || pickString(err.fix),
41
+ link: pickString(payload?.link) || pickString(err.link),
42
+ code: pickCode(payload?.code) || pickCode(err.code),
43
+ details: pickDetails(payload?.details) || pickDetails(err.details),
44
+ raw: error
45
+ };
46
+ }
47
+ return {
48
+ message: String(error),
49
+ status: 500,
50
+ raw: error
51
+ };
52
+ }
53
+
54
+ //#endregion
55
+ export { parseError };
3
56
  //# sourceMappingURL=parse-error.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"parse-error.js"}
1
+ {"version":3,"file":"parse-error.js","names":[],"sources":["../src/parse-error.ts"],"sourcesContent":["export interface ParsedError {\n message: string;\n status: number;\n why?: string;\n fix?: string;\n link?: string;\n code?: string | number;\n details?: Record<string, unknown>;\n raw: unknown;\n}\n\ntype ErrorLike = {\n message?: unknown;\n status?: unknown;\n statusCode?: unknown;\n data?: unknown;\n code?: unknown;\n why?: unknown;\n fix?: unknown;\n link?: unknown;\n details?: unknown;\n};\n\nfunction toStatus(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n const n = Number(value);\n if (Number.isFinite(n)) return n;\n }\n return undefined;\n}\n\nfunction pickString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction pickCode(value: unknown): string | number | undefined {\n if (typeof value === 'string' || typeof value === 'number') return value;\n return undefined;\n}\n\nfunction pickDetails(value: unknown): Record<string, unknown> | undefined {\n if (value && typeof value === 'object' && value.constructor === Object) {\n return value as Record<string, unknown>;\n }\n return undefined;\n}\n\nexport function parseError(error: unknown): ParsedError {\n if (error instanceof Error) {\n const structured = error as ErrorLike;\n return {\n message: error.message || 'An error occurred',\n status: toStatus(structured.status) ?? 500,\n why: pickString(structured.why),\n fix: pickString(structured.fix),\n link: pickString(structured.link),\n code: pickCode(structured.code),\n details: pickDetails(structured.details),\n raw: error,\n };\n }\n\n if (error && typeof error === 'object') {\n const err = error as ErrorLike;\n const data =\n err.data && typeof err.data === 'object'\n ? (err.data as Record<string, unknown>)\n : undefined;\n const nested =\n data?.data && typeof data.data === 'object'\n ? (data.data as Record<string, unknown>)\n : undefined;\n const payload = nested ?? data;\n\n const message =\n pickString(data?.statusText) ||\n pickString(data?.statusMessage) ||\n pickString(data?.message) ||\n pickString(payload?.statusText) ||\n pickString(payload?.statusMessage) ||\n pickString(payload?.message) ||\n pickString(err.message) ||\n 'An error occurred';\n\n const status =\n toStatus(payload?.status) ||\n toStatus(payload?.statusCode) ||\n toStatus(err.status) ||\n toStatus(err.statusCode) ||\n 500;\n\n return {\n message,\n status,\n why: pickString(payload?.why) || pickString(err.why),\n fix: pickString(payload?.fix) || pickString(err.fix),\n link: pickString(payload?.link) || pickString(err.link),\n code: pickCode(payload?.code) || pickCode(err.code),\n details: pickDetails(payload?.details) || pickDetails(err.details),\n raw: error,\n };\n }\n\n return {\n message: String(error),\n status: 500,\n raw: error,\n };\n}\n"],"mappings":";AAuBA,SAAS,SAAS,OAAoC;CACpD,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG,OAAO;CAChE,IAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,IAAI,OAAO,KAAK;EACtB,IAAI,OAAO,SAAS,CAAC,GAAG,OAAO;CACjC;AAEF;AAEA,SAAS,WAAW,OAAoC;CACtD,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,SAAS,OAA6C;CAC7D,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU,OAAO;AAErE;AAEA,SAAS,YAAY,OAAqD;CACxE,IAAI,SAAS,OAAO,UAAU,YAAY,MAAM,gBAAgB,QAC9D,OAAO;AAGX;AAEA,SAAgB,WAAW,OAA6B;CACtD,IAAI,iBAAiB,OAAO;EAC1B,MAAM,aAAa;EACnB,OAAO;GACL,SAAS,MAAM,WAAW;GAC1B,QAAQ,SAAS,WAAW,MAAM,KAAK;GACvC,KAAK,WAAW,WAAW,GAAG;GAC9B,KAAK,WAAW,WAAW,GAAG;GAC9B,MAAM,WAAW,WAAW,IAAI;GAChC,MAAM,SAAS,WAAW,IAAI;GAC9B,SAAS,YAAY,WAAW,OAAO;GACvC,KAAK;EACP;CACF;CAEA,IAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,MAAM;EACZ,MAAM,OACJ,IAAI,QAAQ,OAAO,IAAI,SAAS,WAC3B,IAAI,OACL;EAKN,MAAM,WAHJ,MAAM,QAAQ,OAAO,KAAK,SAAS,WAC9B,KAAK,OACN,WACoB;EAmB1B,OAAO;GACL,SAjBA,WAAW,MAAM,UAAU,KAC3B,WAAW,MAAM,aAAa,KAC9B,WAAW,MAAM,OAAO,KACxB,WAAW,SAAS,UAAU,KAC9B,WAAW,SAAS,aAAa,KACjC,WAAW,SAAS,OAAO,KAC3B,WAAW,IAAI,OAAO,KACtB;GAWA,QARA,SAAS,SAAS,MAAM,KACxB,SAAS,SAAS,UAAU,KAC5B,SAAS,IAAI,MAAM,KACnB,SAAS,IAAI,UAAU,KACvB;GAKA,KAAK,WAAW,SAAS,GAAG,KAAK,WAAW,IAAI,GAAG;GACnD,KAAK,WAAW,SAAS,GAAG,KAAK,WAAW,IAAI,GAAG;GACnD,MAAM,WAAW,SAAS,IAAI,KAAK,WAAW,IAAI,IAAI;GACtD,MAAM,SAAS,SAAS,IAAI,KAAK,SAAS,IAAI,IAAI;GAClD,SAAS,YAAY,SAAS,OAAO,KAAK,YAAY,IAAI,OAAO;GACjE,KAAK;EACP;CACF;CAEA,OAAO;EACL,SAAS,OAAO,KAAK;EACrB,QAAQ;EACR,KAAK;CACP;AACF"}
@@ -1,54 +1,28 @@
1
- import { T as TailSampleFn, L as LocalTrace } from './types-uulICZo7.js';
2
- import '@opentelemetry/api';
3
- import '@opentelemetry/sdk-trace-base';
4
-
5
- /**
6
- * Sampling strategies for autotel-edge
7
- *
8
- * Provides intelligent sampling to reduce telemetry costs while capturing critical data.
9
- *
10
- * Key strategies:
11
- * - Always trace errors and slow requests (critical for debugging)
12
- * - Adaptive sampling based on load
13
- * - Baseline random sampling for normal traffic
14
- *
15
- * @example
16
- * ```typescript
17
- * import { createAdaptiveTailSampler } from 'autotel-edge/sampling'
18
- *
19
- * export default instrument(handler, {
20
- * sampling: {
21
- * tailSampler: createAdaptiveTailSampler({
22
- * baselineSampleRate: 0.1, // 10% of normal requests
23
- * slowThresholdMs: 1000, // Requests > 1s are "slow"
24
- * })
25
- * }
26
- * })
27
- * ```
28
- */
1
+ import { D as TailSampleFn, g as LocalTrace } from "./types-HCbsjZzp.js";
29
2
 
3
+ //#region src/sampling/index.d.ts
30
4
  interface AdaptiveSamplerOptions {
31
- /**
32
- * Baseline sample rate for normal (successful, fast) requests
33
- * @default 0.1 (10%)
34
- */
35
- baselineSampleRate?: number;
36
- /**
37
- * Threshold in milliseconds for "slow" requests
38
- * Requests taking longer than this will always be trace
39
- * @default 1000ms
40
- */
41
- slowThresholdMs?: number;
42
- /**
43
- * Always trace error spans
44
- * @default true
45
- */
46
- alwaysSampleErrors?: boolean;
47
- /**
48
- * Always trace slow spans
49
- * @default true
50
- */
51
- alwaysSampleSlow?: boolean;
5
+ /**
6
+ * Baseline sample rate for normal (successful, fast) requests
7
+ * @default 0.1 (10%)
8
+ */
9
+ baselineSampleRate?: number;
10
+ /**
11
+ * Threshold in milliseconds for "slow" requests
12
+ * Requests taking longer than this will always be trace
13
+ * @default 1000ms
14
+ */
15
+ slowThresholdMs?: number;
16
+ /**
17
+ * Always trace error spans
18
+ * @default true
19
+ */
20
+ alwaysSampleErrors?: boolean;
21
+ /**
22
+ * Always trace slow spans
23
+ * @default true
24
+ */
25
+ alwaysSampleSlow?: boolean;
52
26
  }
53
27
  /**
54
28
  * Create an adaptive tail sampler
@@ -136,31 +110,32 @@ declare function createCustomTailSampler(predicate: (traceInfo: LocalTrace) => b
136
110
  * Common presets for quick setup
137
111
  */
138
112
  declare const SamplingPresets: {
139
- /**
140
- * Production: 10% baseline, all errors, all slow (>1s)
141
- * Recommended for most production workloads
142
- */
143
- production: () => TailSampleFn;
144
- /**
145
- * High-traffic: 1% baseline, all errors, all slow (>2s)
146
- * For high-volume services where cost is a concern
147
- */
148
- highTraffic: () => TailSampleFn;
149
- /**
150
- * Debugging: All errors, all slow (>500ms), 50% baseline
151
- * For active debugging sessions
152
- */
153
- debugging: () => TailSampleFn;
154
- /**
155
- * Development: 100% sampling
156
- * For local development and testing
157
- */
158
- development: () => TailSampleFn;
159
- /**
160
- * Errors only: Capture all failures, drop all successes
161
- * For error-focused monitoring
162
- */
163
- errorsOnly: () => TailSampleFn;
113
+ /**
114
+ * Production: 10% baseline, all errors, all slow (>1s)
115
+ * Recommended for most production workloads
116
+ */
117
+ production: () => TailSampleFn;
118
+ /**
119
+ * High-traffic: 1% baseline, all errors, all slow (>2s)
120
+ * For high-volume services where cost is a concern
121
+ */
122
+ highTraffic: () => TailSampleFn;
123
+ /**
124
+ * Debugging: All errors, all slow (>500ms), 50% baseline
125
+ * For active debugging sessions
126
+ */
127
+ debugging: () => TailSampleFn;
128
+ /**
129
+ * Development: 100% sampling
130
+ * For local development and testing
131
+ */
132
+ development: () => TailSampleFn;
133
+ /**
134
+ * Errors only: Capture all failures, drop all successes
135
+ * For error-focused monitoring
136
+ */
137
+ errorsOnly: () => TailSampleFn;
164
138
  };
165
-
166
- export { type AdaptiveSamplerOptions, SamplingPresets, combineTailSamplers, createAdaptiveTailSampler, createCustomTailSampler, createErrorOnlyTailSampler, createRandomTailSampler, createSlowOnlyTailSampler };
139
+ //#endregion
140
+ export { AdaptiveSamplerOptions, SamplingPresets, combineTailSamplers, createAdaptiveTailSampler, createCustomTailSampler, createErrorOnlyTailSampler, createRandomTailSampler, createSlowOnlyTailSampler };
141
+ //# sourceMappingURL=sampling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampling.d.ts","names":[],"sources":["../src/sampling/index.ts"],"mappings":";;;UA4BiB,sBAAA;EAmGwD;AA4BzE;;;EA1HE,kBAAA;EA0HwD;AAiB1D;;;;EApIE,eAAA;EAyJc;;;;EAnJd,kBAAA;EAmJ+C;;;AAA6B;EA7I5E,gBAAA;AAAA;;;;;;;;AAqKa;AAgBf;;;;;;;;;;;;iBA9JgB,yBAAA,CACd,OAAA,GAAS,sBAAA,GACR,YAAY;;;;;;;;;AAqMe;;iBAnJd,uBAAA,CAAwB,UAAA,WAAqB,YAAY;;;;;;;;;;;iBA4BzD,0BAAA,IAA8B,YAAY;;;;;;;;;;;iBAiB1C,yBAAA,CAA0B,WAAA,WAAsB,YAAY;;;;;;;;;;;;;;;iBAqB5D,mBAAA,IAAuB,QAAA,EAAU,YAAA,KAAiB,YAAY;;;;;;;;;;;;;iBAsB9D,uBAAA,CACd,SAAA,GAAY,SAAA,EAAW,UAAA,eACtB,YAAY;;;;cAgBF,eAAA;;;;;oBAKK,YAAA;;;;;qBAUC,YAAA;;;;;mBAUF,YAAA;;;;;qBAUE,YAAA;;;;;oBAMD,YAAA;AAAA"}