@brizz/sdk 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -7
- package/dist/index.cjs +38 -144
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.js +35 -142
- package/dist/index.js.map +1 -1
- package/dist/preload.cjs +21 -139
- package/dist/preload.cjs.map +1 -1
- package/dist/preload.js +21 -139
- package/dist/preload.js.map +1 -1
- package/package.json +53 -53
package/dist/preload.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/logger.ts","../src/internal/sdk.ts","../src/internal/config.ts","../src/internal/instrumentation/registry.ts","../src/internal/log/logging.ts","../src/internal/log/processors/log-processor.ts","../src/internal/masking/patterns.ts","../src/internal/masking/utils.ts","../src/internal/semantic-conventions.ts","../src/internal/metric/metrics.ts","../src/internal/trace/tracing.ts","../src/internal/trace/processors/span-processor.ts","../src/internal/trace/transformations/vercel-ai.ts","../src/internal/trace/session.ts","../src/node/loader.ts","../src/node/runtime.ts","../src/preload.ts"],"sourcesContent":["/**\n * Logger interface and implementations for the Brizz SDK.\n *\n * Simple Pino-based logging system that works everywhere in the SDK,\n * including during bootstrap and instrumentation loading.\n */\n\nimport { DiagLogLevel } from '@opentelemetry/api';\nimport pino from 'pino';\n\n/**\n * Available log levels for the Brizz SDK, ordered by severity.\n */\nexport enum LogLevel {\n NONE = 0,\n ERROR = 1,\n WARN = 2,\n INFO = 3,\n DEBUG = 4,\n}\n\n/**\n * Default log level for the SDK when no level is specified.\n */\nexport const DEFAULT_LOG_LEVEL = LogLevel.WARN;\n\n/**\n * Internal logger interface for the SDK.\n */\nexport interface ILogger {\n debug: (msg: string, ...meta: unknown[]) => void;\n info: (msg: string, ...meta: unknown[]) => void;\n warn: (msg: string, ...meta: unknown[]) => void;\n error: (msg: string, ...meta: unknown[]) => void;\n setLevel: (level: LogLevel) => void;\n getLevel: () => LogLevel;\n}\n\n/**\n * Pino-based logger implementation with dynamic level control.\n */\nclass PinoLogger implements ILogger {\n private _level: LogLevel = DEFAULT_LOG_LEVEL;\n private _pinoLogger: pino.Logger | null = null;\n\n constructor() {\n // Set initial level from environment\n const envLevel = this.getLogLevelFromEnv();\n this._level = envLevel;\n }\n\n /**\n * Lazy initialization of Pino logger to ensure it's created AFTER Jest spies\n * are set up during tests. This prevents the pino-pretty transport from\n * bypassing stdout/stderr spies.\n */\n private ensurePinoLogger(): pino.Logger {\n if (!this._pinoLogger) {\n this._pinoLogger = pino({\n name: 'Brizz',\n level: this.logLevelToPino(this._level),\n // Disable transport in test environment to allow proper spy capture\n transport: this.isProduction() || this.isTest()\n ? undefined\n : {\n target: 'pino-pretty',\n options: {\n singleLine: true,\n colorize: true,\n translateTime: 'HH:MM:ss',\n ignore: 'pid,hostname',\n messageFormat: '[{name}] {msg}',\n },\n },\n });\n }\n return this._pinoLogger;\n }\n\n private isProduction(): boolean {\n return process.env['NODE_ENV'] === 'production';\n }\n\n private isTest(): boolean {\n return process.env['NODE_ENV'] === 'test';\n }\n\n private getLogLevelFromEnv(): LogLevel {\n const envLevel = process.env['BRIZZ_LOG_LEVEL'];\n return envLevel ? parseLogLevel(envLevel) : DEFAULT_LOG_LEVEL;\n }\n\n private logLevelToPino(level: LogLevel): string {\n switch (level) {\n case LogLevel.DEBUG:\n return 'debug';\n case LogLevel.INFO:\n return 'info';\n case LogLevel.WARN:\n return 'warn';\n case LogLevel.ERROR:\n return 'error';\n default:\n return 'silent';\n }\n }\n\n private formatMeta(meta: unknown[]): object {\n if (meta.length === 0) {\n return {};\n }\n\n if (meta.length === 1 && typeof meta[0] === 'object' && meta[0] !== null) {\n return meta[0] as object;\n }\n\n return { metadata: meta };\n }\n\n setLevel(level: LogLevel): void {\n this._level = level;\n if (this._pinoLogger) {\n this._pinoLogger.level = this.logLevelToPino(level);\n }\n }\n\n getLevel(): LogLevel {\n return this._level;\n }\n\n debug = (msg: string, ...meta: unknown[]): void => {\n if (this._level >= LogLevel.DEBUG) {\n this.ensurePinoLogger().debug(this.formatMeta(meta), msg);\n }\n };\n\n info = (msg: string, ...meta: unknown[]): void => {\n if (this._level >= LogLevel.INFO) {\n this.ensurePinoLogger().info(this.formatMeta(meta), msg);\n }\n };\n\n warn = (msg: string, ...meta: unknown[]): void => {\n if (this._level >= LogLevel.WARN) {\n this.ensurePinoLogger().warn(this.formatMeta(meta), msg);\n }\n };\n\n error = (msg: string, ...meta: unknown[]): void => {\n if (this._level >= LogLevel.ERROR) {\n this.ensurePinoLogger().error(this.formatMeta(meta), msg);\n }\n };\n}\n\n/**\n * No-op logger that silences all logging output.\n */\nexport const noopLogger: ILogger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n setLevel: () => {},\n getLevel: () => LogLevel.NONE,\n};\n\n/**\n * Parses a log level string into a LogLevel enum value.\n * Supports both string names and numeric values.\n */\nexport function parseLogLevel(level?: string): LogLevel {\n if (!level) {\n return DEFAULT_LOG_LEVEL;\n }\n\n const normalizedLevel = level.toLowerCase().trim();\n\n switch (normalizedLevel) {\n case 'debug':\n return LogLevel.DEBUG;\n case 'info':\n return LogLevel.INFO;\n case 'warn':\n case 'warning':\n return LogLevel.WARN;\n case 'error':\n return LogLevel.ERROR;\n case 'none':\n case 'off':\n case 'silent':\n return LogLevel.NONE;\n default: {\n // Try to parse as number\n const numLevel = Number.parseInt(normalizedLevel, 10);\n if (!Number.isNaN(numLevel) && numLevel >= 0 && numLevel <= 4) {\n return numLevel as LogLevel;\n }\n return DEFAULT_LOG_LEVEL;\n }\n }\n}\n\n/**\n * Global logger instance - initialized once and used throughout the SDK.\n */\nexport const logger: ILogger = new PinoLogger();\n\n/**\n * Sets the global logger level.\n */\nexport function setLogLevel(level: LogLevel | string): void {\n const resolvedLevel = typeof level === 'string' ? parseLogLevel(level) : level;\n logger.setLevel(resolvedLevel);\n}\n\n/**\n * Gets the current global logger level.\n */\nexport function getLogLevel(): LogLevel {\n return logger.getLevel();\n}\n\n/**\n * Maps Brizz LogLevel to OpenTelemetry DiagLogLevel.\n */\nexport function mapLogLevelToDiagLevel(logLevel: LogLevel): DiagLogLevel {\n switch (logLevel) {\n case LogLevel.DEBUG:\n return DiagLogLevel.DEBUG;\n case LogLevel.INFO:\n return DiagLogLevel.INFO;\n case LogLevel.WARN:\n return DiagLogLevel.WARN;\n case LogLevel.ERROR:\n return DiagLogLevel.ERROR;\n default:\n return DiagLogLevel.NONE;\n }\n}\n","import { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport type { MetricReader } from '@opentelemetry/sdk-metrics';\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\n\nimport type { IResolvedBrizzConfig } from './config';\nimport { resolveConfig } from './config';\nimport { InstrumentationRegistry, type IInstrumentModules } from './instrumentation';\nimport { LoggingModule } from './log';\nimport type { LogLevel } from './logger';\nimport { logger } from './logger';\nimport { type IMaskingConfig } from './masking';\nimport { getMetricsReader, MetricsModule } from './metric';\nimport { getSpanProcessor, TracingModule } from './trace';\n\n/**\n * Configuration options for initializing the Brizz SDK.\n *\n * @interface IBrizzInitializeOptions\n */\nexport interface IBrizzInitializeOptions {\n /** Application name for service identification */\n appName?: string;\n /** Base URL for telemetry endpoints (defaults to https://telemetry.brizz.dev) */\n baseUrl?: string;\n /** API key for authentication */\n apiKey?: string;\n /** Additional HTTP headers to include in telemetry requests */\n headers?: Record<string, string>;\n /** Disable batch processing for immediate event emission */\n disableBatch?: boolean;\n /**\n * Configuration for data masking and PII protection.\n * - `true`: Enable masking with default rules\n * - `false` or `undefined`: Disable masking\n * - `IMaskingConfig`: Enable masking with custom configuration\n */\n masking?: boolean | IMaskingConfig;\n /** Log level for SDK internal logging and OpenTelemetry diagnostic logging (debug, info, warn, error, none) */\n logLevel?: LogLevel | string;\n /**\n * Manual instrumentation modules for Next.js/Webpack environments.\n * Provide the actual imported modules to enable instrumentation in environments\n * where automatic instrumentation doesn't work properly.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import * as LlamaIndex from 'llamaindex';\n *\n * Brizz.initialize({\n * appName: 'my-app',\n * instrumentModules: {\n * openAI: OpenAI,\n * llamaindex: LlamaIndex\n * }\n * });\n * ```\n */\n instrumentModules?: IInstrumentModules;\n /**\n * Disable the internal NodeSDK initialization and only setup telemetry modules.\n * This is useful when you want to create your own NodeSDK using Brizz utilities.\n * Brizz will automatically register its instrumentations with your SDK.\n *\n * @example\n * ```typescript\n * import { NodeSDK } from '@opentelemetry/sdk-node';\n * import { Brizz, getSpanProcessor } from 'brizz-sdk';\n *\n * // Initialize Brizz without internal NodeSDK\n * Brizz.initialize({\n * appName: 'my-app',\n * disableNodeSdk: true\n * });\n *\n * // Create your own NodeSDK\n * const sdk = new NodeSDK({\n * spanProcessors: [getSpanProcessor()],\n * // your custom configuration\n * });\n * sdk.start();\n * ```\n */\n disableNodeSdk?: boolean;\n /**\n * Custom span exporter for testing or alternative backends.\n * When provided, this exporter will be used instead of the default OTLP exporter.\n * Useful for integration testing with InMemorySpanExporter or custom exporters.\n *\n * @example\n * ```typescript\n * import { InMemorySpanExporter } from '@opentelemetry/sdk-trace-base';\n *\n * const spanExporter = new InMemorySpanExporter();\n * Brizz.initialize({\n * appName: 'test-app',\n * customSpanExporter: spanExporter\n * });\n *\n * // Later in tests\n * const spans = spanExporter.getFinishedSpans();\n * ```\n */\n customSpanExporter?: SpanExporter;\n /**\n * Custom log exporter for testing or alternative backends.\n * When provided, this exporter will be used instead of the default OTLP exporter.\n * Useful for integration testing with InMemoryLogExporter or custom exporters.\n *\n * @example\n * ```typescript\n * import { InMemoryLogExporter } from 'brizz-sdk/test-utils';\n *\n * const logExporter = new InMemoryLogExporter();\n * Brizz.initialize({\n * appName: 'test-app',\n * customLogExporter: logExporter\n * });\n *\n * // Later in tests\n * const logs = logExporter.getFinishedLogs();\n * ```\n */\n customLogExporter?: LogRecordExporter;\n /**\n * Custom metric reader for testing or alternative backends.\n * When provided, this reader will be used instead of the default OTLP exporter.\n * Useful for integration testing with InMemoryMetricReader or custom readers.\n *\n * @example\n * ```typescript\n * import { InMemoryMetricReader } from 'brizz-sdk/test-utils';\n *\n * const metricReader = new InMemoryMetricReader();\n * Brizz.initialize({\n * appName: 'test-app',\n * customMetricReader: metricReader\n * });\n *\n * // Later in tests\n * const metrics = metricReader.getCollectedMetrics();\n * ```\n */\n customMetricReader?: MetricReader;\n}\n\n/**\n * Internal implementation of the Brizz SDK.\n *\n * This class is responsible only for initialization and shutdown of the SDK.\n * All functionality is exposed through standalone utility functions.\n *\n * @class _Brizz\n * @internal\n */\nexport class _Brizz {\n private static instance: _Brizz | null = null;\n /** Flag indicating if SDK initialization has completed successfully */\n private _initialized = false;\n\n /** OpenTelemetry sdk instance */\n private _sdk: NodeSDK | null = null;\n\n static getInstance(): _Brizz {\n if (!_Brizz.instance) {\n throw new Error('Brizz must be initialized before accessing TracingModule');\n }\n return _Brizz.instance;\n }\n\n /**\n * Initialize the Brizz SDK with the provided configuration.\n *\n * @param {IBrizzInitializeOptions} options - Configuration options for the SDK\n * @throws {Error} - If initialization fails\n *\n * @example\n * ```typescript\n * Brizz.initialize({\n * appName: 'my-app',\n * baseUrl: 'http://localhost:4318',\n * apiKey: 'your-api-key'\n * });\n * ```\n */\n initialize(options: IBrizzInitializeOptions): void {\n if (this._initialized) {\n logger.warn('Brizz SDK already initialized');\n return;\n }\n\n logger.info('Starting Brizz SDK initialization');\n\n try {\n const resolvedConfig = resolveConfig(options);\n this.initializeModules(resolvedConfig);\n this.setupInstrumentation(options);\n this.createAndStartNodeSDK(options, resolvedConfig);\n\n this._initialized = true;\n logger.info('Brizz SDK initialization completed successfully', {\n moduleSystem: this.detectModuleSystem(),\n });\n } catch (error) {\n logger.error('Failed to initialize Brizz SDK', { error });\n throw new Error(`Failed to initialize SDK: ${String(error)}`);\n }\n }\n\n /**\n * Set up instrumentation registry and configure manual modules.\n * @private\n */\n private setupInstrumentation(options: IBrizzInitializeOptions): void {\n const registry = InstrumentationRegistry.getInstance();\n\n if (options.instrumentModules && Object.keys(options.instrumentModules).length > 0) {\n registry.setManualModules(options.instrumentModules);\n }\n }\n\n /**\n * Create and start NodeSDK if not disabled.\n * Only handles manual instrumentations now - auto instrumentations are loaded at import time.\n * @private\n */\n private createAndStartNodeSDK(\n options: IBrizzInitializeOptions,\n resolvedConfig: IResolvedBrizzConfig,\n ): void {\n if (options.disableNodeSdk) {\n logger.info('NodeSDK disabled - only telemetry modules initialized');\n return;\n }\n\n const registry = InstrumentationRegistry.getInstance();\n const manualInstrumentations = registry.getManualInstrumentations();\n\n this._sdk = new NodeSDK({\n spanProcessors: [getSpanProcessor()],\n metricReader: getMetricsReader(),\n resource: resourceFromAttributes({\n 'service.name': resolvedConfig.appName,\n }),\n instrumentations: manualInstrumentations,\n });\n this._sdk.start();\n\n if (manualInstrumentations.length > 0) {\n logger.info(`NodeSDK started with ${manualInstrumentations.length} manual instrumentations`);\n } else {\n logger.info('NodeSDK started - using auto-instrumentations loaded at import time');\n }\n }\n\n /**\n * Initialize telemetry modules.\n *\n * Sets up the tracing, metrics, and logging modules with their\n * respective exporters and processors.\n *\n * @param {IResolvedBrizzConfig} config - Resolved configuration\n * @private\n */\n private initializeModules(config: IResolvedBrizzConfig): void {\n logger.info('Initializing telemetry modules');\n\n // Initialize tracing module\n logger.debug('Initializing tracing module');\n const tracingModule = new TracingModule();\n tracingModule.setup(config);\n\n // Initialize metrics module\n logger.debug('Initializing metrics module');\n const metricsModule = new MetricsModule();\n metricsModule.setup(config);\n\n // Initialize logging module\n logger.debug('Initializing logging module');\n const loggingModule = new LoggingModule();\n loggingModule.setup(config);\n\n logger.info('All telemetry modules initialized successfully');\n }\n\n /**\n * Detect the current module system (ESM or CJS) using reliable indicators\n *\n * @returns {string} - 'ESM' or 'CJS'\n * @private\n */\n private detectModuleSystem(): string {\n const inCJS =\n typeof module !== 'undefined' &&\n typeof exports !== 'undefined' &&\n typeof require === 'function' &&\n typeof __filename === 'string' &&\n typeof __dirname === 'string' &&\n\n this === (typeof exports !== 'undefined' ? exports : undefined); // top-level `this` is exports in CJS, undefined in ESM\n\n return inCJS ? 'CJS' : 'ESM';\n }\n\n /**\n * Gracefully shutdown the Brizz SDK.\n *\n * This method stops all telemetry collection, flushes any pending data,\n * and releases resources. Should be called before application termination.\n *\n * @returns {Promise<void>} - Resolves when shutdown is complete\n * @throws {Error} - If shutdown fails\n *\n * @example\n * ```typescript\n * // Shutdown before app exit\n * await Brizz.shutdown();\n * ```\n */\n public async shutdown(): Promise<void> {\n if (!this._initialized) {\n logger.warn('Brizz SDK not initialized');\n return;\n }\n\n try {\n // Shutdown all modules\n await this.shutdownModules();\n await this._sdk?.shutdown();\n\n // Clear all references\n this._initialized = false;\n this._sdk = null;\n _Brizz.instance = null;\n\n logger.info('Brizz SDK shut down successfully');\n } catch (error) {\n // Suppress network errors during shutdown in tests\n if (error instanceof Error && error.message.includes('ENOTFOUND')) {\n logger.debug(`Network error during shutdown (expected in tests): ${error.message}`);\n } else {\n logger.error(`Failed to shutdown Brizz SDK: ${String(error)}`);\n throw error;\n }\n }\n }\n\n /**\n * Shutdown all telemetry modules.\n * @private\n */\n private async shutdownModules(): Promise<void> {\n logger.info('Shutting down telemetry modules');\n\n try {\n // Shutdown tracing module\n try {\n const tracingModule = TracingModule.getInstance();\n await tracingModule.shutdown();\n } catch {\n logger.debug('Tracing module already shut down or not initialized');\n }\n\n // Shutdown metrics module\n try {\n const metricsModule = MetricsModule.getInstance();\n metricsModule.shutdown();\n } catch {\n logger.debug('Metrics module already shut down or not initialized');\n }\n\n // Shutdown logging module\n try {\n const loggingModule = LoggingModule.getInstance();\n await loggingModule.shutdown();\n } catch {\n logger.debug('Logging module already shut down or not initialized');\n }\n\n logger.info('All telemetry modules shut down successfully');\n } catch (error) {\n logger.error('Error shutting down modules', { error });\n throw error;\n }\n }\n}\n\nexport const Brizz = new _Brizz();\n","import type { NodeSDK } from '@opentelemetry/sdk-node';\n\nimport type { IBrizzInitializeOptions } from '../index';\n\nimport { logger, DEFAULT_LOG_LEVEL, parseLogLevel, setLogLevel } from './logger';\nimport type { LogLevel } from './logger';\nimport type { IMaskingConfig } from './masking';\n\nexport interface IResolvedBrizzConfig extends Omit<IBrizzInitializeOptions, 'masking'> {\n appName: string;\n baseUrl: string;\n headers: Record<string, string>;\n disableBatch: boolean;\n apiKey?: string;\n logLevel: LogLevel;\n nodeSDK?: NodeSDK | null;\n masking?: IMaskingConfig;\n}\n\nexport function resolveConfig(options: IBrizzInitializeOptions): IResolvedBrizzConfig {\n // Resolve log level first so we can set it before other logging\n const envLogLevel = process.env['BRIZZ_LOG_LEVEL'] || options.logLevel?.toString() || DEFAULT_LOG_LEVEL.toString();\n let resolvedLogLevel: LogLevel;\n if (envLogLevel) {\n resolvedLogLevel = parseLogLevel(envLogLevel);\n } else if (typeof options.logLevel === 'string') {\n resolvedLogLevel = parseLogLevel(options.logLevel);\n } else {\n resolvedLogLevel = options.logLevel || DEFAULT_LOG_LEVEL;\n }\n\n setLogLevel(resolvedLogLevel);\n\n // Determine masking status for logging\n let maskingStatus: string;\n if (options.masking === true) {\n maskingStatus = 'enabled';\n } else if (options.masking === false) {\n maskingStatus = 'disabled';\n } else if (typeof options.masking === 'object') {\n maskingStatus = 'custom';\n } else {\n maskingStatus = 'default-disabled';\n }\n\n logger.debug('Starting configuration resolution', {\n appName: options.appName,\n baseUrl: options.baseUrl,\n hasApiKey: !!options.apiKey,\n disableBatch: options.disableBatch,\n logLevel: resolvedLogLevel,\n headersCount: Object.keys(options.headers || {}).length,\n masking: maskingStatus,\n });\n\n // Resolve masking configuration\n let resolvedMasking: IMaskingConfig | undefined;\n if (options.masking === true) {\n // Enable masking with all defaults\n resolvedMasking = {\n spanMasking: {},\n eventMasking: {},\n };\n } else if (options.masking && typeof options.masking === 'object') {\n // Use provided masking config\n resolvedMasking = options.masking;\n }\n // If options.masking is false or undefined, resolvedMasking remains undefined\n\n // Resolve all configuration with environment variables taking precedence\n const resolvedConfig: IResolvedBrizzConfig = {\n ...options,\n appName: process.env['BRIZZ_APP_NAME'] || options.appName || 'unknown-app',\n baseUrl: process.env['BRIZZ_BASE_URL'] || options.baseUrl || 'https://telemetry.brizz.dev',\n headers: { ...options.headers },\n apiKey: process.env['BRIZZ_API_KEY'] || options.apiKey,\n disableBatch: process.env['BRIZZ_DISABLE_BATCH'] === 'true' || !!options.disableBatch,\n logLevel: resolvedLogLevel,\n masking: resolvedMasking,\n };\n // Add Authorization header if API key is present\n if (resolvedConfig.apiKey) {\n resolvedConfig.headers['Authorization'] = `Bearer ${resolvedConfig.apiKey}`;\n }\n\n // Process additional environment variables\n if (process.env['BRIZZ_HEADERS']) {\n try {\n const envHeaders = JSON.parse(process.env['BRIZZ_HEADERS']) as Record<string, string>;\n Object.assign(resolvedConfig.headers, envHeaders);\n logger.debug('Added headers from environment variable', {\n headers: Object.keys(envHeaders),\n });\n } catch (error) {\n logger.error('Failed to parse BRIZZ_HEADERS environment variable', { error });\n throw new Error('Invalid JSON in BRIZZ_HEADERS environment variable');\n }\n }\n\n logger.debug('Configuration resolved with environment variables', {\n appName: resolvedConfig.appName,\n baseUrl: resolvedConfig.baseUrl,\n hasApiKey: !!resolvedConfig.apiKey,\n disableBatch: resolvedConfig.disableBatch,\n envOverrides: {\n hasEnvApiKey: !!process.env['BRIZZ_API_KEY'],\n hasEnvBaseUrl: !!process.env['BRIZZ_BASE_URL'],\n hasEnvBatch: !!process.env['BRIZZ_DISABLE_BATCH'],\n hasEnvHeaders: !!process.env['BRIZZ_HEADERS'],\n },\n });\n\n return resolvedConfig;\n}\n\n// Legacy function for backward compatibility\nexport function processEnvironmentConfig(options: IBrizzInitializeOptions): IResolvedBrizzConfig {\n return resolveConfig(options);\n}\n","import type { Instrumentation } from '@opentelemetry/instrumentation';\nimport { AnthropicInstrumentation } from '@traceloop/instrumentation-anthropic';\nimport { BedrockInstrumentation } from '@traceloop/instrumentation-bedrock';\nimport { ChromaDBInstrumentation } from '@traceloop/instrumentation-chromadb';\nimport { CohereInstrumentation } from '@traceloop/instrumentation-cohere';\nimport { LangChainInstrumentation } from '@traceloop/instrumentation-langchain';\nimport { LlamaIndexInstrumentation } from '@traceloop/instrumentation-llamaindex';\nimport { OpenAIInstrumentation } from '@traceloop/instrumentation-openai';\nimport { PineconeInstrumentation } from '@traceloop/instrumentation-pinecone';\nimport { QdrantInstrumentation } from '@traceloop/instrumentation-qdrant';\nimport { TogetherInstrumentation } from '@traceloop/instrumentation-together';\nimport { VertexAIInstrumentation } from '@traceloop/instrumentation-vertexai';\n\nimport { logger } from '../logger';\n\n/**\n * Module types for manual instrumentation (for Next.js/Webpack compatibility)\n */\nexport interface IInstrumentModules {\n openAI?: unknown;\n anthropic?: unknown;\n cohere?: unknown;\n google_vertexai?: unknown;\n google_aiplatform?: unknown;\n bedrock?: unknown;\n pinecone?: unknown;\n langchain?: {\n chains?: unknown;\n agents?: unknown;\n tools?: unknown;\n };\n llamaindex?: unknown;\n chromadb?: unknown;\n qdrant?: unknown;\n together?: unknown;\n vercelAI?: unknown;\n}\n\ninterface IInstrumentationConfig {\n class: new (config: { exceptionLogger: (error: Error) => void }) => Instrumentation;\n name: string;\n module?: unknown;\n}\n\nexport class InstrumentationRegistry {\n private static instance: InstrumentationRegistry;\n private manualModules: IInstrumentModules | null = null;\n\n public static getInstance(): InstrumentationRegistry {\n if (!InstrumentationRegistry.instance) {\n InstrumentationRegistry.instance = new InstrumentationRegistry();\n }\n return InstrumentationRegistry.instance;\n }\n\n /**\n * Set manual instrumentation modules for Next.js/Webpack environments\n */\n public setManualModules(modules: IInstrumentModules): void {\n this.manualModules = modules;\n logger.info('Manual instrumentation modules configured for Next.js/Webpack compatibility');\n }\n\n /**\n * Helper to load instrumentation with optional manual module\n */\n private loadInstrumentation<T extends Instrumentation>(\n InstrumentationClass: new (config: { exceptionLogger: (error: Error) => void }) => T,\n name: string,\n manualModule?: unknown,\n exceptionLogger?: (error: Error) => void,\n ): T | null {\n try {\n const inst = new InstrumentationClass({\n exceptionLogger:\n exceptionLogger ||\n ((error) => logger.error(`Exception in instrumentation: ${String(error)}`)),\n });\n if (manualModule) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (inst as any).manuallyInstrument(manualModule);\n logger.debug(`Manual instrumentation enabled for ${name}`);\n }\n return inst;\n } catch (error) {\n logger.error(`Failed to load ${name} instrumentation: ${String(error)}`);\n return null;\n }\n }\n\n /**\n * Get manual instrumentations only.\n * Auto-instrumentations are handled at import time.\n */\n public getManualInstrumentations(): Instrumentation[] {\n if (!this.manualModules || Object.keys(this.manualModules).length === 0) {\n logger.debug('No manual instrumentation modules configured');\n return [];\n }\n\n const instrumentations: Instrumentation[] = [];\n const exceptionLogger = (error: Error) => {\n logger.error(`Exception in manual instrumentation: ${String(error)}`);\n };\n\n this.loadManualInstrumentations(instrumentations, exceptionLogger);\n\n logger.info(`Loaded ${instrumentations.length} manual instrumentations`);\n return instrumentations;\n }\n\n /**\n * Load manual instrumentations only (with modules provided by user).\n * @private\n */\n private loadManualInstrumentations(\n instrumentations: Instrumentation[],\n exceptionLogger: (error: Error) => void,\n ): void {\n const instrumentationConfigs: IInstrumentationConfig[] = [\n { class: OpenAIInstrumentation, name: 'OpenAI', module: this.manualModules?.openAI },\n { class: AnthropicInstrumentation, name: 'Anthropic', module: this.manualModules?.anthropic },\n { class: CohereInstrumentation, name: 'Cohere', module: this.manualModules?.cohere },\n {\n class: VertexAIInstrumentation,\n name: 'Vertex AI',\n module: this.manualModules?.google_vertexai,\n },\n { class: BedrockInstrumentation, name: 'Bedrock', module: this.manualModules?.bedrock },\n { class: PineconeInstrumentation, name: 'Pinecone', module: this.manualModules?.pinecone },\n { class: LangChainInstrumentation, name: 'LangChain', module: this.manualModules?.langchain },\n {\n class: LlamaIndexInstrumentation,\n name: 'LlamaIndex',\n module: this.manualModules?.llamaindex,\n },\n { class: ChromaDBInstrumentation, name: 'ChromaDB', module: this.manualModules?.chromadb },\n { class: QdrantInstrumentation, name: 'Qdrant', module: this.manualModules?.qdrant },\n { class: TogetherInstrumentation, name: 'Together', module: this.manualModules?.together },\n ];\n\n // Only load instrumentations that have manual modules configured\n for (const config of instrumentationConfigs) {\n if (config.module) {\n const instrumentation = this.loadInstrumentation(\n config.class,\n config.name,\n config.module,\n exceptionLogger,\n );\n if (instrumentation) {\n instrumentations.push(instrumentation);\n }\n }\n }\n }\n}\n","import type { LogBody } from '@opentelemetry/api-logs';\nimport { SeverityNumber } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n LoggerProvider,\n type LogRecordExporter,\n type LogRecordProcessor,\n} from '@opentelemetry/sdk-logs';\n\nimport type { IResolvedBrizzConfig } from '../config';\nimport { logger } from '../logger';\n\nimport {\n BrizzBatchLogRecordProcessor,\n BrizzSimpleLogRecordProcessor,\n} from './processors/log-processor';\n\nexport class LoggingModule {\n private static instance: LoggingModule | null = null;\n private logExporter: LogRecordExporter | null = null;\n private logProcessor: LogRecordProcessor | null = null;\n private loggerProvider: LoggerProvider | null = null;\n\n static getInstance(): LoggingModule {\n if (!LoggingModule.instance) {\n throw new Error('Brizz must be initialized before accessing LoggingModule');\n }\n return LoggingModule.instance;\n }\n\n /**\n * Initialize the logging module with the provided configuration\n */\n setup(config: IResolvedBrizzConfig): void {\n logger.info('Setting up logging module');\n\n // Initialize exporter\n this.initLogExporter(config);\n\n // Initialize processor with masking support\n this.initLogProcessor(config);\n\n // Initialize logger provider\n this.initLoggerProvider(config);\n\n // Set as module instance for standalone functions\n LoggingModule.instance = this;\n\n logger.info('Logging module setup completed');\n }\n\n /**\n * Initialize the log exporter\n */\n private initLogExporter(config: IResolvedBrizzConfig): void {\n if (this.logExporter) {\n logger.debug('Log exporter already initialized, skipping re-initialization');\n return;\n }\n\n // Use custom log exporter if provided\n if (config.customLogExporter) {\n logger.debug('Using custom log exporter');\n this.logExporter = config.customLogExporter;\n logger.debug('Custom log exporter initialized successfully');\n return;\n }\n\n // Use default OTLP exporter\n const logsUrl = config.baseUrl.replace(/\\/$/, '') + '/v1/logs';\n logger.debug('Initializing default OTLP log exporter', { url: logsUrl });\n\n const headers = { ...config.headers };\n\n this.logExporter = new OTLPLogExporter({\n url: logsUrl,\n headers,\n });\n\n logger.debug('OTLP log exporter initialized successfully');\n }\n\n /**\n * Initialize the log processor with masking support\n */\n private initLogProcessor(config: IResolvedBrizzConfig): void {\n if (this.logProcessor) {\n logger.debug('Log processor already initialized, skipping re-initialization');\n return;\n }\n\n if (!this.logExporter) {\n throw new Error('Log exporter must be initialized before processor');\n }\n\n logger.debug('Initializing log processor', {\n disableBatch: config.disableBatch,\n hasMasking: !!config.masking?.eventMasking,\n });\n\n this.logProcessor = config.disableBatch\n ? new BrizzSimpleLogRecordProcessor(this.logExporter, config)\n : new BrizzBatchLogRecordProcessor(this.logExporter, config);\n\n logger.debug('Log processor initialized successfully');\n }\n\n /**\n * Initialize the logger provider\n */\n private initLoggerProvider(config: IResolvedBrizzConfig): void {\n if (this.loggerProvider) {\n logger.debug('Logger provider already initialized, skipping re-initialization');\n return;\n }\n\n if (!this.logProcessor) {\n throw new Error('Log processor must be initialized before logger provider');\n }\n\n logger.debug('Creating resource with service name', {\n serviceName: config.appName,\n });\n\n const resource = resourceFromAttributes({\n 'service.name': config.appName,\n });\n\n logger.debug('Creating logger provider with resource');\n this.loggerProvider = new LoggerProvider({\n resource,\n processors: [this.logProcessor],\n });\n\n logger.debug('Logger provider initialization completed');\n }\n\n /**\n * Emit a custom event to the telemetry pipeline\n */\n emitEvent(\n name: string,\n attributes?: Record<string, string | number | boolean>,\n body?: LogBody,\n severityNumber: SeverityNumber = SeverityNumber.INFO,\n ): void {\n logger.debug('Attempting to emit event', {\n name,\n hasAttributes: !!attributes,\n attributesCount: attributes ? Object.keys(attributes).length : 0,\n hasBody: !!body,\n severityNumber,\n });\n\n if (!this.loggerProvider) {\n logger.error('Cannot emit event: Logger provider not initialized');\n throw new Error('Logging module not initialized');\n }\n\n // Prepare log attributes with event name as required field\n const logAttributes: Record<string, string | number | boolean> = { 'event.name': name };\n if (attributes) {\n Object.assign(logAttributes, attributes);\n logger.debug('Combined log attributes', { attributes: Object.keys(logAttributes) });\n }\n\n // Get logger instance for event emission\n logger.debug('Getting logger instance for brizz_events');\n const eventLogger = this.loggerProvider.getLogger('brizz.events');\n\n // Emit the event\n logger.debug('Emitting log record with eventName', { eventName: name });\n try {\n eventLogger.emit({\n eventName: name,\n attributes: logAttributes,\n severityNumber: severityNumber,\n body: body,\n });\n logger.debug('Event successfully emitted', { eventName: name });\n } catch (error) {\n // Log detailed error information for debugging\n logger.error(`Failed to emit event '${name}'`, { error, eventName: name });\n logger.error('Log record that failed', {\n eventName: name,\n hasAttributes: logAttributes,\n severityNumber: severityNumber,\n hasBody: body,\n });\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n\n /**\n * Check if the module is initialized\n */\n isInitialized(): boolean {\n return this.loggerProvider !== null;\n }\n\n /**\n * Get the logger provider\n */\n getLoggerProvider(): LoggerProvider | null {\n return this.loggerProvider;\n }\n\n /**\n * Shutdown the logging module\n */\n async shutdown(): Promise<void> {\n logger.debug('Shutting down logging module');\n\n if (this.loggerProvider) {\n await this.loggerProvider.shutdown();\n this.loggerProvider = null;\n }\n\n this.logProcessor = null;\n this.logExporter = null;\n\n // Clear module instance\n if (LoggingModule.instance === this) {\n LoggingModule.instance = null;\n }\n\n logger.debug('Logging module shutdown completed');\n }\n}\n\n/**\n * Emit a custom event to the telemetry pipeline.\n * @throws {Error} - If SDK is not initialized\n */\nexport function emitEvent(\n name: string,\n attributes?: Record<string, string | number | boolean>,\n body?: LogBody,\n severityNumber: SeverityNumber = SeverityNumber.INFO,\n): void {\n return LoggingModule.getInstance().emitEvent(name, attributes, body, severityNumber);\n}\n","import { context } from '@opentelemetry/api';\nimport type { AnyValue, LogAttributes } from '@opentelemetry/api-logs';\nimport type { LogRecordExporter, SdkLogRecord } from '@opentelemetry/sdk-logs';\nimport { BatchLogRecordProcessor, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';\n\nimport type { IResolvedBrizzConfig } from '../../config';\nimport { logger } from '../../logger';\nimport { DEFAULT_PII_PATTERNS } from '../../masking/patterns';\nimport type { IAttributesMaskingRule, ILogMaskingConfig, MaskableValue } from '../../masking/types';\nimport { maskAttributes, maskValue } from '../../masking/utils';\nimport { BRIZZ, PROPERTIES_CONTEXT_KEY } from '../../semantic-conventions';\n\nexport const DEFAULT_LOG_MASKING_RULES: IAttributesMaskingRule[] = [\n {\n mode: 'partial',\n attributePattern: 'event.name',\n patterns: DEFAULT_PII_PATTERNS,\n },\n];\n\nexport class BrizzSimpleLogRecordProcessor extends SimpleLogRecordProcessor {\n public readonly config: IResolvedBrizzConfig;\n\n constructor(exporter: LogRecordExporter, config: IResolvedBrizzConfig) {\n super(exporter);\n this.config = config;\n }\n\n override onEmit(logRecord: SdkLogRecord): void {\n const maskingConfig = this.config.masking?.eventMasking;\n if (maskingConfig) {\n maskLog(logRecord, maskingConfig);\n }\n const associationProperties = context.active().getValue(PROPERTIES_CONTEXT_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n logRecord.setAttribute(`${BRIZZ}.${key}`, value as AnyValue);\n }\n }\n super.onEmit(logRecord);\n }\n}\n\nexport class BrizzBatchLogRecordProcessor extends BatchLogRecordProcessor {\n public readonly config: IResolvedBrizzConfig;\n\n constructor(exporter: LogRecordExporter, config: IResolvedBrizzConfig) {\n super(exporter);\n this.config = config;\n }\n\n override onEmit(logRecord: SdkLogRecord): void {\n const maskingConfig = this.config.masking?.eventMasking;\n if (maskingConfig) {\n maskLog(logRecord, maskingConfig);\n }\n const associationProperties = context.active().getValue(PROPERTIES_CONTEXT_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n logRecord.setAttribute(`${BRIZZ}.${key}`, value as AnyValue);\n }\n }\n super.onEmit(logRecord);\n }\n}\n\nexport function maskLog(logRecord: SdkLogRecord, config: ILogMaskingConfig): SdkLogRecord {\n if (!logRecord.attributes) {\n return logRecord;\n }\n\n let rules = config.rules || [];\n if (!config.disableDefaultRules) {\n rules = [...DEFAULT_LOG_MASKING_RULES, ...rules];\n }\n\n try {\n if (logRecord.attributes && Object.keys(logRecord.attributes).length > 0) {\n const attributesRecord: Record<string, MaskableValue> = {};\n\n for (const [key, value] of Object.entries(logRecord.attributes)) {\n attributesRecord[key] = value as MaskableValue;\n }\n\n const maskedAttributes = maskAttributes(attributesRecord, rules);\n if (maskedAttributes) {\n // Clear existing attributes and set masked ones\n const newAttributes: LogAttributes = {};\n for (const [key, value] of Object.entries(maskedAttributes)) {\n newAttributes[key] = value as AnyValue;\n }\n logRecord.setAttributes(newAttributes);\n }\n }\n\n if (config.maskBody && logRecord.body !== undefined && logRecord.body !== null) {\n let maskedBody: unknown = logRecord.body;\n for (const rule of rules) {\n maskedBody = maskValue(maskedBody, rule);\n }\n logRecord.setBody(maskedBody as AnyValue);\n }\n\n return logRecord;\n } catch (error) {\n logger.error('Error masking log record:', error);\n return logRecord;\n }\n}\n","/**\n * Default PII patterns for data masking.\n *\n * This module contains 100+ built-in patterns for detecting and masking\n * common types of personally identifiable information (PII) and sensitive data.\n * Patterns are organized by category and mirror the Python SDK implementation.\n */\n\nimport type { IPatternEntry } from './types';\n\n/**\n * All built-in PII patterns combined - mirrors Python SDK patterns.py\n */\nexport const DEFAULT_PII_PATTERNS: IPatternEntry[] = [\n // Email addresses\n {\n name: 'email_addresses',\n pattern: String.raw`\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b`,\n },\n // Phone numbers (US format)\n {\n name: 'us_phone_numbers',\n pattern: String.raw`(?:^|[\\s])(?:\\+?1[-.\\s]*)?(?:\\([0-9]{3}\\)\\s?[0-9]{3}[-.\\s]?[0-9]{4}|[0-9]{3}[-.\\s]?[0-9]{3}[-.\\s]?[0-9]{4}|[0-9]{10})(?=[\\s]|$)`,\n },\n // Social Security Numbers\n {\n name: 'ssn',\n pattern: String.raw`\\b(?!000|666|9\\d{2})\\d{3}[-\\s]?(?!00)\\d{2}[-\\s]?(?!0000)\\d{4}\\b`,\n },\n // Credit card numbers\n {\n name: 'credit_cards',\n pattern: String.raw`\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\\\\d{3})\\\\d{11})\\b`,\n },\n {\n name: 'credit_cards_with_separators',\n pattern: String.raw`\\b(?:4\\\\d{3}|5[1-5]\\\\d{2}|3[47]\\\\d{2})[-\\s]?\\\\d{4}[-\\s]?\\\\d{4}[-\\s]?\\\\d{4}\\b`,\n },\n // IP addresses (IPv4)\n {\n name: 'ipv4_addresses',\n pattern: String.raw`\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?!\\.[0-9])\\b`,\n },\n // API keys/tokens\n {\n name: 'generic_api_keys',\n pattern: String.raw`\\b(?:[Aa][Pp][Ii][_-]?[Kk][Ee][Yy]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt])[_-]?[=:]?\\s*[\"']?(?:[a-zA-Z0-9\\-_.]{20,})[\"']?\\b`,\n },\n {\n name: 'openai_keys',\n pattern: String.raw`\\bsk[-_][a-zA-Z0-9]{20,}\\b`,\n },\n {\n name: 'base64_secrets',\n pattern: String.raw`\\b[A-Za-z0-9+/]{64,}={0,2}\\b`,\n },\n // AWS Keys\n {\n name: 'aws_access_keys',\n pattern: String.raw`\\b(?:AKIA|ABIA|ACCA|ASIA)[0-9A-Z]{16}\\b`,\n },\n {\n name: 'aws_secret_keys',\n pattern: String.raw`\\b[A-Za-z0-9/+=]*[A-Z][A-Za-z0-9/+=]*[a-z][A-Za-z0-9/+=]*[/+=][A-Za-z0-9/+=]{30,}\\b`,\n },\n // GitHub tokens\n {\n name: 'github_tokens',\n pattern: String.raw`\\bghp_[a-zA-Z0-9]{36}\\b`,\n },\n // Slack tokens\n {\n name: 'slack_tokens',\n pattern: String.raw`\\bxox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24,34}\\b`,\n },\n // Stripe keys\n {\n name: 'stripe_keys',\n pattern: String.raw`\\b(?:sk|pk)_(?:test|live)_[a-zA-Z0-9]{24,}\\b`,\n },\n // JWT tokens\n {\n name: 'jwt_tokens',\n pattern: String.raw`\\beyJ[A-Za-z0-9_-]{2,}\\\\.[A-Za-z0-9_-]{2,}\\\\.[A-Za-z0-9_-]{2,}\\b`,\n },\n // MAC addresses\n {\n name: 'mac_addresses',\n pattern: String.raw`\\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\\b`,\n },\n // IPv6 addresses\n {\n name: 'ipv6_addresses',\n pattern: String.raw`\\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\b`,\n },\n // Medical records\n {\n name: 'medical_record_numbers',\n pattern: String.raw`\\b(?:[Mm][Rr][Nn])[-\\s]?\\d{6,10}\\b`,\n },\n // Bitcoin addresses\n {\n name: 'bitcoin_addresses',\n pattern: String.raw`\\b[13][a-km-zA-HJ-NP-Z1-9]{25,34}\\b`,\n },\n // Ethereum addresses\n {\n name: 'ethereum_addresses',\n pattern: String.raw`\\b0x[a-fA-F0-9]{40}(?![a-fA-F0-9])\\b`,\n },\n // UUIDs\n {\n name: 'uuids',\n pattern: String.raw`\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(?![0-9a-fA-F-])\\b`,\n },\n // Database connection strings\n {\n name: 'database_connections',\n pattern: String.raw`\\b(?:[Mm][Oo][Nn][Gg][Oo][Dd][Bb]|[Pp][Oo][Ss][Tt][Gg][Rr][Ee][Ss]|[Mm][Yy][Ss][Qq][Ll]|[Rr][Ee][Dd][Ii][Ss]|[Mm][Ss][Ss][Qq][Ll]|[Oo][Rr][Aa][Cc][Ll][Ee]):\\\\/\\\\/[^\\\\s]+\\b`,\n },\n // Private keys\n {\n name: 'rsa_private_keys',\n pattern: '-----BEGIN (?:RSA )?PRIVATE KEY-----',\n },\n {\n name: 'pgp_private_keys',\n pattern: '-----BEGIN PGP PRIVATE KEY BLOCK-----',\n },\n {\n name: 'certificates',\n pattern: '-----BEGIN CERTIFICATE-----',\n },\n // Date of birth patterns\n {\n name: 'date_of_birth_us',\n pattern: String.raw`\\b(?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12]\\\\d|3[01])[-/](?:19|20)\\\\d{2}\\b`,\n },\n {\n name: 'date_of_birth_iso',\n pattern: String.raw`\\b(?:19|20)\\\\d{2}[-/](?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12]\\\\d|3[01])\\b`,\n },\n // US Identification Numbers\n {\n name: 'us_passport_numbers',\n pattern: String.raw`\\b[A-Z]?\\\\d{6,9}\\b`,\n },\n {\n name: 'drivers_license',\n pattern: String.raw`\\b[A-Z]{1,2}\\\\d{3,8}[-\\s]?\\\\d{2,5}[-\\s]?\\\\d{2,5}[-\\s]?\\\\d{1,5}[-\\s]?\\\\d?\\b`,\n },\n {\n name: 'bank_account_numbers',\n pattern: String.raw`\\b\\\\d{10,17}\\b`,\n },\n {\n name: 'aba_routing_numbers',\n pattern: String.raw`\\b((0[0-9])|(1[0-2])|(2[1-9])|(3[0-2])|(6[1-9])|(7[0-2])|80)([0-9]{7})\\b`,\n },\n {\n name: 'health_insurance_numbers',\n pattern: String.raw`\\b\\\\d{10}[A-Z]\\b`,\n },\n {\n name: 'employee_ids',\n pattern: String.raw`\\b(?:[Ee][Mm][Pp]|[Ee][Mm][Pp][Ll][Oo][Yy][Ee][Ee]|[Ee])[-\\s]?\\\\d{5,8}\\b`,\n },\n {\n name: 'tax_ein',\n pattern: String.raw`\\b\\\\d{2}-\\\\d{7}\\b`,\n },\n {\n name: 'medicare_beneficiary_id',\n pattern: String.raw`\\b[1-9][A-Z][A-Z0-9]\\\\d-[A-Z][A-Z0-9]\\\\d-[A-Z][A-Z0-9]\\\\d{2}\\b`,\n },\n {\n name: 'national_provider_id',\n pattern: String.raw`\\b1\\\\d{9}\\b`,\n },\n {\n name: 'dea_numbers',\n pattern: String.raw`\\b[A-Z]{2}\\\\d{7}\\b`,\n },\n {\n name: 'itin',\n pattern: String.raw`\\b9\\\\d{2}(?:[ \\\\-]?)[7,8]\\\\d(?:[ \\\\-]?)\\\\d{4}\\b`,\n },\n // Vehicle and Location\n {\n name: 'vin_numbers',\n pattern: String.raw`\\b[A-HJ-NPR-Z0-9]{17}\\b`,\n },\n {\n name: 'coordinates',\n pattern: String.raw`\\b[-+]?(?:[0-8]?\\\\d(?:\\\\.\\\\d+)?|90(?:\\\\.0+)?),\\\\s*[-+]?(?:1[0-7]\\\\d(?:\\\\.\\\\d+)?|180(?:\\\\.0+)?|[0-9]?\\\\d(?:\\\\.\\\\d+)?)\\b`,\n },\n {\n name: 'us_license_plates',\n pattern: String.raw`\\b[A-Z]{1,3}[-\\s]\\\\d{1,4}[A-Z]?\\b|\\b\\\\d{1,2}[A-Z]{1,3}\\\\d{1,4}\\b`,\n },\n {\n name: 'us_zip_codes',\n pattern: String.raw`\\b(\\\\d{5}-\\\\d{4}|\\\\d{5})\\b`,\n },\n {\n name: 'us_street_addresses',\n pattern: String.raw`\\b\\\\d{1,8}\\b[\\\\s\\\\S]{10,100}?\\b(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)\\b\\\\s\\\\d{5}\\b`,\n },\n // International Banking\n {\n name: 'iban',\n pattern: String.raw`\\b[A-Z]{2}\\d{2}[A-Z0-9]{4}\\d{7}([A-Z0-9]?){0,16}\\b`,\n },\n {\n name: 'swift_bic',\n pattern: String.raw`\\b[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?\\b`,\n },\n // Additional API Keys and Tokens\n {\n name: 'google_oauth',\n pattern: String.raw`\\bya29\\\\.[a-zA-Z0-9_-]{60,}\\b`,\n },\n {\n name: 'firebase_tokens',\n pattern: String.raw`\\bAAAA[A-Za-z0-9_-]{100,}\\b`,\n },\n {\n name: 'google_app_ids',\n pattern: String.raw`\\b[0-9]+-\\w+\\.apps\\.googleusercontent\\.com\\b`,\n },\n {\n name: 'facebook_secrets',\n pattern: String.raw`\\b(facebook_secret|FACEBOOK_SECRET|facebook_app_secret|FACEBOOK_APP_SECRET)[a-z_ =\\\\s\"'\\\\:]{0,5}[^a-zA-Z0-9][a-f0-9]{32}[^a-zA-Z0-9]`,\n },\n {\n name: 'github_keys',\n pattern: String.raw`\\b(GITHUB_SECRET|GITHUB_KEY|github_secret|github_key|github_token|GITHUB_TOKEN|github_api_key|GITHUB_API_KEY)[a-z_ =\\\\s\\\"'\\\\:]{0,10}[^a-zA-Z0-9][a-zA-Z0-9]{40}[^a-zA-Z0-9]`,\n },\n {\n name: 'heroku_keys',\n pattern: String.raw`\\b(heroku_api_key|HEROKU_API_KEY|heroku_secret|HEROKU_SECRET)[a-z_ =\\\\s\\\"'\\\\:]{0,10}[^a-zA-Z0-9-]\\\\w{8}(?:-\\\\w{4}){3}-\\\\w{12}[^a-zA-Z0-9\\\\-]`,\n },\n {\n name: 'slack_api_keys',\n pattern: String.raw`\\b(slack_api_key|SLACK_API_KEY|slack_key|SLACK_KEY)[a-z_ =\\\\s\\\"'\\\\:]{0,10}[^a-f0-9][a-f0-9]{32}[^a-f0-9]`,\n },\n {\n name: 'slack_api_tokens',\n pattern: String.raw`\\b(xox[pb](?:-[a-zA-Z0-9]+){4,})\\b`,\n },\n // Extended Private Keys and Certificates\n {\n name: 'dsa_private_keys',\n pattern: String.raw`-----BEGIN DSA PRIVATE KEY-----(?:[a-zA-Z0-9\\+\\=\\/\"']|\\s)+?-----END DSA PRIVATE KEY-----`,\n },\n {\n name: 'ec_private_keys',\n pattern: String.raw`-----BEGIN (?:EC|ECDSA) PRIVATE KEY-----(?:[a-zA-Z0-9\\+\\=\\/\"']|\\s)+?-----END (?:EC|ECDSA) PRIVATE KEY-----`,\n },\n {\n name: 'encrypted_private_keys',\n pattern: String.raw`-----BEGIN ENCRYPTED PRIVATE KEY-----(?:.|\\s)+?-----END ENCRYPTED PRIVATE KEY-----`,\n },\n {\n name: 'ssl_certificates',\n pattern: String.raw`-----BEGIN CERTIFICATE-----(?:.|\\n)+?\\s-----END CERTIFICATE-----`,\n },\n {\n name: 'ssh_dss_public',\n pattern: String.raw`\\bssh-dss [0-9A-Za-z+/]+[=]{2}\\b`,\n },\n {\n name: 'ssh_rsa_public',\n pattern: String.raw`\\bssh-rsa AAAA[0-9A-Za-z+/]+[=]{0,3} [^@]+@[^@]+\\b`,\n },\n {\n name: 'putty_ssh_keys',\n pattern: String.raw`PuTTY-User-Key-File-2: ssh-(?:rsa|dss)\\s*Encryption: none(?:.|\\s?)*?Private-MAC:`,\n },\n // International Phone Numbers\n {\n name: 'france_phone_numbers',\n pattern: String.raw`\\b([0O]?[1lI][1lI])?[3E][3E][0O]?[\\\\dOIlZEASB]{9}\\b`,\n },\n {\n name: 'german_phone_numbers',\n pattern: String.raw`\\b[\\d\\w]\\d{2}[\\d\\w]{6}\\d[\\d\\w]\\b`,\n },\n {\n name: 'uk_phone_numbers',\n pattern: String.raw`\\b([0O]?[1lI][1lI])?[4A][4A][\\\\dOIlZEASB]{10,11}\\b`,\n },\n // International IDs\n {\n name: 'uk_drivers_license',\n pattern: String.raw`\\b[A-Z]{5}\\d{6}[A-Z]{2}\\d{1}[A-Z]{2}\\b`,\n },\n {\n name: 'uk_passport',\n pattern: String.raw`\\b\\\\d{10}GB[RP]\\\\d{7}[UMF]{1}\\\\d{9}\\b`,\n },\n {\n name: 'argentina_dni',\n pattern: String.raw`\\b\\\\d{2}\\\\.\\\\d{3}\\\\.\\\\d{3}\\b`,\n },\n {\n name: 'australia_tfn',\n pattern: String.raw`\\b[Tt][Ff][Nn](:|:\\\\s|\\\\s|)(\\\\d{8,9})\\b`,\n },\n {\n name: 'canada_passport',\n pattern: String.raw`\\b[\\\\w]{2}[\\\\d]{6}\\b`,\n },\n {\n name: 'croatia_vat',\n pattern: String.raw`\\bHR\\\\d{11}\\b`,\n },\n {\n name: 'czech_vat',\n pattern: String.raw`\\bCZ\\\\d{8,10}\\b`,\n },\n {\n name: 'denmark_personal_id',\n pattern: String.raw`\\b(?:\\\\d{10}|\\\\d{6}[-\\\\s]\\\\d{4})\\b`,\n },\n {\n name: 'france_national_id',\n pattern: String.raw`\\b\\\\d{12}\\b`,\n },\n {\n name: 'france_ssn',\n pattern: String.raw`\\b(?:\\\\d{13}|\\\\d{13}\\\\s\\\\d{2})\\b`,\n },\n {\n name: 'france_passport',\n pattern: String.raw`\\b\\\\d{2}11\\\\d{5}\\b`,\n },\n {\n name: 'california_drivers_license',\n pattern: String.raw`\\b[A-Z]{1}\\\\d{7}\\b`,\n },\n // Medical and Healthcare\n {\n name: 'hipaa_ndc',\n pattern: String.raw`\\b\\\\d{4,5}-\\\\d{3,4}-\\\\d{1,2}\\b`,\n },\n // Security and Network\n {\n name: 'cve_numbers',\n pattern: String.raw`\\b[Cc][Vv][Ee]-\\\\d{4}-\\\\d{4,7}\\b`,\n },\n {\n name: 'microsoft_oauth',\n pattern: String.raw`https://login\\.microsoftonline\\.com/common/oauth2/v2\\.0/token|https://login\\.windows\\.net/common/oauth2/token`,\n },\n {\n name: 'postgres_connections',\n pattern: String.raw`\\b(?:[Pp][Oo][Ss][Tt][Gg][Rr][Ee][Ss]|[Pp][Gg][Ss][Qq][Ll])\\\\:\\\\/\\\\/`,\n },\n {\n name: 'box_links',\n pattern: String.raw`https://app\\.box\\.com/[s|l]/\\S+`,\n },\n {\n name: 'dropbox_links',\n pattern: String.raw`https://www\\.dropbox\\.com/(?:s|l)/\\S+`,\n },\n // Credit Card Variants\n {\n name: 'amex_cards',\n pattern: String.raw`\\b3[47][0-9]{13}\\b`,\n },\n {\n name: 'visa_cards',\n pattern: String.raw`\\b4[0-9]{12}(?:[0-9]{3})?\\b`,\n },\n {\n name: 'discover_cards',\n pattern: String.raw`\\b65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}\\b`,\n },\n {\n name: 'enhanced_credit_cards',\n pattern: String.raw`\\b((4\\\\d{3}|5[1-5]\\\\d{2}|2\\\\d{3}|3[47]\\\\d{1,2})[\\\\s\\\\-]?\\\\d{4,6}[\\\\s\\\\-]?\\\\d{4,6}?([\\\\s\\\\-]\\\\d{3,4})?(\\\\d{3})?)\\b`,\n },\n // Bank Routing Numbers (US specific)\n {\n name: 'bbva_routing_ca',\n pattern: String.raw`\\\\b321170538\\\\b`,\n },\n {\n name: 'boa_routing_ca',\n pattern: String.raw`\\\\b(?:121|026)00(?:0|9)(?:358|593)\\\\b`,\n },\n {\n name: 'chase_routing_ca',\n pattern: String.raw`\\\\b322271627\\\\b`,\n },\n {\n name: 'citibank_routing_ca',\n pattern: String.raw`\\\\b32(?:11|22)71(?:18|72)4\\\\b`,\n },\n {\n name: 'usbank_routing_ca',\n pattern: String.raw`\\\\b12(?:1122676|2235821)\\\\b`,\n },\n {\n name: 'united_bank_routing_ca',\n pattern: String.raw`\\\\b122243350\\\\b`,\n },\n {\n name: 'wells_fargo_routing_ca',\n pattern: String.raw`\\\\b121042882\\\\b`,\n },\n // Unrealistic alphanumeric identifiers\n {\n name: 'generic_non_usual',\n pattern: String.raw`(?:^|\\s)(?=[A-Za-z0-9_\\)\\*\\=@]*[A-Za-z])(?=[A-Za-z0-9_\\)\\*\\=@]*[0-9])([A-Za-z0-9_\\)\\*\\=@]{5,})(?=\\s|$)`,\n },\n];\n","/**\n * Masking utilities for pattern compilation and value masking.\n *\n * This module provides the core functionality for detecting and masking PII\n * in various data types. It implements the same logic as the Python SDK\n * with optimized regex compilation and efficient masking operations.\n */\n\nimport { logger } from '../logger';\n\nimport type {\n IAttributesMaskingRule,\n IEventMaskingRule,\n IPatternBasedMaskingRule,\n IPatternEntry,\n} from './types';\n\nfunction isValidPatternName(name: string): boolean {\n return /^[a-zA-Z0-9_]+$/.test(name);\n}\n\n/**\n * Detects potentially dangerous ReDoS patterns\n */\nfunction isLikelyReDoSPattern(pattern: string): boolean {\n const dangerousPatterns = [\n // Nested quantifiers like (a+)+, (a*)+, (a+)*\n /\\([^)]*[+*]\\)[+*]/,\n // Alternation with overlapping groups like (a|a)*\n /\\([^)]*\\|[^)]*\\)[+*]/,\n // Complex backtracking patterns - but more specific\n /\\([^)]*[+*][^)]*[+*][^)]*\\)[+*]/,\n ];\n\n return dangerousPatterns.some((dangerous) => dangerous.test(pattern));\n}\n\nfunction getGroupedPattern(patternEntry: IPatternEntry): string {\n let name = patternEntry.name;\n if (!name || name === '') {\n name = `pattern_${Math.random().toString(16).slice(2)}`;\n }\n if (!isValidPatternName(name)) {\n throw new Error(\n `Pattern name '${name}' must only contain alphanumeric characters and underscores`,\n );\n }\n\n // Check for potentially dangerous ReDoS patterns\n if (isLikelyReDoSPattern(patternEntry.pattern)) {\n throw new Error(`Potentially dangerous ReDoS pattern detected: '${patternEntry.pattern}'`);\n }\n\n // Validate the pattern by attempting to create a RegExp\n try {\n new RegExp(patternEntry.pattern);\n } catch (error) {\n throw new Error(`Invalid regex pattern '${patternEntry.pattern}': ${String(error)}`);\n }\n\n return `(?<${name}>${patternEntry.pattern})`;\n}\n\nfunction isIPatternEntry(obj: unknown): obj is IPatternEntry {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n typeof (obj as IPatternEntry).pattern === 'string' &&\n ((obj as IPatternEntry).name === undefined || typeof (obj as IPatternEntry).name === 'string')\n );\n}\n\nfunction isIEventMaskingRule(obj: unknown): obj is IEventMaskingRule {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n typeof (obj as IEventMaskingRule).mode === 'string' &&\n Array.isArray((obj as IEventMaskingRule).patterns) &&\n (obj as IEventMaskingRule).patterns.every(\n (p: unknown) => isIPatternEntry(p) || typeof p === 'string',\n ) &&\n ((obj as IEventMaskingRule).attributePattern === undefined ||\n typeof (obj as IEventMaskingRule).attributePattern === 'string')\n );\n}\n\nfunction convertPatternsToPatternEntries(\n patterns: readonly (IPatternEntry | string)[],\n): IPatternEntry[] {\n const patternEntries: IPatternEntry[] = [];\n for (const pattern of patterns) {\n if (typeof pattern === 'string') {\n // Convert string to PatternEntry with empty name\n patternEntries.push({ pattern, name: '' });\n } else if (isIPatternEntry(pattern)) {\n // Already a PatternEntry, use as is\n patternEntries.push(pattern);\n } else {\n throw new Error('Patterns must be either strings or PatternEntry instances');\n }\n }\n return patternEntries;\n}\n\n/**\n * Compile a list of pattern entries into a single regex pattern.\n * Matches Python's _compile_pattern_entries function.\n */\nfunction compilePatternEntries(patternEntries: readonly IPatternEntry[]): RegExp | null {\n const patternGroups: string[] = [];\n for (const patternEntry of patternEntries) {\n try {\n patternGroups.push(getGroupedPattern(patternEntry));\n } catch (error) {\n logger.warn(`Invalid pattern '${patternEntry.name}': ${patternEntry.pattern}`, error);\n continue; // Skip invalid patterns\n }\n }\n\n if (patternGroups.length === 0) {\n return null; // No valid patterns\n }\n\n try {\n return new RegExp(patternGroups.join('|'));\n } catch (error) {\n logger.warn('Failed to compile pattern entries into regex', error);\n return null;\n }\n}\n\nfunction getCompiledAttributeNamePattern(rule: IAttributesMaskingRule): RegExp {\n if (!rule.attributePattern) {\n logger.debug('No attribute pattern provided, using default .*');\n return /.*/; // Default to match all attributes\n }\n let compiledPatternString = rule.attributePattern;\n if (isIEventMaskingRule(rule) && rule.eventNamePattern) {\n // If this is an event masking rule, append the event name pattern if it exists\n compiledPatternString = `(${compiledPatternString})|(${rule.eventNamePattern})`;\n }\n return new RegExp(compiledPatternString);\n}\n\n/**\n * Check if regex execution should continue based on timeout and iteration limits\n */\nfunction shouldContinueExecution(\n startTime: number,\n iterations: number,\n timeoutMs: number,\n): boolean {\n if (Date.now() - startTime > timeoutMs) {\n logger.warn('Regex execution timed out - potential ReDoS pattern detected');\n return false;\n }\n\n const maxIterations = 1000;\n if (iterations > maxIterations) {\n logger.warn('Regex execution exceeded maximum iterations - potential ReDoS pattern detected');\n return false;\n }\n\n return true;\n}\n\n/**\n * Create a global version of the regex pattern\n */\nfunction createGlobalPattern(pattern: RegExp): RegExp {\n return new RegExp(\n pattern.source,\n pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g',\n );\n}\n\n/**\n * Executes regex with timeout protection to prevent ReDoS attacks\n */\nfunction executeRegexWithTimeout(\n pattern: RegExp,\n value: string,\n timeoutMs: number = 100,\n): RegExpExecArray[] {\n const matches: RegExpExecArray[] = [];\n const globalPattern = createGlobalPattern(pattern);\n const startTime = Date.now();\n let match: RegExpExecArray | null;\n let iterations = 0;\n\n while ((match = globalPattern.exec(value)) !== null) {\n if (!shouldContinueExecution(startTime, ++iterations, timeoutMs)) {\n break;\n }\n\n matches.push(match);\n\n if (match[0].length === 0) {\n globalPattern.lastIndex = match.index + 1;\n }\n }\n\n return matches;\n}\n\n/**\n * Masks a string value based on the pattern, matching Python implementation.\n */\nexport function maskStringByPattern(\n value: string,\n pattern: RegExp,\n mode: 'partial' | 'full' = 'full',\n): string {\n // Use timeout-protected regex execution to prevent ReDoS\n const matches: Array<{\n start: number;\n end: number;\n text: string;\n groups: RegExpExecArray['groups'];\n }> = [];\n\n try {\n const regexMatches = executeRegexWithTimeout(pattern, value);\n\n for (const match of regexMatches) {\n matches.push({\n start: match.index,\n end: match.index + match[0].length,\n text: match[0],\n groups: match.groups,\n });\n }\n } catch (error) {\n logger.warn('Regex execution failed, skipping masking', error);\n return value;\n }\n\n // Process matches in reverse order to maintain correct indices\n for (const matchInfo of matches.reverse()) {\n let patternName = 'unknown';\n if (matchInfo.groups) {\n // Find the first defined group name\n for (const [groupName, groupValue] of Object.entries(matchInfo.groups)) {\n if (groupValue !== undefined) {\n // Remove any counter suffix for logging (matches Python's logic)\n if (groupName.includes('_') && /\\d$/.test(groupName)) {\n const parts = groupName.split('_');\n patternName = parts[0] || groupName;\n } else {\n patternName = groupName;\n }\n break;\n }\n }\n }\n\n logger.info(`Masking detected: pattern '${patternName}' found match in value`);\n\n // Apply masking based on mode\n const masked = mode === 'partial' ? matchInfo.text[0] + '*****' : '*****';\n\n // Replace the matched portion\n value = value.slice(0, matchInfo.start) + masked + value.slice(matchInfo.end);\n }\n\n return value;\n}\n\n/**\n * Masks a string value based on the rule, matching Python implementation.\n */\nexport function maskStringByPatternBasedRule(\n value: string,\n rule: IPatternBasedMaskingRule,\n): string {\n const patternEntries = convertPatternsToPatternEntries(rule.patterns);\n if (patternEntries.length === 0) {\n logger.warn('No patterns provided for masking rule, returning original value');\n return value; // No patterns means no masking\n }\n const mode = rule.mode;\n if (!patternEntries || patternEntries.length === 0) {\n // No patterns means mask entire value\n return mode === 'partial' && value ? value[0] + '*****' : '*****';\n }\n\n // Create the mega pattern\n const compiledPatterns = compilePatternEntries(patternEntries);\n if (!compiledPatterns) {\n return value;\n }\n\n return maskStringByPattern(value, compiledPatterns, mode);\n}\n\n/**\n * Masks a value based on the rule, matching Python implementation.\n */\nexport function maskValue(value: unknown, rule: IPatternBasedMaskingRule): unknown {\n if (typeof value === 'string') {\n return maskStringByPatternBasedRule(value, rule);\n } else if (typeof value === 'boolean' || typeof value === 'number') {\n return maskStringByPatternBasedRule(String(value), rule);\n } else if (Array.isArray(value)) {\n return value.map((v) => maskStringByPatternBasedRule(String(v), rule));\n } else if (value !== null && typeof value === 'object') {\n // If the value is a dictionary, mask each value recursively\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n result[k] = maskValue(v, rule);\n }\n return result;\n } else {\n throw new Error(`Unsupported value type for masking: ${typeof value}`);\n }\n}\n\n/**\n * Masks sensitive data in attributes based on masking rules, matching Python implementation.\n */\nexport function maskAttributes(\n attributes: Record<string, unknown>,\n rules: readonly IAttributesMaskingRule[],\n outputOriginalValue = false,\n): Record<string, unknown> {\n if (!attributes || Object.keys(attributes).length === 0) {\n return {};\n }\n\n // Create a copy to avoid modifying the original\n const maskedAttributes = { ...attributes };\n\n for (const rule of rules) {\n const compiledAttributeNamePattern = getCompiledAttributeNamePattern(rule);\n const attributesToMask: string[] = compiledAttributeNamePattern\n ? Object.keys(maskedAttributes).filter((attr) => compiledAttributeNamePattern.test(attr))\n : Object.keys(maskedAttributes);\n\n for (const attribute of attributesToMask) {\n const value = maskedAttributes[attribute];\n if (value === null || value === undefined) {\n continue;\n }\n\n if (outputOriginalValue) {\n logger.debug(`Masking attribute '${attribute}' with original value`, { value });\n }\n\n maskedAttributes[attribute] = maskValue(value, rule);\n }\n }\n\n return maskedAttributes;\n}\n","import { createContextKey } from '@opentelemetry/api';\n\nexport const BRIZZ = 'brizz';\nexport const PROPERTIES = 'properties';\nexport const SESSION_ID = 'session.id';\nexport const PROPERTIES_CONTEXT_KEY = createContextKey(PROPERTIES);\n","import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { PeriodicExportingMetricReader, type MetricReader } from '@opentelemetry/sdk-metrics';\n\nimport type { IResolvedBrizzConfig } from '../config';\nimport { logger } from '../logger';\n\nexport class MetricsModule {\n private static instance: MetricsModule | null = null;\n private metricsExporter: OTLPMetricExporter | null = null;\n private metricsReader: MetricReader | null = null;\n\n static getInstance(): MetricsModule {\n if (!MetricsModule.instance) {\n throw new Error('Brizz must be initialized before accessing MetricsModule');\n }\n return MetricsModule.instance;\n }\n\n /**\n * Initialize the metrics module with the provided configuration\n */\n setup(config: IResolvedBrizzConfig): void {\n logger.info('Setting up metrics module');\n\n // Initialize reader (custom or default with exporter)\n this.initMetricsReader(config);\n\n // Set as module instance for standalone functions\n MetricsModule.instance = this;\n\n logger.info('Metrics module setup completed');\n }\n\n /**\n * Initialize the metrics exporter\n */\n private initMetricsExporter(config: IResolvedBrizzConfig): void {\n if (this.metricsExporter) {\n logger.debug('Metrics exporter already initialized, skipping re-initialization');\n return;\n }\n\n const metricsUrl = config.baseUrl.replace(/\\/$/, '') + '/v1/metrics';\n logger.debug('Initializing metrics exporter', { url: metricsUrl });\n\n this.metricsExporter = new OTLPMetricExporter({\n url: metricsUrl,\n headers: config.headers,\n });\n\n logger.debug('Metrics exporter initialized successfully');\n }\n\n /**\n * Initialize the metrics reader\n */\n private initMetricsReader(config: IResolvedBrizzConfig): void {\n if (this.metricsReader) {\n logger.debug('Metrics reader already initialized, skipping re-initialization');\n return;\n }\n\n // Use custom metric reader if provided\n if (config.customMetricReader) {\n logger.debug('Using custom metric reader');\n this.metricsReader = config.customMetricReader;\n logger.debug('Custom metric reader initialized successfully');\n return;\n }\n\n // Use default flow: create OTLP exporter and wrap it in PeriodicExportingMetricReader\n logger.debug(\n 'Using default metrics flow - creating OTLP exporter and PeriodicExportingMetricReader',\n );\n this.initMetricsExporter(config);\n\n if (!this.metricsExporter) {\n throw new Error('Failed to initialize metrics exporter');\n }\n\n this.metricsReader = new PeriodicExportingMetricReader({\n exporter: this.metricsExporter,\n });\n\n logger.debug('Default metrics reader initialized successfully');\n }\n\n /**\n * Get the metrics exporter\n */\n getMetricsExporter(): OTLPMetricExporter {\n if (!this.metricsExporter) {\n throw new Error('Metrics module not initialized');\n }\n return this.metricsExporter;\n }\n\n /**\n * Get the metrics reader\n */\n getMetricsReader(): MetricReader {\n if (!this.metricsReader) {\n throw new Error('Metrics module not initialized');\n }\n return this.metricsReader;\n }\n\n /**\n * Shutdown the metrics module\n */\n shutdown(): void {\n logger.debug('Shutting down metrics module');\n\n this.metricsReader = null;\n this.metricsExporter = null;\n\n // Clear module instance\n if (MetricsModule.instance === this) {\n MetricsModule.instance = null;\n }\n\n logger.debug('Metrics module shutdown completed');\n }\n}\n\n/**\n * Get the OpenTelemetry Metrics Exporter configured for Brizz.\n * @throws {Error} - If SDK is not initialized\n */\nexport function getMetricsExporter(): OTLPMetricExporter {\n return MetricsModule.getInstance().getMetricsExporter();\n}\n\n/**\n * Get the Metrics Reader configured for Brizz.\n * @throws {Error} - If SDK is not initialized\n */\nexport function getMetricsReader(): MetricReader {\n return MetricsModule.getInstance().getMetricsReader();\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace-node';\n\nimport type { IResolvedBrizzConfig } from '../config';\nimport { logger } from '../logger';\n\nimport { BrizzBatchSpanProcessor, BrizzSimpleSpanProcessor } from './processors/span-processor';\n\nexport class TracingModule {\n private static instance: TracingModule | null = null;\n private spanExporter: SpanExporter | null = null;\n private spanProcessor: SpanProcessor | null = null;\n\n static getInstance(): TracingModule {\n if (!TracingModule.instance) {\n throw new Error('Brizz must be initialized before accessing TracingModule');\n }\n return TracingModule.instance;\n }\n\n /**\n * Initialize the tracing module with the provided configuration\n */\n setup(config: IResolvedBrizzConfig): void {\n logger.info('Setting up tracing module');\n\n // Initialize exporter (custom or default)\n this.initSpanExporter(config);\n\n // Initialize processor with masking support\n this.initSpanProcessor(config);\n\n // Set as module instance for standalone functions\n TracingModule.instance = this;\n\n logger.info('Tracing module setup completed');\n }\n\n /**\n * Initialize the span exporter\n */\n private initSpanExporter(config: IResolvedBrizzConfig): void {\n if (this.spanExporter) {\n logger.debug('Span exporter already initialized, skipping re-initialization');\n return;\n }\n\n // Use custom span exporter if provided\n if (config.customSpanExporter) {\n logger.debug('Using custom span exporter');\n this.spanExporter = config.customSpanExporter;\n logger.debug('Custom span exporter initialized successfully');\n return;\n }\n\n // Use default OTLP exporter\n const tracesUrl = config.baseUrl.replace(/\\/$/, '') + '/v1/traces';\n logger.debug('Initializing default OTLP span exporter', { url: tracesUrl });\n\n this.spanExporter = new OTLPTraceExporter({\n url: tracesUrl,\n headers: config.headers,\n });\n\n logger.debug('OTLP span exporter initialized successfully');\n }\n\n /**\n * Initialize the span processor with masking support\n */\n private initSpanProcessor(config: IResolvedBrizzConfig): void {\n if (this.spanProcessor) {\n logger.debug('Span processor already initialized, skipping re-initialization');\n return;\n }\n\n if (!this.spanExporter) {\n throw new Error('Span exporter must be initialized before processor');\n }\n\n logger.debug('Initializing span processor', {\n disableBatch: config.disableBatch,\n hasMasking: !!config.masking?.spanMasking,\n });\n\n // Use masked processors if masking is configured, otherwise use standard processors\n const spanProcessor = config.disableBatch\n ? new BrizzSimpleSpanProcessor(this.spanExporter, config)\n : new BrizzBatchSpanProcessor(this.spanExporter, config);\n\n logger.debug('Span processor initialized successfully');\n\n this.spanProcessor = spanProcessor;\n }\n\n /**\n * Get the span exporter\n */\n getSpanExporter(): SpanExporter {\n if (!this.spanExporter) {\n throw new Error('Tracing module not initialized');\n }\n return this.spanExporter;\n }\n\n /**\n * Get the span processor\n */\n getSpanProcessor(): SpanProcessor {\n if (!this.spanProcessor) {\n throw new Error('Tracing module not initialized');\n }\n return this.spanProcessor;\n }\n\n async shutdown(): Promise<void> {\n logger.debug('Shutting down tracing module');\n\n if (this.spanProcessor) {\n await this.spanProcessor.shutdown();\n this.spanProcessor = null;\n }\n\n if (this.spanExporter) {\n await this.spanExporter.shutdown();\n this.spanExporter = null;\n }\n\n TracingModule.instance = null;\n logger.debug('Tracing module shutdown completed');\n }\n}\n\n/**\n * Get the OpenTelemetry Span Exporter configured for Brizz.\n * @throws {Error} - If SDK is not initialized\n */\nexport function getSpanExporter(): SpanExporter {\n return TracingModule.getInstance().getSpanExporter();\n}\n\n/**\n * Get the Span Processor configured for Brizz.\n * @throws {Error} - If SDK is not initialized\n */\nexport function getSpanProcessor(): SpanProcessor {\n return TracingModule.getInstance().getSpanProcessor();\n}\n","import { type Attributes, type AttributeValue, context, type Context } from '@opentelemetry/api';\nimport {\n BatchSpanProcessor,\n SimpleSpanProcessor,\n type Span,\n type SpanExporter,\n type ReadableSpan,\n} from '@opentelemetry/sdk-trace-base';\n\nimport type { IResolvedBrizzConfig } from '../../config';\nimport { logger } from '../../logger';\nimport { DEFAULT_PII_PATTERNS } from '../../masking/patterns';\nimport type {\n IAttributesMaskingRule,\n ISpanMaskingConfig,\n MaskableValue,\n} from '../../masking/types';\nimport { maskAttributes } from '../../masking/utils';\nimport { BRIZZ, PROPERTIES_CONTEXT_KEY } from '../../semantic-conventions';\nimport { transformAiSdkSpan } from '../transformations/vercel-ai';\n\nexport const DEFAULT_MASKING_RULES: IAttributesMaskingRule[] = [\n {\n mode: 'partial',\n attributePattern: 'gen_ai.prompt',\n patterns: DEFAULT_PII_PATTERNS,\n },\n {\n mode: 'partial',\n attributePattern: 'gen_ai.completion',\n patterns: DEFAULT_PII_PATTERNS,\n },\n];\n\nexport class BrizzSimpleSpanProcessor extends SimpleSpanProcessor {\n public readonly config: IResolvedBrizzConfig;\n\n constructor(spanExporter: SpanExporter, config: IResolvedBrizzConfig) {\n super(spanExporter);\n this.config = config;\n }\n\n // Will work with the following code:\n // const span = tracer.startSpan('sensitive-operation',{attributes:{\n // 'user.password': 'secret123',\n // 'user.email': 'user@example.com',\n // }});\n //\n // Won't work because onStart is called before attributes are set:\n // span.setAttributes({\n // 'user.password': 'secret123',\n // 'user.email': 'user@example.com'\n // });\n override onStart(span: Span, parentContext: Context): void {\n const maskingConfig = this.config.masking?.spanMasking;\n if (maskingConfig) {\n maskSpan(span, maskingConfig);\n }\n const associationProperties = context.active().getValue(PROPERTIES_CONTEXT_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n span.setAttribute(`${BRIZZ}.${key}`, value as AttributeValue);\n }\n }\n super.onStart(span, parentContext);\n }\n\n override onEnd(span: ReadableSpan): void {\n transformAiSdkSpan(span);\n super.onEnd(span);\n }\n}\n\nexport class BrizzBatchSpanProcessor extends BatchSpanProcessor {\n public readonly config: IResolvedBrizzConfig;\n\n constructor(spanExporter: SpanExporter, config: IResolvedBrizzConfig) {\n super(spanExporter);\n this.config = config;\n }\n\n override onStart(span: Span, parentContext: Context): void {\n const maskingConfig = this.config.masking?.spanMasking;\n if (maskingConfig) {\n maskSpan(span, maskingConfig);\n }\n const associationProperties = context.active().getValue(PROPERTIES_CONTEXT_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n span.setAttribute(`${BRIZZ}.${key}`, value as AttributeValue);\n }\n }\n super.onStart(span, parentContext);\n }\n\n override onEnd(span: ReadableSpan): void {\n transformAiSdkSpan(span);\n super.onEnd(span);\n }\n}\n\nexport function maskSpan(span: Span, config: ISpanMaskingConfig): Span {\n if (!span.attributes || Object.keys(span.attributes).length === 0) {\n return span;\n }\n\n let rules = config.rules || [];\n if (!config.disableDefaultRules) {\n rules = [...DEFAULT_MASKING_RULES, ...rules];\n }\n\n try {\n const attributesRecord: Record<string, MaskableValue> = {};\n\n for (const [key, value] of Object.entries(span.attributes)) {\n attributesRecord[key] = value as MaskableValue;\n }\n\n const maskedAttributes = maskAttributes(attributesRecord, rules);\n if (maskedAttributes && Object.keys(maskedAttributes).length > 0) {\n // Use setAttributes to update the span\n const merged: Attributes = { ...span.attributes };\n for (const [key, value] of Object.entries(maskedAttributes)) {\n merged[key] = value as AttributeValue;\n }\n span.setAttributes(merged);\n }\n\n return span;\n } catch (error) {\n logger.error('Error masking span:', error);\n return span;\n }\n}\n","import type { AttributeValue } from '@opentelemetry/api';\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-node';\nimport { SpanAttributes } from '@traceloop/ai-semantic-conventions';\n\nimport { logger } from '../../logger';\n\nconst AI_GENERATE_TEXT_DO_GENERATE = 'ai.generateText.doGenerate';\nconst AI_STREAM_TEXT_DO_STREAM = 'ai.streamText.doStream';\nconst HANDLED_SPAN_NAMES: Record<string, string | ((span: ReadableSpan) => string)> = {\n [AI_GENERATE_TEXT_DO_GENERATE]: 'gen_ai.chat',\n [AI_STREAM_TEXT_DO_STREAM]: 'gen_ai.chat',\n 'ai.streamText': 'ai.streamText',\n 'ai.toolCall': (span: ReadableSpan) => {\n const toolName = span.attributes['ai.toolCall.name'];\n return `${String(toolName ?? 'unknown')}.tool`;\n },\n};\n\nconst AI_RESPONSE_TEXT = 'ai.response.text';\nconst AI_PROMPT_MESSAGES = 'ai.prompt.messages';\nconst AI_USAGE_PROMPT_TOKENS = 'ai.usage.promptTokens';\nconst AI_USAGE_COMPLETION_TOKENS = 'ai.usage.completionTokens';\nconst AI_MODEL_PROVIDER = 'ai.model.provider';\n\nexport const transformAiSdkSpanName = (span: ReadableSpan): void => {\n // Unfortunately, the span name is not writable as this is not the intended behavior\n // but it is a workaround to set the correct span name\n if (span.name in HANDLED_SPAN_NAMES) {\n const handler = HANDLED_SPAN_NAMES[span.name];\n if (typeof handler === 'function') {\n (span as unknown as { name: string }).name = handler(span);\n } else if (handler) {\n (span as unknown as { name: string }).name = handler;\n }\n }\n};\n\nexport const transformResponseText = (attributes: Record<string, AttributeValue>): void => {\n if (AI_RESPONSE_TEXT in attributes) {\n attributes[`${SpanAttributes.LLM_COMPLETIONS}.0.content`] = attributes[AI_RESPONSE_TEXT];\n attributes[`${SpanAttributes.LLM_COMPLETIONS}.0.role`] = 'assistant';\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[AI_RESPONSE_TEXT];\n }\n};\n\nexport const transformPromptMessages = (attributes: Record<string, AttributeValue>): void => {\n if (AI_PROMPT_MESSAGES in attributes) {\n try {\n const messages = JSON.parse(attributes[AI_PROMPT_MESSAGES] as string);\n // Use for...of instead of forEach\n for (const [index, msg] of messages.entries()) {\n const message = msg as { role: string; content: unknown };\n logger.debug('Transforming prompt message', { msg: message, type: typeof message.content });\n if (typeof message.content === 'string') {\n attributes[`${SpanAttributes.LLM_PROMPTS}.${index}.content`] = message.content;\n } else {\n if (Array.isArray(message.content) && message.content.length > 0) {\n const lastContent = message.content.at(-1) as { text?: string };\n if (lastContent?.text) {\n attributes[`${SpanAttributes.LLM_PROMPTS}.${index}.content`] = lastContent.text;\n }\n } else {\n attributes[`${SpanAttributes.LLM_PROMPTS}.${index}.content`] = JSON.stringify(\n message.content,\n );\n }\n }\n\n attributes[`${SpanAttributes.LLM_PROMPTS}.${index}.role`] = message.role;\n }\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[AI_PROMPT_MESSAGES];\n } catch (error) {\n // Skip if JSON parsing fails\n logger.debug('Skipping prompt messages transformation because of JSON parsing error', {\n e: error,\n });\n }\n }\n};\n\nexport const transformPromptTokens = (attributes: Record<string, AttributeValue>): void => {\n if (AI_USAGE_PROMPT_TOKENS in attributes) {\n attributes[`${SpanAttributes.LLM_USAGE_PROMPT_TOKENS}`] = attributes[AI_USAGE_PROMPT_TOKENS];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[AI_USAGE_PROMPT_TOKENS];\n }\n};\n\nexport const transformCompletionTokens = (attributes: Record<string, AttributeValue>): void => {\n if (AI_USAGE_COMPLETION_TOKENS in attributes) {\n attributes[`${SpanAttributes.LLM_USAGE_COMPLETION_TOKENS}`] =\n attributes[AI_USAGE_COMPLETION_TOKENS];\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[AI_USAGE_COMPLETION_TOKENS];\n }\n};\n\nexport const calculateTotalTokens = (attributes: Record<string, AttributeValue>): void => {\n const promptTokens = attributes[`${SpanAttributes.LLM_USAGE_PROMPT_TOKENS}`];\n const completionTokens = attributes[`${SpanAttributes.LLM_USAGE_COMPLETION_TOKENS}`];\n\n if (promptTokens && completionTokens) {\n attributes[`${SpanAttributes.LLM_USAGE_TOTAL_TOKENS}`] =\n Number(promptTokens) + Number(completionTokens);\n }\n};\n\nexport const transformVendor = (attributes: Record<string, AttributeValue>): void => {\n if (AI_MODEL_PROVIDER in attributes) {\n const vendor = attributes[AI_MODEL_PROVIDER] as string;\n attributes[SpanAttributes.LLM_SYSTEM] = vendor && vendor.startsWith('openai') ? 'OpenAI' : vendor;\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete attributes[AI_MODEL_PROVIDER];\n }\n};\n\nexport const transformAiSdkAttributes = (attributes: Record<string, AttributeValue>): void => {\n transformResponseText(attributes);\n transformPromptMessages(attributes);\n transformPromptTokens(attributes);\n transformCompletionTokens(attributes);\n calculateTotalTokens(attributes);\n transformVendor(attributes);\n};\n\nexport const shouldHandleSpan = (span: ReadableSpan): boolean => {\n return span.name in HANDLED_SPAN_NAMES;\n};\n\nexport const transformAiSdkSpan = (span: ReadableSpan): void => {\n if (!shouldHandleSpan(span)) {\n logger.debug('Skipping span transformation', { spanName: span.name });\n return;\n }\n // This is a workaround to handle NaN values.\n // The problem arize from vercel ai provider like portkey which do not supply usage properly, causing NaN values.\n for (const key in span.attributes) {\n if (Number.isNaN(span.attributes[key])) {\n span.attributes[key] = 0;\n }\n }\n\n logger.debug('Transforming AI SDK span', {\n spanName: span.name,\n spanContext: span.spanContext(),\n attributes: span.attributes,\n });\n\n transformAiSdkSpanName(span);\n transformAiSdkAttributes(span.attributes as Record<string, AttributeValue>);\n};\n","import { context } from '@opentelemetry/api';\n\nimport { PROPERTIES_CONTEXT_KEY, SESSION_ID } from '../semantic-conventions';\n\nexport function withProperties<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n properties: { [name: string]: string },\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n): ReturnType<F> {\n if (Object.keys(properties).length === 0) {\n return fn.apply(thisArg, args);\n }\n\n const newContext = context.active().setValue(PROPERTIES_CONTEXT_KEY, properties);\n return context.with(newContext, fn, thisArg, ...args);\n}\n\n/**\n * Wraps a function to execute it with session context. All telemetry (traces, spans, events)\n * generated within the wrapped function will include the session ID.\n *\n * @example\n * ```typescript\n * // Basic usage with async function\n * await WithSessionId('session-123', myAsyncFunction, null, arg1, arg2);\n *\n * // With method and 'this' context\n * const result = WithSessionId('session-456', obj.method, obj, param);\n *\n * // Wrapping AI operations\n * const response = await WithSessionId('chat-session', async () => {\n * const aiResponse = await openai.chat.completions.create({\n * model: 'gpt-4',\n * messages: [{ role: 'user', content: 'Hello' }]\n * });\n * emitEvent('ai.response', { tokens: aiResponse.usage.total_tokens });\n * return aiResponse;\n * });\n * ```\n *\n * @param sessionId - Session identifier to include in all telemetry within the function\n * @param fn - Function to execute with session context\n * @param thisArg - Value to use as `this` when calling the function (optional)\n * @param args - Arguments to pass to the wrapped function\n * @returns The return value of the wrapped function\n */\nexport function WithSessionId<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n sessionId: string,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n): ReturnType<F> {\n return withProperties({ [SESSION_ID]: sessionId }, fn, thisArg, ...args);\n}\n","import module from 'node:module';\n\nimport { createAddHookMessageChannel } from 'import-in-the-middle';\n////////////////////////////// WARNING /////////////////////////////////\n///////// THIS FILE MUST NOT IMPORT ANY 3RD PARTY MODULES //////////////\n///////// Will cause infinite loop ////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n\n// Mini logger for loader - zero dependencies, only logs if BRIZZ_ESM_DEBUG=true\nconst loaderDebug = (() => {\n const isDebug =\n process.env['BRIZZ_ESM_DEBUG'] === 'true' || process.env['BRIZZ_LOG_LEVEL'] === 'debug';\n\n return {\n log: (msg: string, data?: unknown) => {\n if (!isDebug) {return;}\n const timestamp = new Date().toISOString();\n const dataStr = data ? ` ${JSON.stringify(data)}` : '';\n console.log(`[${timestamp}] [ESM-LOADER] ${msg}${dataStr}`);\n },\n error: (msg: string, error?: unknown) => {\n if (!isDebug) {return;}\n const timestamp = new Date().toISOString();\n const errorStr =\n error instanceof Error ? ` ${error.message}` : (error ? ` ${JSON.stringify(error)}` : '');\n console.error(`[${timestamp}] [ESM-LOADER] ERROR: ${msg}${errorStr}`);\n },\n };\n})();\n\n// Use a Symbol to ensure unique global key that won't be accidentally overwritten\nconst LOADER_REGISTERED_KEY = Symbol.for('__brizz_esm_loader_registered__');\n\n// Check if loader API is supported\nfunction checkLoaderAPISupport() {\n const [major, minor] = process.versions.node.split('.').map(Number);\n\n if (major === undefined || minor === undefined) {\n loaderDebug.log('Failed to detect Node version, assuming loader API is supported');\n return true;\n }\n\n const supported = major >= 21 || (major === 20 && minor >= 6) || (major === 18 && minor >= 19);\n\n loaderDebug.log('Loader API support check:', {\n nodeVersion: `${major}.${minor}`,\n supportsLoaderAPI: supported,\n });\n\n return supported;\n}\n\nexport function maybeRegisterESMLoader(): boolean {\n // Check if already registered using Symbol key\n if ((globalThis as any)[LOADER_REGISTERED_KEY] === true) {\n loaderDebug.log('ESM loader already registered, skipping');\n return false;\n }\n\n // Mark as registered immediately to prevent race conditions\n (globalThis as any)[LOADER_REGISTERED_KEY] = true;\n\n loaderDebug.log('Starting ESM loader registration...');\n\n if (!checkLoaderAPISupport()) {\n loaderDebug.log('Node.js version does not support loader API, skipping');\n return false;\n }\n\n // Check if import.meta is available (ESM context)\n if (import.meta === undefined || !import.meta.url) {\n loaderDebug.log('import.meta.url not available, skipping loader registration');\n (globalThis as any)[LOADER_REGISTERED_KEY] = false;\n return false;\n }\n\n // Skip in test environments where module.register might cause issues\n const isTest = process.env['NODE_ENV'] === 'test' || process.env['JEST_WORKER_ID'] !== undefined;\n if (isTest) {\n loaderDebug.log('Test environment detected, skipping ESM loader registration');\n (globalThis as any)[LOADER_REGISTERED_KEY] = false;\n return false;\n }\n\n try {\n loaderDebug.log('Creating MessageChannel for import-in-the-middle...');\n const { addHookMessagePort } = createAddHookMessageChannel();\n\n loaderDebug.log('Registering import-in-the-middle/hook.mjs...');\n\n // Pass import.meta.url as the parent URL for resolving the module specifier\n // This is necessary when module.register is called from a data: URL context\n module.register('import-in-the-middle/hook.mjs', import.meta.url, {\n data: { addHookMessagePort },\n transferList: [addHookMessagePort],\n });\n\n loaderDebug.log('ESM loader successfully registered!');\n return true;\n } catch (error) {\n loaderDebug.error('Failed to register ESM loader:', error);\n // Reset the flag on failure so it can be retried if needed\n (globalThis as any)[LOADER_REGISTERED_KEY] = false;\n return false;\n }\n}\n\n// Auto-execute when the loader module is imported via --import\n// Check both the Symbol key and execution context\nif ((globalThis as any)[LOADER_REGISTERED_KEY] !== true) {\n loaderDebug.log('Loader module imported, attempting to register...');\n maybeRegisterESMLoader();\n}\n","import { logger } from '../internal/logger.js';\n\nexport interface RuntimeInfo {\n isESM: boolean;\n isCJS: boolean;\n nodeVersion: string;\n supportsLoaderAPI: boolean;\n supportsRegister: boolean;\n}\n\nexport function detectRuntime(): RuntimeInfo {\n const [major, minor] = process.versions.node.split('.').map(Number);\n\n // Detect ESM vs CJS based on Node.js globals availability\n // In pure ESM: __filename, __dirname, module, exports are undefined\n // In pure CJS: __filename, __dirname, module, exports all exist\n // In mixed/loader contexts: some may exist as shims\n const noNodeJSGlobals = typeof __filename === 'undefined' && typeof __dirname === 'undefined';\n const noModuleSystem = typeof module === 'undefined' && typeof exports === 'undefined';\n const hasRequire = typeof require === 'function';\n\n // ESM: No Node.js globals AND no CJS module system\n // This covers pure ESM and ESM loader contexts\n const isESM = noNodeJSGlobals && noModuleSystem;\n\n // CJS: All CJS globals exist (require, module, exports, __filename, __dirname)\n // This ensures we're in a real CJS context, not a shim environment\n const isCJS =\n hasRequire &&\n typeof module !== 'undefined' &&\n typeof exports !== 'undefined' &&\n typeof __filename === 'string' &&\n typeof __dirname === 'string';\n\n const supportsLoaderAPI =\n (major ?? 0) >= 21 || ((major ?? 0) === 20 && (minor ?? 0) >= 6) || ((major ?? 0) === 18 && (minor ?? 0) >= 19);\n const supportsRegister = !!(process.features as any)?.typescript || !!(globalThis as any).module?.register;\n\n logger.debug('Runtime detection results:', {\n nodeVersion: `${major ?? 0}.${minor ?? 0}`,\n isESM,\n isCJS,\n supportsLoaderAPI,\n supportsRegister,\n detectionLogic: {\n noNodeJSGlobals,\n noModuleSystem,\n hasRequire,\n esmCondition: `${noNodeJSGlobals} && ${noModuleSystem} = ${isESM}`,\n cjsCondition: `require && module && exports && __filename && __dirname = ${isCJS}`,\n },\n checks: {\n __filename: typeof __filename,\n __dirname: typeof __dirname,\n require: typeof require,\n module: typeof module,\n exports: typeof exports,\n 'process.features': process.features,\n 'globalThis.module': (globalThis as any).module,\n },\n });\n\n return {\n isESM,\n isCJS,\n nodeVersion: process.versions.node,\n supportsLoaderAPI,\n supportsRegister,\n };\n}\n","/**\n * Preload entry point for automatic SDK initialization.\n *\n * This module can be used with Node.js preload flags:\n * - ESM: node --import @brizz/sdk/preload app.mjs\n * - CJS: node --require @brizz/sdk/preload app.js\n *\n * It automatically initializes the SDK with environment-based configuration.\n */\n\n// Import the main SDK and initialization utilities\nimport { logger, DEFAULT_LOG_LEVEL } from './internal/logger.js';\nimport { Brizz } from './internal/sdk.js';\nimport { maybeRegisterESMLoader } from './node/loader.js';\nimport { detectRuntime } from './node/runtime.js';\n\n// Detect runtime early\nconst runtime = detectRuntime();\n\n// Register ESM loader if needed\nif (runtime.isESM && runtime.supportsLoaderAPI) {\n maybeRegisterESMLoader();\n}\n\n// Auto-initialize with environment-based config\ntry {\n // Initialize the main SDK with environment variables\n Brizz.initialize({\n apiKey: process.env['BRIZZ_API_KEY'],\n baseUrl: process.env['BRIZZ_BASE_URL'],\n appName: process.env['BRIZZ_APP_NAME'] || process.env['OTEL_SERVICE_NAME'],\n logLevel: (process.env['BRIZZ_LOG_LEVEL'] || DEFAULT_LOG_LEVEL.toString()) as any,\n // Enable auto-instrumentation by default in preload mode\n disableNodeSdk: false,\n });\n\n logger.info(`SDK auto-initialized for ${runtime.isESM ? 'ESM' : 'CJS'} runtime`);\n} catch (error) {\n logger.warn('Failed to auto-initialize SDK:', { error });\n}\n"],"mappings":"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AAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EACl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","names":["pino","import_resources","import_sdk_logs","import_api","import_api","import_api","import_api","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/logger.ts","../src/internal/sdk.ts","../src/internal/config.ts","../src/internal/instrumentation/registry.ts","../src/internal/log/logging.ts","../src/internal/log/processors/log-processor.ts","../src/internal/masking/patterns.ts","../src/internal/masking/utils.ts","../src/internal/semantic-conventions.ts","../src/internal/metric/metrics.ts","../src/internal/trace/tracing.ts","../src/internal/trace/processors/span-processor.ts","../src/internal/trace/session.ts","../src/node/loader.ts","../src/node/runtime.ts","../src/preload.ts"],"sourcesContent":["/**\n * Logger interface and implementations for the Brizz SDK.\n *\n * Simple Pino-based logging system that works everywhere in the SDK,\n * including during bootstrap and instrumentation loading.\n */\n\nimport { DiagLogLevel } from '@opentelemetry/api';\nimport pino from 'pino';\n\n/**\n * Available log levels for the Brizz SDK, ordered by severity.\n */\nexport enum LogLevel {\n NONE = 0,\n ERROR = 1,\n WARN = 2,\n INFO = 3,\n DEBUG = 4,\n}\n\n/**\n * Default log level for the SDK when no level is specified.\n */\nexport const DEFAULT_LOG_LEVEL = LogLevel.WARN;\n\n/**\n * Internal logger interface for the SDK.\n */\nexport interface ILogger {\n debug: (msg: string, ...meta: unknown[]) => void;\n info: (msg: string, ...meta: unknown[]) => void;\n warn: (msg: string, ...meta: unknown[]) => void;\n error: (msg: string, ...meta: unknown[]) => void;\n setLevel: (level: LogLevel) => void;\n getLevel: () => LogLevel;\n}\n\n/**\n * Pino-based logger implementation with dynamic level control.\n */\nclass PinoLogger implements ILogger {\n private _level: LogLevel = DEFAULT_LOG_LEVEL;\n private _pinoLogger: pino.Logger | null = null;\n\n constructor() {\n // Set initial level from environment\n const envLevel = this.getLogLevelFromEnv();\n this._level = envLevel;\n }\n\n /**\n * Lazy initialization of Pino logger to ensure it's created AFTER Jest spies\n * are set up during tests. This prevents the pino-pretty transport from\n * bypassing stdout/stderr spies.\n */\n private ensurePinoLogger(): pino.Logger {\n if (!this._pinoLogger) {\n this._pinoLogger = pino({\n name: 'Brizz',\n level: this.logLevelToPino(this._level),\n // Disable transport in test environment to allow proper spy capture\n transport: this.isProduction() || this.isTest()\n ? undefined\n : {\n target: 'pino-pretty',\n options: {\n singleLine: true,\n colorize: true,\n translateTime: 'HH:MM:ss',\n ignore: 'pid,hostname',\n messageFormat: '[{name}] {msg}',\n },\n },\n });\n }\n return this._pinoLogger;\n }\n\n private isProduction(): boolean {\n return process.env['NODE_ENV'] === 'production';\n }\n\n private isTest(): boolean {\n return process.env['NODE_ENV'] === 'test';\n }\n\n private getLogLevelFromEnv(): LogLevel {\n const envLevel = process.env['BRIZZ_LOG_LEVEL'];\n return envLevel ? parseLogLevel(envLevel) : DEFAULT_LOG_LEVEL;\n }\n\n private logLevelToPino(level: LogLevel): string {\n switch (level) {\n case LogLevel.DEBUG:\n return 'debug';\n case LogLevel.INFO:\n return 'info';\n case LogLevel.WARN:\n return 'warn';\n case LogLevel.ERROR:\n return 'error';\n default:\n return 'silent';\n }\n }\n\n private formatMeta(meta: unknown[]): object {\n if (meta.length === 0) {\n return {};\n }\n\n if (meta.length === 1 && typeof meta[0] === 'object' && meta[0] !== null) {\n return meta[0] as object;\n }\n\n return { metadata: meta };\n }\n\n setLevel(level: LogLevel): void {\n this._level = level;\n if (this._pinoLogger) {\n this._pinoLogger.level = this.logLevelToPino(level);\n }\n }\n\n getLevel(): LogLevel {\n return this._level;\n }\n\n debug = (msg: string, ...meta: unknown[]): void => {\n if (this._level >= LogLevel.DEBUG) {\n this.ensurePinoLogger().debug(this.formatMeta(meta), msg);\n }\n };\n\n info = (msg: string, ...meta: unknown[]): void => {\n if (this._level >= LogLevel.INFO) {\n this.ensurePinoLogger().info(this.formatMeta(meta), msg);\n }\n };\n\n warn = (msg: string, ...meta: unknown[]): void => {\n if (this._level >= LogLevel.WARN) {\n this.ensurePinoLogger().warn(this.formatMeta(meta), msg);\n }\n };\n\n error = (msg: string, ...meta: unknown[]): void => {\n if (this._level >= LogLevel.ERROR) {\n this.ensurePinoLogger().error(this.formatMeta(meta), msg);\n }\n };\n}\n\n/**\n * No-op logger that silences all logging output.\n */\nexport const noopLogger: ILogger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n setLevel: () => {},\n getLevel: () => LogLevel.NONE,\n};\n\n/**\n * Parses a log level string into a LogLevel enum value.\n * Supports both string names and numeric values.\n */\nexport function parseLogLevel(level?: string): LogLevel {\n if (!level) {\n return DEFAULT_LOG_LEVEL;\n }\n\n const normalizedLevel = level.toLowerCase().trim();\n\n switch (normalizedLevel) {\n case 'debug':\n return LogLevel.DEBUG;\n case 'info':\n return LogLevel.INFO;\n case 'warn':\n case 'warning':\n return LogLevel.WARN;\n case 'error':\n return LogLevel.ERROR;\n case 'none':\n case 'off':\n case 'silent':\n return LogLevel.NONE;\n default: {\n // Try to parse as number\n const numLevel = Number.parseInt(normalizedLevel, 10);\n if (!Number.isNaN(numLevel) && numLevel >= 0 && numLevel <= 4) {\n return numLevel as LogLevel;\n }\n return DEFAULT_LOG_LEVEL;\n }\n }\n}\n\n/**\n * Global logger instance - initialized once and used throughout the SDK.\n */\nexport const logger: ILogger = new PinoLogger();\n\n/**\n * Sets the global logger level.\n */\nexport function setLogLevel(level: LogLevel | string): void {\n const resolvedLevel = typeof level === 'string' ? parseLogLevel(level) : level;\n logger.setLevel(resolvedLevel);\n}\n\n/**\n * Gets the current global logger level.\n */\nexport function getLogLevel(): LogLevel {\n return logger.getLevel();\n}\n\n/**\n * Maps Brizz LogLevel to OpenTelemetry DiagLogLevel.\n */\nexport function mapLogLevelToDiagLevel(logLevel: LogLevel): DiagLogLevel {\n switch (logLevel) {\n case LogLevel.DEBUG:\n return DiagLogLevel.DEBUG;\n case LogLevel.INFO:\n return DiagLogLevel.INFO;\n case LogLevel.WARN:\n return DiagLogLevel.WARN;\n case LogLevel.ERROR:\n return DiagLogLevel.ERROR;\n default:\n return DiagLogLevel.NONE;\n }\n}\n","import { resourceFromAttributes } from '@opentelemetry/resources';\nimport type { LogRecordExporter } from '@opentelemetry/sdk-logs';\nimport type { MetricReader } from '@opentelemetry/sdk-metrics';\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\n\nimport type { IResolvedBrizzConfig } from './config';\nimport { resolveConfig } from './config';\nimport { InstrumentationRegistry, type IInstrumentModules } from './instrumentation';\nimport { LoggingModule } from './log';\nimport type { LogLevel } from './logger';\nimport { logger } from './logger';\nimport { type IMaskingConfig } from './masking';\nimport { getMetricsReader, MetricsModule } from './metric';\nimport { getSpanProcessor, TracingModule } from './trace';\n\n/**\n * Configuration options for initializing the Brizz SDK.\n *\n * @interface IBrizzInitializeOptions\n */\nexport interface IBrizzInitializeOptions {\n /** Application name for service identification */\n appName?: string;\n /** Base URL for telemetry endpoints (defaults to https://telemetry.brizz.dev) */\n baseUrl?: string;\n /** API key for authentication */\n apiKey?: string;\n /** Additional HTTP headers to include in telemetry requests */\n headers?: Record<string, string>;\n /** Disable batch processing for immediate event emission */\n disableBatch?: boolean;\n /** Deployment environment (e.g., 'production', 'staging', 'development') for OpenTelemetry resource attributes */\n environment?: string;\n /**\n * Configuration for data masking and PII protection.\n * - `true`: Enable masking with default rules\n * - `false` or `undefined`: Disable masking\n * - `IMaskingConfig`: Enable masking with custom configuration\n */\n masking?: boolean | IMaskingConfig;\n /** Log level for SDK internal logging and OpenTelemetry diagnostic logging (debug, info, warn, error, none) */\n logLevel?: LogLevel | string;\n /**\n * Manual instrumentation modules for Next.js/Webpack environments.\n * Provide the actual imported modules to enable instrumentation in environments\n * where automatic instrumentation doesn't work properly.\n *\n * @example\n * ```typescript\n * import OpenAI from 'openai';\n * import * as LlamaIndex from 'llamaindex';\n *\n * Brizz.initialize({\n * appName: 'my-app',\n * instrumentModules: {\n * openAI: OpenAI,\n * llamaindex: LlamaIndex\n * }\n * });\n * ```\n */\n instrumentModules?: IInstrumentModules;\n /**\n * Disable the internal NodeSDK initialization and only setup telemetry modules.\n * This is useful when you want to create your own NodeSDK using Brizz utilities.\n * Brizz will automatically register its instrumentations with your SDK.\n *\n * @example\n * ```typescript\n * import { NodeSDK } from '@opentelemetry/sdk-node';\n * import { Brizz, getSpanProcessor } from 'brizz-sdk';\n *\n * // Initialize Brizz without internal NodeSDK\n * Brizz.initialize({\n * appName: 'my-app',\n * disableNodeSdk: true\n * });\n *\n * // Create your own NodeSDK\n * const sdk = new NodeSDK({\n * spanProcessors: [getSpanProcessor()],\n * // your custom configuration\n * });\n * sdk.start();\n * ```\n */\n disableNodeSdk?: boolean;\n /**\n * Custom span exporter for testing or alternative backends.\n * When provided, this exporter will be used instead of the default OTLP exporter.\n * Useful for integration testing with InMemorySpanExporter or custom exporters.\n *\n * @example\n * ```typescript\n * import { InMemorySpanExporter } from '@opentelemetry/sdk-trace-base';\n *\n * const spanExporter = new InMemorySpanExporter();\n * Brizz.initialize({\n * appName: 'test-app',\n * customSpanExporter: spanExporter\n * });\n *\n * // Later in tests\n * const spans = spanExporter.getFinishedSpans();\n * ```\n */\n customSpanExporter?: SpanExporter;\n /**\n * Custom log exporter for testing or alternative backends.\n * When provided, this exporter will be used instead of the default OTLP exporter.\n * Useful for integration testing with InMemoryLogExporter or custom exporters.\n *\n * @example\n * ```typescript\n * import { InMemoryLogExporter } from 'brizz-sdk/test-utils';\n *\n * const logExporter = new InMemoryLogExporter();\n * Brizz.initialize({\n * appName: 'test-app',\n * customLogExporter: logExporter\n * });\n *\n * // Later in tests\n * const logs = logExporter.getFinishedLogs();\n * ```\n */\n customLogExporter?: LogRecordExporter;\n /**\n * Custom metric reader for testing or alternative backends.\n * When provided, this reader will be used instead of the default OTLP exporter.\n * Useful for integration testing with InMemoryMetricReader or custom readers.\n *\n * @example\n * ```typescript\n * import { InMemoryMetricReader } from 'brizz-sdk/test-utils';\n *\n * const metricReader = new InMemoryMetricReader();\n * Brizz.initialize({\n * appName: 'test-app',\n * customMetricReader: metricReader\n * });\n *\n * // Later in tests\n * const metrics = metricReader.getCollectedMetrics();\n * ```\n */\n customMetricReader?: MetricReader;\n}\n\n/**\n * Internal implementation of the Brizz SDK.\n *\n * This class is responsible only for initialization and shutdown of the SDK.\n * All functionality is exposed through standalone utility functions.\n *\n * @class _Brizz\n * @internal\n */\nexport class _Brizz {\n private static instance: _Brizz | null = null;\n /** Flag indicating if SDK initialization has completed successfully */\n private _initialized = false;\n\n /** OpenTelemetry sdk instance */\n private _sdk: NodeSDK | null = null;\n\n static getInstance(): _Brizz {\n if (!_Brizz.instance) {\n throw new Error('Brizz must be initialized before accessing TracingModule');\n }\n return _Brizz.instance;\n }\n\n /**\n * Initialize the Brizz SDK with the provided configuration.\n *\n * @param {IBrizzInitializeOptions} options - Configuration options for the SDK\n * @throws {Error} - If initialization fails\n *\n * @example\n * ```typescript\n * Brizz.initialize({\n * appName: 'my-app',\n * baseUrl: 'http://localhost:4318',\n * apiKey: 'your-api-key'\n * });\n * ```\n */\n initialize(options: IBrizzInitializeOptions): void {\n if (this._initialized) {\n logger.warn('Brizz SDK already initialized');\n return;\n }\n\n logger.info('Starting Brizz SDK initialization');\n\n try {\n const resolvedConfig = resolveConfig(options);\n this.initializeModules(resolvedConfig);\n this.setupInstrumentation(options);\n this.createAndStartNodeSDK(options, resolvedConfig);\n\n this._initialized = true;\n logger.info('Brizz SDK initialization completed successfully', {\n moduleSystem: this.detectModuleSystem(),\n });\n } catch (error) {\n logger.error('Failed to initialize Brizz SDK', { error });\n throw new Error(`Failed to initialize SDK: ${String(error)}`);\n }\n }\n\n /**\n * Set up instrumentation registry and configure manual modules.\n * @private\n */\n private setupInstrumentation(options: IBrizzInitializeOptions): void {\n const registry = InstrumentationRegistry.getInstance();\n\n if (options.instrumentModules && Object.keys(options.instrumentModules).length > 0) {\n registry.setManualModules(options.instrumentModules);\n }\n }\n\n /**\n * Create and start NodeSDK if not disabled.\n * Only handles manual instrumentations now - auto instrumentations are loaded at import time.\n * @private\n */\n private createAndStartNodeSDK(\n options: IBrizzInitializeOptions,\n resolvedConfig: IResolvedBrizzConfig,\n ): void {\n if (options.disableNodeSdk) {\n logger.info('NodeSDK disabled - only telemetry modules initialized');\n return;\n }\n\n const registry = InstrumentationRegistry.getInstance();\n const manualInstrumentations = registry.getManualInstrumentations();\n\n const resourceAttributes: Record<string, string> = {\n 'service.name': resolvedConfig.appName,\n };\n\n // Add environment attribute if specified\n if (resolvedConfig.environment) {\n resourceAttributes['deployment.environment'] = resolvedConfig.environment;\n }\n\n this._sdk = new NodeSDK({\n spanProcessors: [getSpanProcessor()],\n metricReader: getMetricsReader(),\n resource: resourceFromAttributes(resourceAttributes),\n instrumentations: manualInstrumentations,\n });\n this._sdk.start();\n\n if (manualInstrumentations.length > 0) {\n logger.info(`NodeSDK started with ${manualInstrumentations.length} manual instrumentations`);\n } else {\n logger.info('NodeSDK started - using auto-instrumentations loaded at import time');\n }\n }\n\n /**\n * Initialize telemetry modules.\n *\n * Sets up the tracing, metrics, and logging modules with their\n * respective exporters and processors.\n *\n * @param {IResolvedBrizzConfig} config - Resolved configuration\n * @private\n */\n private initializeModules(config: IResolvedBrizzConfig): void {\n logger.info('Initializing telemetry modules');\n\n // Initialize tracing module\n logger.debug('Initializing tracing module');\n const tracingModule = new TracingModule();\n tracingModule.setup(config);\n\n // Initialize metrics module\n logger.debug('Initializing metrics module');\n const metricsModule = new MetricsModule();\n metricsModule.setup(config);\n\n // Initialize logging module\n logger.debug('Initializing logging module');\n const loggingModule = new LoggingModule();\n loggingModule.setup(config);\n\n logger.info('All telemetry modules initialized successfully');\n }\n\n /**\n * Detect the current module system (ESM or CJS) using reliable indicators\n *\n * @returns {string} - 'ESM' or 'CJS'\n * @private\n */\n private detectModuleSystem(): string {\n const inCJS =\n typeof module !== 'undefined' &&\n typeof exports !== 'undefined' &&\n typeof require === 'function' &&\n typeof __filename === 'string' &&\n typeof __dirname === 'string' &&\n\n this === (typeof exports !== 'undefined' ? exports : undefined); // top-level `this` is exports in CJS, undefined in ESM\n\n return inCJS ? 'CJS' : 'ESM';\n }\n\n /**\n * Gracefully shutdown the Brizz SDK.\n *\n * This method stops all telemetry collection, flushes any pending data,\n * and releases resources. Should be called before application termination.\n *\n * @returns {Promise<void>} - Resolves when shutdown is complete\n * @throws {Error} - If shutdown fails\n *\n * @example\n * ```typescript\n * // Shutdown before app exit\n * await Brizz.shutdown();\n * ```\n */\n public async shutdown(): Promise<void> {\n if (!this._initialized) {\n logger.warn('Brizz SDK not initialized');\n return;\n }\n\n try {\n // Shutdown all modules\n await this.shutdownModules();\n await this._sdk?.shutdown();\n\n // Clear all references\n this._initialized = false;\n this._sdk = null;\n _Brizz.instance = null;\n\n logger.info('Brizz SDK shut down successfully');\n } catch (error) {\n // Suppress network errors during shutdown in tests\n if (error instanceof Error && error.message.includes('ENOTFOUND')) {\n logger.debug(`Network error during shutdown (expected in tests): ${error.message}`);\n } else {\n logger.error(`Failed to shutdown Brizz SDK: ${String(error)}`);\n throw error;\n }\n }\n }\n\n /**\n * Shutdown all telemetry modules.\n * @private\n */\n private async shutdownModules(): Promise<void> {\n logger.info('Shutting down telemetry modules');\n\n try {\n // Shutdown tracing module\n try {\n const tracingModule = TracingModule.getInstance();\n await tracingModule.shutdown();\n } catch {\n logger.debug('Tracing module already shut down or not initialized');\n }\n\n // Shutdown metrics module\n try {\n const metricsModule = MetricsModule.getInstance();\n metricsModule.shutdown();\n } catch {\n logger.debug('Metrics module already shut down or not initialized');\n }\n\n // Shutdown logging module\n try {\n const loggingModule = LoggingModule.getInstance();\n await loggingModule.shutdown();\n } catch {\n logger.debug('Logging module already shut down or not initialized');\n }\n\n logger.info('All telemetry modules shut down successfully');\n } catch (error) {\n logger.error('Error shutting down modules', { error });\n throw error;\n }\n }\n}\n\nexport const Brizz = new _Brizz();\n","import type { NodeSDK } from '@opentelemetry/sdk-node';\n\nimport type { IBrizzInitializeOptions } from '../index';\n\nimport { logger, DEFAULT_LOG_LEVEL, parseLogLevel, setLogLevel } from './logger';\nimport type { LogLevel } from './logger';\nimport type { IMaskingConfig } from './masking';\n\nexport interface IResolvedBrizzConfig extends Omit<IBrizzInitializeOptions, 'masking'> {\n appName: string;\n baseUrl: string;\n headers: Record<string, string>;\n disableBatch: boolean;\n environment?: string;\n apiKey?: string;\n logLevel: LogLevel;\n nodeSDK?: NodeSDK | null;\n masking?: IMaskingConfig;\n}\n\nexport function resolveConfig(options: IBrizzInitializeOptions): IResolvedBrizzConfig {\n // Resolve log level first so we can set it before other logging\n const envLogLevel = process.env['BRIZZ_LOG_LEVEL'] || options.logLevel?.toString() || DEFAULT_LOG_LEVEL.toString();\n let resolvedLogLevel: LogLevel;\n if (envLogLevel) {\n resolvedLogLevel = parseLogLevel(envLogLevel);\n } else if (typeof options.logLevel === 'string') {\n resolvedLogLevel = parseLogLevel(options.logLevel);\n } else {\n resolvedLogLevel = options.logLevel || DEFAULT_LOG_LEVEL;\n }\n\n setLogLevel(resolvedLogLevel);\n\n // Determine masking status for logging\n let maskingStatus: string;\n if (options.masking === true) {\n maskingStatus = 'enabled';\n } else if (options.masking === false) {\n maskingStatus = 'disabled';\n } else if (typeof options.masking === 'object') {\n maskingStatus = 'custom';\n } else {\n maskingStatus = 'default-disabled';\n }\n\n logger.debug('Starting configuration resolution', {\n appName: options.appName,\n baseUrl: options.baseUrl,\n hasApiKey: !!options.apiKey,\n disableBatch: options.disableBatch,\n logLevel: resolvedLogLevel,\n headersCount: Object.keys(options.headers || {}).length,\n masking: maskingStatus,\n });\n\n // Resolve masking configuration\n let resolvedMasking: IMaskingConfig | undefined;\n if (options.masking === true) {\n // Enable masking with all defaults\n resolvedMasking = {\n spanMasking: {},\n eventMasking: {},\n };\n } else if (options.masking && typeof options.masking === 'object') {\n // Use provided masking config\n resolvedMasking = options.masking;\n }\n // If options.masking is false or undefined, resolvedMasking remains undefined\n\n // Resolve all configuration with environment variables taking precedence\n const resolvedConfig: IResolvedBrizzConfig = {\n ...options,\n appName: process.env['BRIZZ_APP_NAME'] || options.appName || 'unknown-app',\n baseUrl: process.env['BRIZZ_BASE_URL'] || options.baseUrl || 'https://telemetry.brizz.dev',\n headers: { ...options.headers },\n apiKey: process.env['BRIZZ_API_KEY'] || options.apiKey,\n disableBatch: process.env['BRIZZ_DISABLE_BATCH'] === 'true' || !!options.disableBatch,\n environment: process.env['BRIZZ_ENVIRONMENT'] || options.environment,\n logLevel: resolvedLogLevel,\n masking: resolvedMasking,\n };\n // Add Authorization header if API key is present\n if (resolvedConfig.apiKey) {\n resolvedConfig.headers['Authorization'] = `Bearer ${resolvedConfig.apiKey}`;\n }\n\n // Process additional environment variables\n if (process.env['BRIZZ_HEADERS']) {\n try {\n const envHeaders = JSON.parse(process.env['BRIZZ_HEADERS']) as Record<string, string>;\n Object.assign(resolvedConfig.headers, envHeaders);\n logger.debug('Added headers from environment variable', {\n headers: Object.keys(envHeaders),\n });\n } catch (error) {\n logger.error('Failed to parse BRIZZ_HEADERS environment variable', { error });\n throw new Error('Invalid JSON in BRIZZ_HEADERS environment variable');\n }\n }\n\n logger.debug('Configuration resolved with environment variables', {\n appName: resolvedConfig.appName,\n baseUrl: resolvedConfig.baseUrl,\n hasApiKey: !!resolvedConfig.apiKey,\n disableBatch: resolvedConfig.disableBatch,\n envOverrides: {\n hasEnvApiKey: !!process.env['BRIZZ_API_KEY'],\n hasEnvBaseUrl: !!process.env['BRIZZ_BASE_URL'],\n hasEnvBatch: !!process.env['BRIZZ_DISABLE_BATCH'],\n hasEnvHeaders: !!process.env['BRIZZ_HEADERS'],\n },\n });\n\n return resolvedConfig;\n}\n\n// Legacy function for backward compatibility\nexport function processEnvironmentConfig(options: IBrizzInitializeOptions): IResolvedBrizzConfig {\n return resolveConfig(options);\n}\n","import type { Instrumentation } from '@opentelemetry/instrumentation';\nimport { AnthropicInstrumentation } from '@traceloop/instrumentation-anthropic';\nimport { BedrockInstrumentation } from '@traceloop/instrumentation-bedrock';\nimport { ChromaDBInstrumentation } from '@traceloop/instrumentation-chromadb';\nimport { CohereInstrumentation } from '@traceloop/instrumentation-cohere';\nimport { LangChainInstrumentation } from '@traceloop/instrumentation-langchain';\nimport { LlamaIndexInstrumentation } from '@traceloop/instrumentation-llamaindex';\nimport { OpenAIInstrumentation } from '@traceloop/instrumentation-openai';\nimport { PineconeInstrumentation } from '@traceloop/instrumentation-pinecone';\nimport { QdrantInstrumentation } from '@traceloop/instrumentation-qdrant';\nimport { TogetherInstrumentation } from '@traceloop/instrumentation-together';\nimport { VertexAIInstrumentation } from '@traceloop/instrumentation-vertexai';\n\nimport { logger } from '../logger';\n\n/**\n * Module types for manual instrumentation (for Next.js/Webpack compatibility)\n */\nexport interface IInstrumentModules {\n openAI?: unknown;\n anthropic?: unknown;\n cohere?: unknown;\n google_vertexai?: unknown;\n google_aiplatform?: unknown;\n bedrock?: unknown;\n pinecone?: unknown;\n langchain?: {\n chains?: unknown;\n agents?: unknown;\n tools?: unknown;\n };\n llamaindex?: unknown;\n chromadb?: unknown;\n qdrant?: unknown;\n together?: unknown;\n vercelAI?: unknown;\n}\n\ninterface IInstrumentationConfig {\n class: new (config: { exceptionLogger: (error: Error) => void }) => Instrumentation;\n name: string;\n module?: unknown;\n}\n\nexport class InstrumentationRegistry {\n private static instance: InstrumentationRegistry;\n private manualModules: IInstrumentModules | null = null;\n\n public static getInstance(): InstrumentationRegistry {\n if (!InstrumentationRegistry.instance) {\n InstrumentationRegistry.instance = new InstrumentationRegistry();\n }\n return InstrumentationRegistry.instance;\n }\n\n /**\n * Set manual instrumentation modules for Next.js/Webpack environments\n */\n public setManualModules(modules: IInstrumentModules): void {\n this.manualModules = modules;\n logger.info('Manual instrumentation modules configured for Next.js/Webpack compatibility');\n }\n\n /**\n * Helper to load instrumentation with optional manual module\n */\n private loadInstrumentation<T extends Instrumentation>(\n InstrumentationClass: new (config: { exceptionLogger: (error: Error) => void }) => T,\n name: string,\n manualModule?: unknown,\n exceptionLogger?: (error: Error) => void,\n ): T | null {\n try {\n const inst = new InstrumentationClass({\n exceptionLogger:\n exceptionLogger ||\n ((error) => logger.error(`Exception in instrumentation: ${String(error)}`)),\n });\n if (manualModule) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (inst as any).manuallyInstrument(manualModule);\n logger.debug(`Manual instrumentation enabled for ${name}`);\n }\n return inst;\n } catch (error) {\n logger.error(`Failed to load ${name} instrumentation: ${String(error)}`);\n return null;\n }\n }\n\n /**\n * Get manual instrumentations only.\n * Auto-instrumentations are handled at import time.\n */\n public getManualInstrumentations(): Instrumentation[] {\n if (!this.manualModules || Object.keys(this.manualModules).length === 0) {\n logger.debug('No manual instrumentation modules configured');\n return [];\n }\n\n const instrumentations: Instrumentation[] = [];\n const exceptionLogger = (error: Error) => {\n logger.error(`Exception in manual instrumentation: ${String(error)}`);\n };\n\n this.loadManualInstrumentations(instrumentations, exceptionLogger);\n\n logger.info(`Loaded ${instrumentations.length} manual instrumentations`);\n return instrumentations;\n }\n\n /**\n * Load manual instrumentations only (with modules provided by user).\n * @private\n */\n private loadManualInstrumentations(\n instrumentations: Instrumentation[],\n exceptionLogger: (error: Error) => void,\n ): void {\n const instrumentationConfigs: IInstrumentationConfig[] = [\n { class: OpenAIInstrumentation, name: 'OpenAI', module: this.manualModules?.openAI },\n { class: AnthropicInstrumentation, name: 'Anthropic', module: this.manualModules?.anthropic },\n { class: CohereInstrumentation, name: 'Cohere', module: this.manualModules?.cohere },\n {\n class: VertexAIInstrumentation,\n name: 'Vertex AI',\n module: this.manualModules?.google_vertexai,\n },\n { class: BedrockInstrumentation, name: 'Bedrock', module: this.manualModules?.bedrock },\n { class: PineconeInstrumentation, name: 'Pinecone', module: this.manualModules?.pinecone },\n { class: LangChainInstrumentation, name: 'LangChain', module: this.manualModules?.langchain },\n {\n class: LlamaIndexInstrumentation,\n name: 'LlamaIndex',\n module: this.manualModules?.llamaindex,\n },\n { class: ChromaDBInstrumentation, name: 'ChromaDB', module: this.manualModules?.chromadb },\n { class: QdrantInstrumentation, name: 'Qdrant', module: this.manualModules?.qdrant },\n { class: TogetherInstrumentation, name: 'Together', module: this.manualModules?.together },\n ];\n\n // Only load instrumentations that have manual modules configured\n for (const config of instrumentationConfigs) {\n if (config.module) {\n const instrumentation = this.loadInstrumentation(\n config.class,\n config.name,\n config.module,\n exceptionLogger,\n );\n if (instrumentation) {\n instrumentations.push(instrumentation);\n }\n }\n }\n }\n}\n","import type { LogBody } from '@opentelemetry/api-logs';\nimport { SeverityNumber } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n LoggerProvider,\n type LogRecordExporter,\n type LogRecordProcessor,\n} from '@opentelemetry/sdk-logs';\n\nimport type { IResolvedBrizzConfig } from '../config';\nimport { logger } from '../logger';\n\nimport {\n BrizzBatchLogRecordProcessor,\n BrizzSimpleLogRecordProcessor,\n} from './processors/log-processor';\n\nexport class LoggingModule {\n private static instance: LoggingModule | null = null;\n private logExporter: LogRecordExporter | null = null;\n private logProcessor: LogRecordProcessor | null = null;\n private loggerProvider: LoggerProvider | null = null;\n\n static getInstance(): LoggingModule {\n if (!LoggingModule.instance) {\n throw new Error('Brizz must be initialized before accessing LoggingModule');\n }\n return LoggingModule.instance;\n }\n\n /**\n * Initialize the logging module with the provided configuration\n */\n setup(config: IResolvedBrizzConfig): void {\n logger.info('Setting up logging module');\n\n // Initialize exporter\n this.initLogExporter(config);\n\n // Initialize processor with masking support\n this.initLogProcessor(config);\n\n // Initialize logger provider\n this.initLoggerProvider(config);\n\n // Set as module instance for standalone functions\n LoggingModule.instance = this;\n\n logger.info('Logging module setup completed');\n }\n\n /**\n * Initialize the log exporter\n */\n private initLogExporter(config: IResolvedBrizzConfig): void {\n if (this.logExporter) {\n logger.debug('Log exporter already initialized, skipping re-initialization');\n return;\n }\n\n // Use custom log exporter if provided\n if (config.customLogExporter) {\n logger.debug('Using custom log exporter');\n this.logExporter = config.customLogExporter;\n logger.debug('Custom log exporter initialized successfully');\n return;\n }\n\n // Use default OTLP exporter\n const logsUrl = config.baseUrl.replace(/\\/$/, '') + '/v1/logs';\n logger.debug('Initializing default OTLP log exporter', { url: logsUrl });\n\n const headers = { ...config.headers };\n\n this.logExporter = new OTLPLogExporter({\n url: logsUrl,\n headers,\n });\n\n logger.debug('OTLP log exporter initialized successfully');\n }\n\n /**\n * Initialize the log processor with masking support\n */\n private initLogProcessor(config: IResolvedBrizzConfig): void {\n if (this.logProcessor) {\n logger.debug('Log processor already initialized, skipping re-initialization');\n return;\n }\n\n if (!this.logExporter) {\n throw new Error('Log exporter must be initialized before processor');\n }\n\n logger.debug('Initializing log processor', {\n disableBatch: config.disableBatch,\n hasMasking: !!config.masking?.eventMasking,\n });\n\n this.logProcessor = config.disableBatch\n ? new BrizzSimpleLogRecordProcessor(this.logExporter, config)\n : new BrizzBatchLogRecordProcessor(this.logExporter, config);\n\n logger.debug('Log processor initialized successfully');\n }\n\n /**\n * Initialize the logger provider\n */\n private initLoggerProvider(config: IResolvedBrizzConfig): void {\n if (this.loggerProvider) {\n logger.debug('Logger provider already initialized, skipping re-initialization');\n return;\n }\n\n if (!this.logProcessor) {\n throw new Error('Log processor must be initialized before logger provider');\n }\n\n logger.debug('Creating resource with service name', {\n serviceName: config.appName,\n });\n\n const resourceAttributes: Record<string, string> = {\n 'service.name': config.appName,\n };\n\n // Add environment attribute if specified\n if (config.environment) {\n resourceAttributes['deployment.environment'] = config.environment;\n }\n\n const resource = resourceFromAttributes(resourceAttributes);\n\n logger.debug('Creating logger provider with resource');\n this.loggerProvider = new LoggerProvider({\n resource,\n processors: [this.logProcessor],\n });\n\n logger.debug('Logger provider initialization completed');\n }\n\n /**\n * Emit a custom event to the telemetry pipeline\n */\n emitEvent(\n name: string,\n attributes?: Record<string, string | number | boolean>,\n body?: LogBody,\n severityNumber: SeverityNumber = SeverityNumber.INFO,\n ): void {\n logger.debug('Attempting to emit event', {\n name,\n hasAttributes: !!attributes,\n attributesCount: attributes ? Object.keys(attributes).length : 0,\n hasBody: !!body,\n severityNumber,\n });\n\n if (!this.loggerProvider) {\n logger.error('Cannot emit event: Logger provider not initialized');\n throw new Error('Logging module not initialized');\n }\n\n // Prepare log attributes with event name as required field\n const logAttributes: Record<string, string | number | boolean> = { 'event.name': name };\n if (attributes) {\n Object.assign(logAttributes, attributes);\n logger.debug('Combined log attributes', { attributes: Object.keys(logAttributes) });\n }\n\n // Get logger instance for event emission\n logger.debug('Getting logger instance for brizz_events');\n const eventLogger = this.loggerProvider.getLogger('brizz.events');\n\n // Emit the event\n logger.debug('Emitting log record with eventName', { eventName: name });\n try {\n eventLogger.emit({\n eventName: name,\n attributes: logAttributes,\n severityNumber: severityNumber,\n body: body,\n });\n logger.debug('Event successfully emitted', { eventName: name });\n } catch (error) {\n // Log detailed error information for debugging\n logger.error(`Failed to emit event '${name}'`, { error, eventName: name });\n logger.error('Log record that failed', {\n eventName: name,\n hasAttributes: logAttributes,\n severityNumber: severityNumber,\n hasBody: body,\n });\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n\n /**\n * Check if the module is initialized\n */\n isInitialized(): boolean {\n return this.loggerProvider !== null;\n }\n\n /**\n * Get the logger provider\n */\n getLoggerProvider(): LoggerProvider | null {\n return this.loggerProvider;\n }\n\n /**\n * Shutdown the logging module\n */\n async shutdown(): Promise<void> {\n logger.debug('Shutting down logging module');\n\n if (this.loggerProvider) {\n await this.loggerProvider.shutdown();\n this.loggerProvider = null;\n }\n\n this.logProcessor = null;\n this.logExporter = null;\n\n // Clear module instance\n if (LoggingModule.instance === this) {\n LoggingModule.instance = null;\n }\n\n logger.debug('Logging module shutdown completed');\n }\n}\n\n/**\n * Emit a custom event to the telemetry pipeline.\n * @throws {Error} - If SDK is not initialized\n */\nexport function emitEvent(\n name: string,\n attributes?: Record<string, string | number | boolean>,\n body?: LogBody,\n severityNumber: SeverityNumber = SeverityNumber.INFO,\n): void {\n return LoggingModule.getInstance().emitEvent(name, attributes, body, severityNumber);\n}\n","import { context } from '@opentelemetry/api';\nimport type { AnyValue, LogAttributes } from '@opentelemetry/api-logs';\nimport type { LogRecordExporter, SdkLogRecord } from '@opentelemetry/sdk-logs';\nimport { BatchLogRecordProcessor, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';\n\nimport type { IResolvedBrizzConfig } from '../../config';\nimport { logger } from '../../logger';\nimport { DEFAULT_PII_PATTERNS } from '../../masking/patterns';\nimport type { IAttributesMaskingRule, ILogMaskingConfig, MaskableValue } from '../../masking/types';\nimport { maskAttributes, maskValue } from '../../masking/utils';\nimport { BRIZZ, PROPERTIES_CONTEXT_KEY } from '../../semantic-conventions';\n\nexport const DEFAULT_LOG_MASKING_RULES: IAttributesMaskingRule[] = [\n {\n mode: 'partial',\n attributePattern: 'event.name',\n patterns: DEFAULT_PII_PATTERNS,\n },\n];\n\nexport class BrizzSimpleLogRecordProcessor extends SimpleLogRecordProcessor {\n public readonly config: IResolvedBrizzConfig;\n\n constructor(exporter: LogRecordExporter, config: IResolvedBrizzConfig) {\n super(exporter);\n this.config = config;\n }\n\n override onEmit(logRecord: SdkLogRecord): void {\n const maskingConfig = this.config.masking?.eventMasking;\n if (maskingConfig) {\n maskLog(logRecord, maskingConfig);\n }\n const associationProperties = context.active().getValue(PROPERTIES_CONTEXT_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n logRecord.setAttribute(`${BRIZZ}.${key}`, value as AnyValue);\n }\n }\n super.onEmit(logRecord);\n }\n}\n\nexport class BrizzBatchLogRecordProcessor extends BatchLogRecordProcessor {\n public readonly config: IResolvedBrizzConfig;\n\n constructor(exporter: LogRecordExporter, config: IResolvedBrizzConfig) {\n super(exporter);\n this.config = config;\n }\n\n override onEmit(logRecord: SdkLogRecord): void {\n const maskingConfig = this.config.masking?.eventMasking;\n if (maskingConfig) {\n maskLog(logRecord, maskingConfig);\n }\n const associationProperties = context.active().getValue(PROPERTIES_CONTEXT_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n logRecord.setAttribute(`${BRIZZ}.${key}`, value as AnyValue);\n }\n }\n super.onEmit(logRecord);\n }\n}\n\nexport function maskLog(logRecord: SdkLogRecord, config: ILogMaskingConfig): SdkLogRecord {\n if (!logRecord.attributes) {\n return logRecord;\n }\n\n let rules = config.rules || [];\n if (!config.disableDefaultRules) {\n rules = [...DEFAULT_LOG_MASKING_RULES, ...rules];\n }\n\n try {\n if (logRecord.attributes && Object.keys(logRecord.attributes).length > 0) {\n const attributesRecord: Record<string, MaskableValue> = {};\n\n for (const [key, value] of Object.entries(logRecord.attributes)) {\n attributesRecord[key] = value as MaskableValue;\n }\n\n const maskedAttributes = maskAttributes(attributesRecord, rules);\n if (maskedAttributes) {\n // Clear existing attributes and set masked ones\n const newAttributes: LogAttributes = {};\n for (const [key, value] of Object.entries(maskedAttributes)) {\n newAttributes[key] = value as AnyValue;\n }\n logRecord.setAttributes(newAttributes);\n }\n }\n\n if (config.maskBody && logRecord.body !== undefined && logRecord.body !== null) {\n let maskedBody: unknown = logRecord.body;\n for (const rule of rules) {\n maskedBody = maskValue(maskedBody, rule);\n }\n logRecord.setBody(maskedBody as AnyValue);\n }\n\n return logRecord;\n } catch (error) {\n logger.error('Error masking log record:', error);\n return logRecord;\n }\n}\n","/**\n * Default PII patterns for data masking.\n *\n * This module contains 100+ built-in patterns for detecting and masking\n * common types of personally identifiable information (PII) and sensitive data.\n * Patterns are organized by category and mirror the Python SDK implementation.\n */\n\nimport type { IPatternEntry } from './types';\n\n/**\n * All built-in PII patterns combined - mirrors Python SDK patterns.py\n */\nexport const DEFAULT_PII_PATTERNS: IPatternEntry[] = [\n // Email addresses\n {\n name: 'email_addresses',\n pattern: String.raw`\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b`,\n },\n // Phone numbers (US format)\n {\n name: 'us_phone_numbers',\n pattern: String.raw`(?:^|[\\s])(?:\\+?1[-.\\s]*)?(?:\\([0-9]{3}\\)\\s?[0-9]{3}[-.\\s]?[0-9]{4}|[0-9]{3}[-.\\s]?[0-9]{3}[-.\\s]?[0-9]{4}|[0-9]{10})(?=[\\s]|$)`,\n },\n // Social Security Numbers\n {\n name: 'ssn',\n pattern: String.raw`\\b(?!000|666|9\\d{2})\\d{3}[-\\s]?(?!00)\\d{2}[-\\s]?(?!0000)\\d{4}\\b`,\n },\n // Credit card numbers\n {\n name: 'credit_cards',\n pattern: String.raw`\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\\\\d{3})\\\\d{11})\\b`,\n },\n {\n name: 'credit_cards_with_separators',\n pattern: String.raw`\\b(?:4\\\\d{3}|5[1-5]\\\\d{2}|3[47]\\\\d{2})[-\\s]?\\\\d{4}[-\\s]?\\\\d{4}[-\\s]?\\\\d{4}\\b`,\n },\n // IP addresses (IPv4)\n {\n name: 'ipv4_addresses',\n pattern: String.raw`\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?!\\.[0-9])\\b`,\n },\n // API keys/tokens\n {\n name: 'generic_api_keys',\n pattern: String.raw`\\b(?:[Aa][Pp][Ii][_-]?[Kk][Ee][Yy]|[Tt][Oo][Kk][Ee][Nn]|[Ss][Ee][Cc][Rr][Ee][Tt])[_-]?[=:]?\\s*[\"']?(?:[a-zA-Z0-9\\-_.]{20,})[\"']?\\b`,\n },\n {\n name: 'openai_keys',\n pattern: String.raw`\\bsk[-_][a-zA-Z0-9]{20,}\\b`,\n },\n {\n name: 'base64_secrets',\n pattern: String.raw`\\b[A-Za-z0-9+/]{64,}={0,2}\\b`,\n },\n // AWS Keys\n {\n name: 'aws_access_keys',\n pattern: String.raw`\\b(?:AKIA|ABIA|ACCA|ASIA)[0-9A-Z]{16}\\b`,\n },\n {\n name: 'aws_secret_keys',\n pattern: String.raw`\\b[A-Za-z0-9/+=]*[A-Z][A-Za-z0-9/+=]*[a-z][A-Za-z0-9/+=]*[/+=][A-Za-z0-9/+=]{30,}\\b`,\n },\n // GitHub tokens\n {\n name: 'github_tokens',\n pattern: String.raw`\\bghp_[a-zA-Z0-9]{36}\\b`,\n },\n // Slack tokens\n {\n name: 'slack_tokens',\n pattern: String.raw`\\bxox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24,34}\\b`,\n },\n // Stripe keys\n {\n name: 'stripe_keys',\n pattern: String.raw`\\b(?:sk|pk)_(?:test|live)_[a-zA-Z0-9]{24,}\\b`,\n },\n // JWT tokens\n {\n name: 'jwt_tokens',\n pattern: String.raw`\\beyJ[A-Za-z0-9_-]{2,}\\\\.[A-Za-z0-9_-]{2,}\\\\.[A-Za-z0-9_-]{2,}\\b`,\n },\n // MAC addresses\n {\n name: 'mac_addresses',\n pattern: String.raw`\\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\\b`,\n },\n // IPv6 addresses\n {\n name: 'ipv6_addresses',\n pattern: String.raw`\\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\b`,\n },\n // Medical records\n {\n name: 'medical_record_numbers',\n pattern: String.raw`\\b(?:[Mm][Rr][Nn])[-\\s]?\\d{6,10}\\b`,\n },\n // Bitcoin addresses\n {\n name: 'bitcoin_addresses',\n pattern: String.raw`\\b[13][a-km-zA-HJ-NP-Z1-9]{25,34}\\b`,\n },\n // Ethereum addresses\n {\n name: 'ethereum_addresses',\n pattern: String.raw`\\b0x[a-fA-F0-9]{40}(?![a-fA-F0-9])\\b`,\n },\n // UUIDs\n {\n name: 'uuids',\n pattern: String.raw`\\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(?![0-9a-fA-F-])\\b`,\n },\n // Database connection strings\n {\n name: 'database_connections',\n pattern: String.raw`\\b(?:[Mm][Oo][Nn][Gg][Oo][Dd][Bb]|[Pp][Oo][Ss][Tt][Gg][Rr][Ee][Ss]|[Mm][Yy][Ss][Qq][Ll]|[Rr][Ee][Dd][Ii][Ss]|[Mm][Ss][Ss][Qq][Ll]|[Oo][Rr][Aa][Cc][Ll][Ee]):\\\\/\\\\/[^\\\\s]+\\b`,\n },\n // Private keys\n {\n name: 'rsa_private_keys',\n pattern: '-----BEGIN (?:RSA )?PRIVATE KEY-----',\n },\n {\n name: 'pgp_private_keys',\n pattern: '-----BEGIN PGP PRIVATE KEY BLOCK-----',\n },\n {\n name: 'certificates',\n pattern: '-----BEGIN CERTIFICATE-----',\n },\n // Date of birth patterns\n {\n name: 'date_of_birth_us',\n pattern: String.raw`\\b(?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12]\\\\d|3[01])[-/](?:19|20)\\\\d{2}\\b`,\n },\n {\n name: 'date_of_birth_iso',\n pattern: String.raw`\\b(?:19|20)\\\\d{2}[-/](?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12]\\\\d|3[01])\\b`,\n },\n // US Identification Numbers\n {\n name: 'us_passport_numbers',\n pattern: String.raw`\\b[A-Z]?\\\\d{6,9}\\b`,\n },\n {\n name: 'drivers_license',\n pattern: String.raw`\\b[A-Z]{1,2}\\\\d{3,8}[-\\s]?\\\\d{2,5}[-\\s]?\\\\d{2,5}[-\\s]?\\\\d{1,5}[-\\s]?\\\\d?\\b`,\n },\n {\n name: 'bank_account_numbers',\n pattern: String.raw`\\b\\\\d{10,17}\\b`,\n },\n {\n name: 'aba_routing_numbers',\n pattern: String.raw`\\b((0[0-9])|(1[0-2])|(2[1-9])|(3[0-2])|(6[1-9])|(7[0-2])|80)([0-9]{7})\\b`,\n },\n {\n name: 'health_insurance_numbers',\n pattern: String.raw`\\b\\\\d{10}[A-Z]\\b`,\n },\n {\n name: 'employee_ids',\n pattern: String.raw`\\b(?:[Ee][Mm][Pp]|[Ee][Mm][Pp][Ll][Oo][Yy][Ee][Ee]|[Ee])[-\\s]?\\\\d{5,8}\\b`,\n },\n {\n name: 'tax_ein',\n pattern: String.raw`\\b\\\\d{2}-\\\\d{7}\\b`,\n },\n {\n name: 'medicare_beneficiary_id',\n pattern: String.raw`\\b[1-9][A-Z][A-Z0-9]\\\\d-[A-Z][A-Z0-9]\\\\d-[A-Z][A-Z0-9]\\\\d{2}\\b`,\n },\n {\n name: 'national_provider_id',\n pattern: String.raw`\\b1\\\\d{9}\\b`,\n },\n {\n name: 'dea_numbers',\n pattern: String.raw`\\b[A-Z]{2}\\\\d{7}\\b`,\n },\n {\n name: 'itin',\n pattern: String.raw`\\b9\\\\d{2}(?:[ \\\\-]?)[7,8]\\\\d(?:[ \\\\-]?)\\\\d{4}\\b`,\n },\n // Vehicle and Location\n {\n name: 'vin_numbers',\n pattern: String.raw`\\b[A-HJ-NPR-Z0-9]{17}\\b`,\n },\n {\n name: 'coordinates',\n pattern: String.raw`\\b[-+]?(?:[0-8]?\\\\d(?:\\\\.\\\\d+)?|90(?:\\\\.0+)?),\\\\s*[-+]?(?:1[0-7]\\\\d(?:\\\\.\\\\d+)?|180(?:\\\\.0+)?|[0-9]?\\\\d(?:\\\\.\\\\d+)?)\\b`,\n },\n {\n name: 'us_license_plates',\n pattern: String.raw`\\b[A-Z]{1,3}[-\\s]\\\\d{1,4}[A-Z]?\\b|\\b\\\\d{1,2}[A-Z]{1,3}\\\\d{1,4}\\b`,\n },\n {\n name: 'us_zip_codes',\n pattern: String.raw`\\b(\\\\d{5}-\\\\d{4}|\\\\d{5})\\b`,\n },\n {\n name: 'us_street_addresses',\n pattern: String.raw`\\b\\\\d{1,8}\\b[\\\\s\\\\S]{10,100}?\\b(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)\\b\\\\s\\\\d{5}\\b`,\n },\n // International Banking\n {\n name: 'iban',\n pattern: String.raw`\\b[A-Z]{2}\\d{2}[A-Z0-9]{4}\\d{7}([A-Z0-9]?){0,16}\\b`,\n },\n {\n name: 'swift_bic',\n pattern: String.raw`\\b[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?\\b`,\n },\n // Additional API Keys and Tokens\n {\n name: 'google_oauth',\n pattern: String.raw`\\bya29\\\\.[a-zA-Z0-9_-]{60,}\\b`,\n },\n {\n name: 'firebase_tokens',\n pattern: String.raw`\\bAAAA[A-Za-z0-9_-]{100,}\\b`,\n },\n {\n name: 'google_app_ids',\n pattern: String.raw`\\b[0-9]+-\\w+\\.apps\\.googleusercontent\\.com\\b`,\n },\n {\n name: 'facebook_secrets',\n pattern: String.raw`\\b(facebook_secret|FACEBOOK_SECRET|facebook_app_secret|FACEBOOK_APP_SECRET)[a-z_ =\\\\s\"'\\\\:]{0,5}[^a-zA-Z0-9][a-f0-9]{32}[^a-zA-Z0-9]`,\n },\n {\n name: 'github_keys',\n pattern: String.raw`\\b(GITHUB_SECRET|GITHUB_KEY|github_secret|github_key|github_token|GITHUB_TOKEN|github_api_key|GITHUB_API_KEY)[a-z_ =\\\\s\\\"'\\\\:]{0,10}[^a-zA-Z0-9][a-zA-Z0-9]{40}[^a-zA-Z0-9]`,\n },\n {\n name: 'heroku_keys',\n pattern: String.raw`\\b(heroku_api_key|HEROKU_API_KEY|heroku_secret|HEROKU_SECRET)[a-z_ =\\\\s\\\"'\\\\:]{0,10}[^a-zA-Z0-9-]\\\\w{8}(?:-\\\\w{4}){3}-\\\\w{12}[^a-zA-Z0-9\\\\-]`,\n },\n {\n name: 'slack_api_keys',\n pattern: String.raw`\\b(slack_api_key|SLACK_API_KEY|slack_key|SLACK_KEY)[a-z_ =\\\\s\\\"'\\\\:]{0,10}[^a-f0-9][a-f0-9]{32}[^a-f0-9]`,\n },\n {\n name: 'slack_api_tokens',\n pattern: String.raw`\\b(xox[pb](?:-[a-zA-Z0-9]+){4,})\\b`,\n },\n // Extended Private Keys and Certificates\n {\n name: 'dsa_private_keys',\n pattern: String.raw`-----BEGIN DSA PRIVATE KEY-----(?:[a-zA-Z0-9\\+\\=\\/\"']|\\s)+?-----END DSA PRIVATE KEY-----`,\n },\n {\n name: 'ec_private_keys',\n pattern: String.raw`-----BEGIN (?:EC|ECDSA) PRIVATE KEY-----(?:[a-zA-Z0-9\\+\\=\\/\"']|\\s)+?-----END (?:EC|ECDSA) PRIVATE KEY-----`,\n },\n {\n name: 'encrypted_private_keys',\n pattern: String.raw`-----BEGIN ENCRYPTED PRIVATE KEY-----(?:.|\\s)+?-----END ENCRYPTED PRIVATE KEY-----`,\n },\n {\n name: 'ssl_certificates',\n pattern: String.raw`-----BEGIN CERTIFICATE-----(?:.|\\n)+?\\s-----END CERTIFICATE-----`,\n },\n {\n name: 'ssh_dss_public',\n pattern: String.raw`\\bssh-dss [0-9A-Za-z+/]+[=]{2}\\b`,\n },\n {\n name: 'ssh_rsa_public',\n pattern: String.raw`\\bssh-rsa AAAA[0-9A-Za-z+/]+[=]{0,3} [^@]+@[^@]+\\b`,\n },\n {\n name: 'putty_ssh_keys',\n pattern: String.raw`PuTTY-User-Key-File-2: ssh-(?:rsa|dss)\\s*Encryption: none(?:.|\\s?)*?Private-MAC:`,\n },\n // International Phone Numbers\n {\n name: 'france_phone_numbers',\n pattern: String.raw`\\b([0O]?[1lI][1lI])?[3E][3E][0O]?[\\\\dOIlZEASB]{9}\\b`,\n },\n {\n name: 'german_phone_numbers',\n pattern: String.raw`\\b[\\d\\w]\\d{2}[\\d\\w]{6}\\d[\\d\\w]\\b`,\n },\n {\n name: 'uk_phone_numbers',\n pattern: String.raw`\\b([0O]?[1lI][1lI])?[4A][4A][\\\\dOIlZEASB]{10,11}\\b`,\n },\n // International IDs\n {\n name: 'uk_drivers_license',\n pattern: String.raw`\\b[A-Z]{5}\\d{6}[A-Z]{2}\\d{1}[A-Z]{2}\\b`,\n },\n {\n name: 'uk_passport',\n pattern: String.raw`\\b\\\\d{10}GB[RP]\\\\d{7}[UMF]{1}\\\\d{9}\\b`,\n },\n {\n name: 'argentina_dni',\n pattern: String.raw`\\b\\\\d{2}\\\\.\\\\d{3}\\\\.\\\\d{3}\\b`,\n },\n {\n name: 'australia_tfn',\n pattern: String.raw`\\b[Tt][Ff][Nn](:|:\\\\s|\\\\s|)(\\\\d{8,9})\\b`,\n },\n {\n name: 'canada_passport',\n pattern: String.raw`\\b[\\\\w]{2}[\\\\d]{6}\\b`,\n },\n {\n name: 'croatia_vat',\n pattern: String.raw`\\bHR\\\\d{11}\\b`,\n },\n {\n name: 'czech_vat',\n pattern: String.raw`\\bCZ\\\\d{8,10}\\b`,\n },\n {\n name: 'denmark_personal_id',\n pattern: String.raw`\\b(?:\\\\d{10}|\\\\d{6}[-\\\\s]\\\\d{4})\\b`,\n },\n {\n name: 'france_national_id',\n pattern: String.raw`\\b\\\\d{12}\\b`,\n },\n {\n name: 'france_ssn',\n pattern: String.raw`\\b(?:\\\\d{13}|\\\\d{13}\\\\s\\\\d{2})\\b`,\n },\n {\n name: 'france_passport',\n pattern: String.raw`\\b\\\\d{2}11\\\\d{5}\\b`,\n },\n {\n name: 'california_drivers_license',\n pattern: String.raw`\\b[A-Z]{1}\\\\d{7}\\b`,\n },\n // Medical and Healthcare\n {\n name: 'hipaa_ndc',\n pattern: String.raw`\\b\\\\d{4,5}-\\\\d{3,4}-\\\\d{1,2}\\b`,\n },\n // Security and Network\n {\n name: 'cve_numbers',\n pattern: String.raw`\\b[Cc][Vv][Ee]-\\\\d{4}-\\\\d{4,7}\\b`,\n },\n {\n name: 'microsoft_oauth',\n pattern: String.raw`https://login\\.microsoftonline\\.com/common/oauth2/v2\\.0/token|https://login\\.windows\\.net/common/oauth2/token`,\n },\n {\n name: 'postgres_connections',\n pattern: String.raw`\\b(?:[Pp][Oo][Ss][Tt][Gg][Rr][Ee][Ss]|[Pp][Gg][Ss][Qq][Ll])\\\\:\\\\/\\\\/`,\n },\n {\n name: 'box_links',\n pattern: String.raw`https://app\\.box\\.com/[s|l]/\\S+`,\n },\n {\n name: 'dropbox_links',\n pattern: String.raw`https://www\\.dropbox\\.com/(?:s|l)/\\S+`,\n },\n // Credit Card Variants\n {\n name: 'amex_cards',\n pattern: String.raw`\\b3[47][0-9]{13}\\b`,\n },\n {\n name: 'visa_cards',\n pattern: String.raw`\\b4[0-9]{12}(?:[0-9]{3})?\\b`,\n },\n {\n name: 'discover_cards',\n pattern: String.raw`\\b65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}\\b`,\n },\n {\n name: 'enhanced_credit_cards',\n pattern: String.raw`\\b((4\\\\d{3}|5[1-5]\\\\d{2}|2\\\\d{3}|3[47]\\\\d{1,2})[\\\\s\\\\-]?\\\\d{4,6}[\\\\s\\\\-]?\\\\d{4,6}?([\\\\s\\\\-]\\\\d{3,4})?(\\\\d{3})?)\\b`,\n },\n // Bank Routing Numbers (US specific)\n {\n name: 'bbva_routing_ca',\n pattern: String.raw`\\\\b321170538\\\\b`,\n },\n {\n name: 'boa_routing_ca',\n pattern: String.raw`\\\\b(?:121|026)00(?:0|9)(?:358|593)\\\\b`,\n },\n {\n name: 'chase_routing_ca',\n pattern: String.raw`\\\\b322271627\\\\b`,\n },\n {\n name: 'citibank_routing_ca',\n pattern: String.raw`\\\\b32(?:11|22)71(?:18|72)4\\\\b`,\n },\n {\n name: 'usbank_routing_ca',\n pattern: String.raw`\\\\b12(?:1122676|2235821)\\\\b`,\n },\n {\n name: 'united_bank_routing_ca',\n pattern: String.raw`\\\\b122243350\\\\b`,\n },\n {\n name: 'wells_fargo_routing_ca',\n pattern: String.raw`\\\\b121042882\\\\b`,\n },\n // Unrealistic alphanumeric identifiers\n {\n name: 'generic_non_usual',\n pattern: String.raw`(?:^|\\s)(?=[A-Za-z0-9_\\)\\*\\=@]*[A-Za-z])(?=[A-Za-z0-9_\\)\\*\\=@]*[0-9])([A-Za-z0-9_\\)\\*\\=@]{5,})(?=\\s|$)`,\n },\n];\n","/**\n * Masking utilities for pattern compilation and value masking.\n *\n * This module provides the core functionality for detecting and masking PII\n * in various data types. It implements the same logic as the Python SDK\n * with optimized regex compilation and efficient masking operations.\n */\n\nimport { logger } from '../logger';\n\nimport type {\n IAttributesMaskingRule,\n IEventMaskingRule,\n IPatternBasedMaskingRule,\n IPatternEntry,\n} from './types';\n\nfunction isValidPatternName(name: string): boolean {\n return /^[a-zA-Z0-9_]+$/.test(name);\n}\n\n/**\n * Detects potentially dangerous ReDoS patterns\n */\nfunction isLikelyReDoSPattern(pattern: string): boolean {\n const dangerousPatterns = [\n // Nested quantifiers like (a+)+, (a*)+, (a+)*\n /\\([^)]*[+*]\\)[+*]/,\n // Alternation with overlapping groups like (a|a)*\n /\\([^)]*\\|[^)]*\\)[+*]/,\n // Complex backtracking patterns - but more specific\n /\\([^)]*[+*][^)]*[+*][^)]*\\)[+*]/,\n ];\n\n return dangerousPatterns.some((dangerous) => dangerous.test(pattern));\n}\n\nfunction getGroupedPattern(patternEntry: IPatternEntry): string {\n let name = patternEntry.name;\n if (!name || name === '') {\n name = `pattern_${Math.random().toString(16).slice(2)}`;\n }\n if (!isValidPatternName(name)) {\n throw new Error(\n `Pattern name '${name}' must only contain alphanumeric characters and underscores`,\n );\n }\n\n // Check for potentially dangerous ReDoS patterns\n if (isLikelyReDoSPattern(patternEntry.pattern)) {\n throw new Error(`Potentially dangerous ReDoS pattern detected: '${patternEntry.pattern}'`);\n }\n\n // Validate the pattern by attempting to create a RegExp\n try {\n new RegExp(patternEntry.pattern);\n } catch (error) {\n throw new Error(`Invalid regex pattern '${patternEntry.pattern}': ${String(error)}`);\n }\n\n return `(?<${name}>${patternEntry.pattern})`;\n}\n\nfunction isIPatternEntry(obj: unknown): obj is IPatternEntry {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n typeof (obj as IPatternEntry).pattern === 'string' &&\n ((obj as IPatternEntry).name === undefined || typeof (obj as IPatternEntry).name === 'string')\n );\n}\n\nfunction isIEventMaskingRule(obj: unknown): obj is IEventMaskingRule {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n typeof (obj as IEventMaskingRule).mode === 'string' &&\n Array.isArray((obj as IEventMaskingRule).patterns) &&\n (obj as IEventMaskingRule).patterns.every(\n (p: unknown) => isIPatternEntry(p) || typeof p === 'string',\n ) &&\n ((obj as IEventMaskingRule).attributePattern === undefined ||\n typeof (obj as IEventMaskingRule).attributePattern === 'string')\n );\n}\n\nfunction convertPatternsToPatternEntries(\n patterns: readonly (IPatternEntry | string)[],\n): IPatternEntry[] {\n const patternEntries: IPatternEntry[] = [];\n for (const pattern of patterns) {\n if (typeof pattern === 'string') {\n // Convert string to PatternEntry with empty name\n patternEntries.push({ pattern, name: '' });\n } else if (isIPatternEntry(pattern)) {\n // Already a PatternEntry, use as is\n patternEntries.push(pattern);\n } else {\n throw new Error('Patterns must be either strings or PatternEntry instances');\n }\n }\n return patternEntries;\n}\n\n/**\n * Compile a list of pattern entries into a single regex pattern.\n * Matches Python's _compile_pattern_entries function.\n */\nfunction compilePatternEntries(patternEntries: readonly IPatternEntry[]): RegExp | null {\n const patternGroups: string[] = [];\n for (const patternEntry of patternEntries) {\n try {\n patternGroups.push(getGroupedPattern(patternEntry));\n } catch (error) {\n logger.warn(`Invalid pattern '${patternEntry.name}': ${patternEntry.pattern}`, error);\n continue; // Skip invalid patterns\n }\n }\n\n if (patternGroups.length === 0) {\n return null; // No valid patterns\n }\n\n try {\n return new RegExp(patternGroups.join('|'));\n } catch (error) {\n logger.warn('Failed to compile pattern entries into regex', error);\n return null;\n }\n}\n\nfunction getCompiledAttributeNamePattern(rule: IAttributesMaskingRule): RegExp {\n if (!rule.attributePattern) {\n logger.debug('No attribute pattern provided, using default .*');\n return /.*/; // Default to match all attributes\n }\n let compiledPatternString = rule.attributePattern;\n if (isIEventMaskingRule(rule) && rule.eventNamePattern) {\n // If this is an event masking rule, append the event name pattern if it exists\n compiledPatternString = `(${compiledPatternString})|(${rule.eventNamePattern})`;\n }\n return new RegExp(compiledPatternString);\n}\n\n/**\n * Check if regex execution should continue based on timeout and iteration limits\n */\nfunction shouldContinueExecution(\n startTime: number,\n iterations: number,\n timeoutMs: number,\n): boolean {\n if (Date.now() - startTime > timeoutMs) {\n logger.warn('Regex execution timed out - potential ReDoS pattern detected');\n return false;\n }\n\n const maxIterations = 1000;\n if (iterations > maxIterations) {\n logger.warn('Regex execution exceeded maximum iterations - potential ReDoS pattern detected');\n return false;\n }\n\n return true;\n}\n\n/**\n * Create a global version of the regex pattern\n */\nfunction createGlobalPattern(pattern: RegExp): RegExp {\n return new RegExp(\n pattern.source,\n pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g',\n );\n}\n\n/**\n * Executes regex with timeout protection to prevent ReDoS attacks\n */\nfunction executeRegexWithTimeout(\n pattern: RegExp,\n value: string,\n timeoutMs: number = 100,\n): RegExpExecArray[] {\n const matches: RegExpExecArray[] = [];\n const globalPattern = createGlobalPattern(pattern);\n const startTime = Date.now();\n let match: RegExpExecArray | null;\n let iterations = 0;\n\n while ((match = globalPattern.exec(value)) !== null) {\n if (!shouldContinueExecution(startTime, ++iterations, timeoutMs)) {\n break;\n }\n\n matches.push(match);\n\n if (match[0].length === 0) {\n globalPattern.lastIndex = match.index + 1;\n }\n }\n\n return matches;\n}\n\n/**\n * Masks a string value based on the pattern, matching Python implementation.\n */\nexport function maskStringByPattern(\n value: string,\n pattern: RegExp,\n mode: 'partial' | 'full' = 'full',\n): string {\n // Use timeout-protected regex execution to prevent ReDoS\n const matches: Array<{\n start: number;\n end: number;\n text: string;\n groups: RegExpExecArray['groups'];\n }> = [];\n\n try {\n const regexMatches = executeRegexWithTimeout(pattern, value);\n\n for (const match of regexMatches) {\n matches.push({\n start: match.index,\n end: match.index + match[0].length,\n text: match[0],\n groups: match.groups,\n });\n }\n } catch (error) {\n logger.warn('Regex execution failed, skipping masking', error);\n return value;\n }\n\n // Process matches in reverse order to maintain correct indices\n for (const matchInfo of matches.toReversed()) {\n let patternName = 'unknown';\n if (matchInfo.groups) {\n // Find the first defined group name\n for (const [groupName, groupValue] of Object.entries(matchInfo.groups)) {\n if (groupValue !== undefined) {\n // Remove any counter suffix for logging (matches Python's logic)\n if (groupName.includes('_') && /\\d$/.test(groupName)) {\n const parts = groupName.split('_');\n patternName = parts[0] || groupName;\n } else {\n patternName = groupName;\n }\n break;\n }\n }\n }\n\n logger.info(`Masking detected: pattern '${patternName}' found match in value`);\n\n // Apply masking based on mode\n const masked = mode === 'partial' ? matchInfo.text[0] + '*****' : '*****';\n\n // Replace the matched portion\n value = value.slice(0, matchInfo.start) + masked + value.slice(matchInfo.end);\n }\n\n return value;\n}\n\n/**\n * Masks a string value based on the rule, matching Python implementation.\n */\nexport function maskStringByPatternBasedRule(\n value: string,\n rule: IPatternBasedMaskingRule,\n): string {\n const patternEntries = convertPatternsToPatternEntries(rule.patterns);\n if (patternEntries.length === 0) {\n logger.warn('No patterns provided for masking rule, returning original value');\n return value; // No patterns means no masking\n }\n const mode = rule.mode;\n if (!patternEntries || patternEntries.length === 0) {\n // No patterns means mask entire value\n return mode === 'partial' && value ? value[0] + '*****' : '*****';\n }\n\n // Create the mega pattern\n const compiledPatterns = compilePatternEntries(patternEntries);\n if (!compiledPatterns) {\n return value;\n }\n\n return maskStringByPattern(value, compiledPatterns, mode);\n}\n\n/**\n * Masks a value based on the rule, matching Python implementation.\n */\nexport function maskValue(value: unknown, rule: IPatternBasedMaskingRule): unknown {\n if (typeof value === 'string') {\n return maskStringByPatternBasedRule(value, rule);\n } else if (typeof value === 'boolean' || typeof value === 'number') {\n return maskStringByPatternBasedRule(String(value), rule);\n } else if (Array.isArray(value)) {\n return value.map((v) => maskStringByPatternBasedRule(String(v), rule));\n } else if (value !== null && typeof value === 'object') {\n // If the value is a dictionary, mask each value recursively\n const result: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n result[k] = maskValue(v, rule);\n }\n return result;\n } else {\n throw new Error(`Unsupported value type for masking: ${typeof value}`);\n }\n}\n\n/**\n * Masks sensitive data in attributes based on masking rules, matching Python implementation.\n */\nexport function maskAttributes(\n attributes: Record<string, unknown>,\n rules: readonly IAttributesMaskingRule[],\n outputOriginalValue = false,\n): Record<string, unknown> {\n if (!attributes || Object.keys(attributes).length === 0) {\n return {};\n }\n\n // Create a copy to avoid modifying the original\n const maskedAttributes = { ...attributes };\n\n for (const rule of rules) {\n const compiledAttributeNamePattern = getCompiledAttributeNamePattern(rule);\n const attributesToMask: string[] = compiledAttributeNamePattern\n ? Object.keys(maskedAttributes).filter((attr) => compiledAttributeNamePattern.test(attr))\n : Object.keys(maskedAttributes);\n\n for (const attribute of attributesToMask) {\n const value = maskedAttributes[attribute];\n if (value === null || value === undefined) {\n continue;\n }\n\n if (outputOriginalValue) {\n logger.debug(`Masking attribute '${attribute}' with original value`, { value });\n }\n\n maskedAttributes[attribute] = maskValue(value, rule);\n }\n }\n\n return maskedAttributes;\n}\n","import { createContextKey } from '@opentelemetry/api';\n\nexport const BRIZZ = 'brizz';\nexport const PROPERTIES = 'properties';\nexport const SESSION_ID = 'session.id';\nexport const PROPERTIES_CONTEXT_KEY = createContextKey(PROPERTIES);\n","import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { PeriodicExportingMetricReader, type MetricReader } from '@opentelemetry/sdk-metrics';\n\nimport type { IResolvedBrizzConfig } from '../config';\nimport { logger } from '../logger';\n\nexport class MetricsModule {\n private static instance: MetricsModule | null = null;\n private metricsExporter: OTLPMetricExporter | null = null;\n private metricsReader: MetricReader | null = null;\n\n static getInstance(): MetricsModule {\n if (!MetricsModule.instance) {\n throw new Error('Brizz must be initialized before accessing MetricsModule');\n }\n return MetricsModule.instance;\n }\n\n /**\n * Initialize the metrics module with the provided configuration\n */\n setup(config: IResolvedBrizzConfig): void {\n logger.info('Setting up metrics module');\n\n // Initialize reader (custom or default with exporter)\n this.initMetricsReader(config);\n\n // Set as module instance for standalone functions\n MetricsModule.instance = this;\n\n logger.info('Metrics module setup completed');\n }\n\n /**\n * Initialize the metrics exporter\n */\n private initMetricsExporter(config: IResolvedBrizzConfig): void {\n if (this.metricsExporter) {\n logger.debug('Metrics exporter already initialized, skipping re-initialization');\n return;\n }\n\n const metricsUrl = config.baseUrl.replace(/\\/$/, '') + '/v1/metrics';\n logger.debug('Initializing metrics exporter', { url: metricsUrl });\n\n this.metricsExporter = new OTLPMetricExporter({\n url: metricsUrl,\n headers: config.headers,\n });\n\n logger.debug('Metrics exporter initialized successfully');\n }\n\n /**\n * Initialize the metrics reader\n */\n private initMetricsReader(config: IResolvedBrizzConfig): void {\n if (this.metricsReader) {\n logger.debug('Metrics reader already initialized, skipping re-initialization');\n return;\n }\n\n // Use custom metric reader if provided\n if (config.customMetricReader) {\n logger.debug('Using custom metric reader');\n this.metricsReader = config.customMetricReader;\n logger.debug('Custom metric reader initialized successfully');\n return;\n }\n\n // Use default flow: create OTLP exporter and wrap it in PeriodicExportingMetricReader\n logger.debug(\n 'Using default metrics flow - creating OTLP exporter and PeriodicExportingMetricReader',\n );\n this.initMetricsExporter(config);\n\n if (!this.metricsExporter) {\n throw new Error('Failed to initialize metrics exporter');\n }\n\n this.metricsReader = new PeriodicExportingMetricReader({\n exporter: this.metricsExporter,\n });\n\n logger.debug('Default metrics reader initialized successfully');\n }\n\n /**\n * Get the metrics exporter\n */\n getMetricsExporter(): OTLPMetricExporter {\n if (!this.metricsExporter) {\n throw new Error('Metrics module not initialized');\n }\n return this.metricsExporter;\n }\n\n /**\n * Get the metrics reader\n */\n getMetricsReader(): MetricReader {\n if (!this.metricsReader) {\n throw new Error('Metrics module not initialized');\n }\n return this.metricsReader;\n }\n\n /**\n * Shutdown the metrics module\n */\n shutdown(): void {\n logger.debug('Shutting down metrics module');\n\n this.metricsReader = null;\n this.metricsExporter = null;\n\n // Clear module instance\n if (MetricsModule.instance === this) {\n MetricsModule.instance = null;\n }\n\n logger.debug('Metrics module shutdown completed');\n }\n}\n\n/**\n * Get the OpenTelemetry Metrics Exporter configured for Brizz.\n * @throws {Error} - If SDK is not initialized\n */\nexport function getMetricsExporter(): OTLPMetricExporter {\n return MetricsModule.getInstance().getMetricsExporter();\n}\n\n/**\n * Get the Metrics Reader configured for Brizz.\n * @throws {Error} - If SDK is not initialized\n */\nexport function getMetricsReader(): MetricReader {\n return MetricsModule.getInstance().getMetricsReader();\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace-node';\n\nimport type { IResolvedBrizzConfig } from '../config';\nimport { logger } from '../logger';\n\nimport { BrizzBatchSpanProcessor, BrizzSimpleSpanProcessor } from './processors/span-processor';\n\nexport class TracingModule {\n private static instance: TracingModule | null = null;\n private spanExporter: SpanExporter | null = null;\n private spanProcessor: SpanProcessor | null = null;\n\n static getInstance(): TracingModule {\n if (!TracingModule.instance) {\n throw new Error('Brizz must be initialized before accessing TracingModule');\n }\n return TracingModule.instance;\n }\n\n /**\n * Initialize the tracing module with the provided configuration\n */\n setup(config: IResolvedBrizzConfig): void {\n logger.info('Setting up tracing module');\n\n // Initialize exporter (custom or default)\n this.initSpanExporter(config);\n\n // Initialize processor with masking support\n this.initSpanProcessor(config);\n\n // Set as module instance for standalone functions\n TracingModule.instance = this;\n\n logger.info('Tracing module setup completed');\n }\n\n /**\n * Initialize the span exporter\n */\n private initSpanExporter(config: IResolvedBrizzConfig): void {\n if (this.spanExporter) {\n logger.debug('Span exporter already initialized, skipping re-initialization');\n return;\n }\n\n // Use custom span exporter if provided\n if (config.customSpanExporter) {\n logger.debug('Using custom span exporter');\n this.spanExporter = config.customSpanExporter;\n logger.debug('Custom span exporter initialized successfully');\n return;\n }\n\n // Use default OTLP exporter\n const tracesUrl = config.baseUrl.replace(/\\/$/, '') + '/v1/traces';\n logger.debug('Initializing default OTLP span exporter', { url: tracesUrl });\n\n this.spanExporter = new OTLPTraceExporter({\n url: tracesUrl,\n headers: config.headers,\n });\n\n logger.debug('OTLP span exporter initialized successfully');\n }\n\n /**\n * Initialize the span processor with masking support\n */\n private initSpanProcessor(config: IResolvedBrizzConfig): void {\n if (this.spanProcessor) {\n logger.debug('Span processor already initialized, skipping re-initialization');\n return;\n }\n\n if (!this.spanExporter) {\n throw new Error('Span exporter must be initialized before processor');\n }\n\n logger.debug('Initializing span processor', {\n disableBatch: config.disableBatch,\n hasMasking: !!config.masking?.spanMasking,\n });\n\n // Use masked processors if masking is configured, otherwise use standard processors\n const spanProcessor = config.disableBatch\n ? new BrizzSimpleSpanProcessor(this.spanExporter, config)\n : new BrizzBatchSpanProcessor(this.spanExporter, config);\n\n logger.debug('Span processor initialized successfully');\n\n this.spanProcessor = spanProcessor;\n }\n\n /**\n * Get the span exporter\n */\n getSpanExporter(): SpanExporter {\n if (!this.spanExporter) {\n throw new Error('Tracing module not initialized');\n }\n return this.spanExporter;\n }\n\n /**\n * Get the span processor\n */\n getSpanProcessor(): SpanProcessor {\n if (!this.spanProcessor) {\n throw new Error('Tracing module not initialized');\n }\n return this.spanProcessor;\n }\n\n async shutdown(): Promise<void> {\n logger.debug('Shutting down tracing module');\n\n if (this.spanProcessor) {\n await this.spanProcessor.shutdown();\n this.spanProcessor = null;\n }\n\n if (this.spanExporter) {\n await this.spanExporter.shutdown();\n this.spanExporter = null;\n }\n\n TracingModule.instance = null;\n logger.debug('Tracing module shutdown completed');\n }\n}\n\n/**\n * Get the OpenTelemetry Span Exporter configured for Brizz.\n * @throws {Error} - If SDK is not initialized\n */\nexport function getSpanExporter(): SpanExporter {\n return TracingModule.getInstance().getSpanExporter();\n}\n\n/**\n * Get the Span Processor configured for Brizz.\n * @throws {Error} - If SDK is not initialized\n */\nexport function getSpanProcessor(): SpanProcessor {\n return TracingModule.getInstance().getSpanProcessor();\n}\n","import { type Attributes, type AttributeValue, context, type Context } from '@opentelemetry/api';\nimport {\n BatchSpanProcessor,\n SimpleSpanProcessor,\n type Span,\n type SpanExporter,\n} from '@opentelemetry/sdk-trace-base';\n\nimport type { IResolvedBrizzConfig } from '../../config';\nimport { logger } from '../../logger';\nimport { DEFAULT_PII_PATTERNS } from '../../masking/patterns';\nimport type {\n IAttributesMaskingRule,\n ISpanMaskingConfig,\n MaskableValue,\n} from '../../masking/types';\nimport { maskAttributes } from '../../masking/utils';\nimport { BRIZZ, PROPERTIES_CONTEXT_KEY } from '../../semantic-conventions';\n\nexport const DEFAULT_MASKING_RULES: IAttributesMaskingRule[] = [\n {\n mode: 'partial',\n attributePattern: 'gen_ai.prompt',\n patterns: DEFAULT_PII_PATTERNS,\n },\n {\n mode: 'partial',\n attributePattern: 'gen_ai.completion',\n patterns: DEFAULT_PII_PATTERNS,\n },\n];\n\nexport class BrizzSimpleSpanProcessor extends SimpleSpanProcessor {\n public readonly config: IResolvedBrizzConfig;\n\n constructor(spanExporter: SpanExporter, config: IResolvedBrizzConfig) {\n super(spanExporter);\n this.config = config;\n }\n\n // Will work with the following code:\n // const span = tracer.startSpan('sensitive-operation',{attributes:{\n // 'user.password': 'secret123',\n // 'user.email': 'user@example.com',\n // }});\n //\n // Won't work because onStart is called before attributes are set:\n // span.setAttributes({\n // 'user.password': 'secret123',\n // 'user.email': 'user@example.com'\n // });\n override onStart(span: Span, parentContext: Context): void {\n const maskingConfig = this.config.masking?.spanMasking;\n if (maskingConfig) {\n maskSpan(span, maskingConfig);\n }\n const associationProperties = context.active().getValue(PROPERTIES_CONTEXT_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n span.setAttribute(`${BRIZZ}.${key}`, value as AttributeValue);\n }\n }\n super.onStart(span, parentContext);\n }\n}\n\nexport class BrizzBatchSpanProcessor extends BatchSpanProcessor {\n public readonly config: IResolvedBrizzConfig;\n\n constructor(spanExporter: SpanExporter, config: IResolvedBrizzConfig) {\n super(spanExporter);\n this.config = config;\n }\n\n override onStart(span: Span, parentContext: Context): void {\n const maskingConfig = this.config.masking?.spanMasking;\n if (maskingConfig) {\n maskSpan(span, maskingConfig);\n }\n const associationProperties = context.active().getValue(PROPERTIES_CONTEXT_KEY);\n if (associationProperties) {\n for (const [key, value] of Object.entries(associationProperties)) {\n span.setAttribute(`${BRIZZ}.${key}`, value as AttributeValue);\n }\n }\n super.onStart(span, parentContext);\n }\n}\n\nexport function maskSpan(span: Span, config: ISpanMaskingConfig): Span {\n if (!span.attributes || Object.keys(span.attributes).length === 0) {\n return span;\n }\n\n let rules = config.rules || [];\n if (!config.disableDefaultRules) {\n rules = [...DEFAULT_MASKING_RULES, ...rules];\n }\n\n try {\n const attributesRecord: Record<string, MaskableValue> = {};\n\n for (const [key, value] of Object.entries(span.attributes)) {\n attributesRecord[key] = value as MaskableValue;\n }\n\n const maskedAttributes = maskAttributes(attributesRecord, rules);\n if (maskedAttributes && Object.keys(maskedAttributes).length > 0) {\n // Use setAttributes to update the span\n const merged: Attributes = { ...span.attributes };\n for (const [key, value] of Object.entries(maskedAttributes)) {\n merged[key] = value as AttributeValue;\n }\n span.setAttributes(merged);\n }\n\n return span;\n } catch (error) {\n logger.error('Error masking span:', error);\n return span;\n }\n}\n","import { context } from '@opentelemetry/api';\n\nimport { PROPERTIES_CONTEXT_KEY, SESSION_ID } from '../semantic-conventions';\n\nexport function withProperties<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n properties: { [name: string]: string },\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n): ReturnType<F> {\n if (Object.keys(properties).length === 0) {\n return fn.apply(thisArg, args);\n }\n\n const newContext = context.active().setValue(PROPERTIES_CONTEXT_KEY, properties);\n return context.with(newContext, fn, thisArg, ...args);\n}\n\n/**\n * Wraps a function to create a new function that will execute with session context.\n * All telemetry (traces, spans, events) generated within the wrapped function will include the session ID.\n *\n * @example\n * ```typescript\n * // Wrap a function to always execute with a session\n * const wrappedFn = withSessionId('session-123', myFunction);\n * const result = await wrappedFn(arg1, arg2);\n *\n * // Wrap a method with 'this' context\n * const wrappedMethod = withSessionId('session-456', obj.method, obj);\n * const result = wrappedMethod(param);\n * ```\n *\n * @param sessionId - Session identifier to include in all telemetry within the function\n * @param fn - Function to wrap with session context\n * @param thisArg - Value to use as `this` when calling the function (optional)\n * @returns A wrapped function that will execute with session context\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withSessionId<F extends (this: any, ...args: any[]) => any>(\n sessionId: string,\n fn: F,\n thisArg?: ThisParameterType<F>,\n): F {\n return function wrapped(this: ThisParameterType<F>, ...args: Parameters<F>): ReturnType<F> {\n const base = context.active();\n const prev = base.getValue(PROPERTIES_CONTEXT_KEY) as Record<string, string> | undefined;\n const next = base.setValue(\n PROPERTIES_CONTEXT_KEY,\n prev ? { ...prev, [SESSION_ID]: sessionId } : { [SESSION_ID]: sessionId },\n );\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return context.with(next, fn, thisArg ?? this, ...args) as ReturnType<F>;\n } as F;\n}\n\n/**\n * Immediately executes a function with session context. All telemetry (traces, spans, events)\n * generated within the function will include the session ID.\n *\n * @example\n * ```typescript\n * // Basic usage with async function\n * await callWithSessionId('session-123', myAsyncFunction, null, arg1, arg2);\n *\n * // With method and 'this' context\n * const result = callWithSessionId('session-456', obj.method, obj, param);\n *\n * // Wrapping AI operations\n * const response = await callWithSessionId('chat-session', async () => {\n * const aiResponse = await openai.chat.completions.create({\n * model: 'gpt-4',\n * messages: [{ role: 'user', content: 'Hello' }]\n * });\n * emitEvent('ai.response', { tokens: aiResponse.usage.total_tokens });\n * return aiResponse;\n * });\n * ```\n *\n * @param sessionId - Session identifier to include in all telemetry within the function\n * @param fn - Function to execute with session context\n * @param thisArg - Value to use as `this` when calling the function (optional)\n * @param args - Arguments to pass to the wrapped function\n * @returns The return value of the wrapped function\n */\nexport function callWithSessionId<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n sessionId: string,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n): ReturnType<F> {\n return withProperties({ [SESSION_ID]: sessionId }, fn, thisArg, ...args);\n}\n","import module from 'node:module';\n\nimport { createAddHookMessageChannel } from 'import-in-the-middle';\n////////////////////////////// WARNING /////////////////////////////////\n///////// THIS FILE MUST NOT IMPORT ANY 3RD PARTY MODULES //////////////\n///////// Will cause infinite loop ////////////////////////////////////\n////////////////////////////////////////////////////////////////////////\n\n// Mini logger for loader - zero dependencies, only logs if BRIZZ_ESM_DEBUG=true\nconst loaderDebug = (() => {\n const isDebug =\n process.env['BRIZZ_ESM_DEBUG'] === 'true' || process.env['BRIZZ_LOG_LEVEL'] === 'debug';\n\n return {\n log: (msg: string, data?: unknown) => {\n if (!isDebug) {\n return;\n }\n const timestamp = new Date().toISOString();\n const dataStr = data ? ` ${JSON.stringify(data)}` : '';\n console.log(`[${timestamp}] [ESM-LOADER] ${msg}${dataStr}`);\n },\n error: (msg: string, error?: unknown) => {\n if (!isDebug) {\n return;\n }\n const timestamp = new Date().toISOString();\n const errorStr =\n error instanceof Error ? ` ${error.message}` : error ? ` ${JSON.stringify(error)}` : '';\n console.error(`[${timestamp}] [ESM-LOADER] ERROR: ${msg}${errorStr}`);\n },\n };\n})();\n\n// Use a Symbol to ensure unique global key that won't be accidentally overwritten\nconst LOADER_REGISTERED_KEY = Symbol.for('__brizz_esm_loader_registered__');\n\n// Check if loader API is supported\nfunction checkLoaderAPISupport() {\n const [major, minor] = process.versions.node.split('.').map(Number);\n\n if (major === undefined || minor === undefined) {\n loaderDebug.log('Failed to detect Node version, assuming loader API is supported');\n return true;\n }\n\n const supported = major >= 21 || (major === 20 && minor >= 6) || (major === 18 && minor >= 19);\n\n loaderDebug.log('Loader API support check:', {\n nodeVersion: `${major}.${minor}`,\n supportsLoaderAPI: supported,\n });\n\n return supported;\n}\n\nexport function maybeRegisterESMLoader(): boolean {\n // Check if already registered using Symbol key\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((globalThis as any)[LOADER_REGISTERED_KEY] === true) {\n loaderDebug.log('ESM loader already registered, skipping');\n return false;\n }\n\n // Mark as registered immediately to prevent race conditions\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (globalThis as any)[LOADER_REGISTERED_KEY] = true;\n\n loaderDebug.log('Starting ESM loader registration...');\n\n if (!checkLoaderAPISupport()) {\n loaderDebug.log('Node.js version does not support loader API, skipping');\n return false;\n }\n\n // Check if import.meta is available (ESM context)\n if (import.meta === undefined || !import.meta.url) {\n loaderDebug.log('import.meta.url not available, skipping loader registration');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (globalThis as any)[LOADER_REGISTERED_KEY] = false;\n return false;\n }\n\n // Skip in test environments where module.register might cause issues\n const isTest = process.env['NODE_ENV'] === 'test' || process.env['JEST_WORKER_ID'] !== undefined;\n if (isTest) {\n loaderDebug.log('Test environment detected, skipping ESM loader registration');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (globalThis as any)[LOADER_REGISTERED_KEY] = false;\n return false;\n }\n\n try {\n loaderDebug.log('Creating MessageChannel for import-in-the-middle...');\n const { addHookMessagePort } = createAddHookMessageChannel();\n\n loaderDebug.log('Registering import-in-the-middle/hook.mjs...');\n\n // Pass import.meta.url as the parent URL for resolving the module specifier\n // This is necessary when module.register is called from a data: URL context\n module.register('import-in-the-middle/hook.mjs', import.meta.url, {\n data: { addHookMessagePort },\n transferList: [addHookMessagePort],\n });\n\n loaderDebug.log('ESM loader successfully registered!');\n return true;\n } catch (error) {\n loaderDebug.error('Failed to register ESM loader:', error);\n // Reset the flag on failure so it can be retried if needed\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (globalThis as any)[LOADER_REGISTERED_KEY] = false;\n return false;\n }\n}\n\n// Auto-execute when the loader module is imported via --import\n// Check both the Symbol key and execution context\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nif ((globalThis as any)[LOADER_REGISTERED_KEY] !== true) {\n loaderDebug.log('Loader module imported, attempting to register...');\n maybeRegisterESMLoader();\n}\n","import { logger } from '../internal/logger.js';\n\nexport interface RuntimeInfo {\n isESM: boolean;\n isCJS: boolean;\n nodeVersion: string;\n supportsLoaderAPI: boolean;\n supportsRegister: boolean;\n}\n\nexport function detectRuntime(): RuntimeInfo {\n const [major, minor] = process.versions.node.split('.').map(Number);\n\n // Detect ESM vs CJS based on Node.js globals availability\n // In pure ESM: __filename, __dirname, module, exports are undefined\n // In pure CJS: __filename, __dirname, module, exports all exist\n // In mixed/loader contexts: some may exist as shims\n const noNodeJSGlobals = typeof __filename === 'undefined' && typeof __dirname === 'undefined';\n const noModuleSystem = typeof module === 'undefined' && typeof exports === 'undefined';\n const hasRequire = typeof require === 'function';\n\n // ESM: No Node.js globals AND no CJS module system\n // This covers pure ESM and ESM loader contexts\n const isESM = noNodeJSGlobals && noModuleSystem;\n\n // CJS: All CJS globals exist (require, module, exports, __filename, __dirname)\n // This ensures we're in a real CJS context, not a shim environment\n const isCJS =\n hasRequire &&\n typeof module !== 'undefined' &&\n typeof exports !== 'undefined' &&\n typeof __filename === 'string' &&\n typeof __dirname === 'string';\n\n const supportsLoaderAPI =\n (major ?? 0) >= 21 ||\n ((major ?? 0) === 20 && (minor ?? 0) >= 6) ||\n ((major ?? 0) === 18 && (minor ?? 0) >= 19);\n const supportsRegister =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n !!(process.features as any)?.typescript || !!(globalThis as any).module?.register;\n\n logger.debug('Runtime detection results:', {\n nodeVersion: `${major ?? 0}.${minor ?? 0}`,\n isESM,\n isCJS,\n supportsLoaderAPI,\n supportsRegister,\n detectionLogic: {\n noNodeJSGlobals,\n noModuleSystem,\n hasRequire,\n esmCondition: `${noNodeJSGlobals} && ${noModuleSystem} = ${isESM}`,\n cjsCondition: `require && module && exports && __filename && __dirname = ${isCJS}`,\n },\n checks: {\n __filename: typeof __filename,\n __dirname: typeof __dirname,\n require: typeof require,\n module: typeof module,\n exports: typeof exports,\n 'process.features': process.features,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n 'globalThis.module': (globalThis as any).module,\n },\n });\n\n return {\n isESM,\n isCJS,\n nodeVersion: process.versions.node,\n supportsLoaderAPI,\n supportsRegister,\n };\n}\n","/**\n * Preload entry point for automatic SDK initialization.\n *\n * This module can be used with Node.js preload flags:\n * - ESM: node --import @brizz/sdk/preload app.mjs\n * - CJS: node --require @brizz/sdk/preload app.js\n *\n * It automatically initializes the SDK with environment-based configuration.\n */\n\n// Import the main SDK and initialization utilities\nimport { logger, DEFAULT_LOG_LEVEL } from './internal/logger.js';\nimport { Brizz } from './internal/sdk.js';\nimport { maybeRegisterESMLoader } from './node/loader.js';\nimport { detectRuntime } from './node/runtime.js';\n\n// Detect runtime early\nconst runtime = detectRuntime();\n\n// Register ESM loader if needed\nif (runtime.isESM && runtime.supportsLoaderAPI) {\n maybeRegisterESMLoader();\n}\n\n// Auto-initialize with environment-based config\ntry {\n // Initialize the main SDK with environment variables\n Brizz.initialize({\n apiKey: process.env['BRIZZ_API_KEY'],\n baseUrl: process.env['BRIZZ_BASE_URL'],\n appName: process.env['BRIZZ_APP_NAME'] || process.env['OTEL_SERVICE_NAME'],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n logLevel: (process.env['BRIZZ_LOG_LEVEL'] || DEFAULT_LOG_LEVEL.toString()) as any,\n // Enable auto-instrumentation by default in preload mode\n disableNodeSdk: false,\n });\n\n logger.info(`SDK auto-initialized for ${runtime.isESM ? 'ESM' : 'CJS'} runtime`);\n} catch (error) {\n logger.warn('Failed to auto-initialize SDK:', { error });\n}\n"],"mappings":"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,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA;AAAA,EAEA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,EAClB;AAAA,EACA;A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","names":["pino","import_resources","import_sdk_logs","import_api","import_api","import_api","import_api","module"]}
|