@virtu3d/event-manager 0.2.7
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/LICENSE +21 -0
- package/README.md +624 -0
- package/dist/browser/index.d.mts +631 -0
- package/dist/browser/index.d.ts +631 -0
- package/dist/browser/index.js +1140 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/index.mjs +1104 -0
- package/dist/browser/index.mjs.map +1 -0
- package/dist/context/index.d.mts +111 -0
- package/dist/context/index.d.ts +111 -0
- package/dist/context/index.js +186 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/index.mjs +176 -0
- package/dist/context/index.mjs.map +1 -0
- package/dist/index.d.mts +568 -0
- package/dist/index.d.ts +568 -0
- package/dist/index.js +1044 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +999 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +118 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/connectors/base.connector.ts","../../src/browser/otel-browser.connector.ts","../../src/context/index.ts","../../src/browser/interceptors.ts","../../src/connectors/console.connector.ts","../../src/connectors/otel.connector.ts","../../src/connectors/cloudwatch-emf.connector.ts","../../src/factories/index.ts","../../src/core/router.ts","../../src/utils/index.ts","../../src/browser/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n Connector,\n ConnectorType,\n TelemetryEvent,\n IdentifyEvent,\n PageEvent,\n ConnectorConfig,\n} from '../core/types';\n\nexport abstract class BaseConnector implements Connector {\n abstract name: string;\n abstract type: ConnectorType;\n\n protected config: ConnectorConfig;\n protected ready = false;\n\n constructor(config: ConnectorConfig = {}) {\n this.config = {\n enabled: true,\n debug: false,\n ...config,\n };\n }\n\n async init(): Promise<void> {\n if (!this.config.enabled) {\n this.log('Connector disabled, skipping init');\n return;\n }\n await this.setup();\n this.ready = true;\n }\n\n /**\n * Override this to implement connector-specific setup\n */\n protected abstract setup(): Promise<void> | void;\n\n abstract track(event: TelemetryEvent): Promise<void> | void;\n\n identify?(event: IdentifyEvent): Promise<void> | void;\n\n page?(event: PageEvent): Promise<void> | void;\n\n async shutdown(): Promise<void> {\n this.ready = false;\n }\n\n isReady(): boolean {\n return this.ready && (this.config.enabled ?? true);\n }\n\n protected log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.log(`[${this.name}] ${message}`, data || '');\n }\n }\n}\n","/**\n * Browser OpenTelemetry Connector\n *\n * Provides OTEL tracing capabilities for browser environments.\n * Uses @opentelemetry/sdk-trace-web for browser-optimized tracing.\n */\n\n// Declare browser globals for TypeScript (used at runtime in browser)\ndeclare const window: {\n location: {\n pathname: string;\n href: string;\n origin: string;\n };\n};\ndeclare const document: {\n referrer: string;\n};\n\nimport { BaseConnector } from '../connectors/base.connector';\nimport type { TelemetryEvent, IdentifyEvent, PageEvent, ConnectorConfig } from '../core/types';\n\nexport interface BrowserOtelConnectorConfig extends ConnectorConfig {\n /** Service name for this application */\n serviceName: string;\n /** OTEL collector endpoint for sending traces */\n collectorUrl?: string;\n /** URLs to propagate trace context to (supports strings and RegExp) */\n propagateToUrls?: (string | RegExp)[];\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string>;\n /** Whether to auto-instrument fetch/XHR (default: false - use interceptors instead) */\n autoInstrument?: boolean;\n}\n\n/**\n * Browser-optimized OpenTelemetry connector\n *\n * @example\n * ```typescript\n * const connector = new BrowserOtelConnector({\n * serviceName: 'my-web-app',\n * collectorUrl: 'http://localhost:4318/v1/traces',\n * propagateToUrls: [/api\\.example\\.com/, /localhost:3000/],\n * });\n * ```\n */\nexport class BrowserOtelConnector extends BaseConnector {\n name = 'otel-browser';\n type = 'observability' as const;\n\n private tracer: any; // Tracer from @opentelemetry/api\n private provider: any; // WebTracerProvider\n private otelConfig: BrowserOtelConnectorConfig;\n\n constructor(config: BrowserOtelConnectorConfig) {\n super(config);\n this.otelConfig = config;\n }\n\n protected async setup(): Promise<void> {\n try {\n // Dynamic imports for browser OTEL packages\n const [\n traceWebModule,\n traceBaseModule,\n exporterModule,\n contextZoneModule,\n resourcesModule,\n semconvModule,\n apiModule,\n ] = await Promise.all([\n import('@opentelemetry/sdk-trace-web'),\n import('@opentelemetry/sdk-trace-base'),\n import('@opentelemetry/exporter-trace-otlp-http'),\n import('@opentelemetry/context-zone'),\n import('@opentelemetry/resources'),\n import('@opentelemetry/semantic-conventions'),\n import('@opentelemetry/api'),\n ]);\n\n // Extract needed exports\n const { WebTracerProvider } = traceWebModule;\n const { SimpleSpanProcessor, BatchSpanProcessor } = traceBaseModule;\n const { OTLPTraceExporter } = exporterModule;\n const { ZoneContextManager } = contextZoneModule;\n // Use resourceFromAttributes (v2.x) with fallback for older versions\n const resourceFromAttributes = resourcesModule.resourceFromAttributes\n || ((attrs: Record<string, string>) => new (resourcesModule as any).Resource(attrs));\n const ATTR_SERVICE_NAME = semconvModule.ATTR_SERVICE_NAME || semconvModule.SEMRESATTRS_SERVICE_NAME || 'service.name';\n const { trace } = apiModule;\n\n // Build resource attributes\n const resourceAttrs: Record<string, string> = {\n [ATTR_SERVICE_NAME]: this.otelConfig.serviceName,\n 'telemetry.sdk.language': 'webjs',\n 'telemetry.sdk.name': '@fountaneengineering/event-manager',\n ...this.otelConfig.resourceAttributes,\n };\n\n // Build span processors\n const spanProcessors: any[] = [];\n\n if (this.otelConfig.collectorUrl) {\n const exporter = new OTLPTraceExporter({\n url: this.otelConfig.collectorUrl,\n });\n spanProcessors.push(new BatchSpanProcessor(exporter));\n } else {\n // Use SimpleSpanProcessor for debugging (console export)\n spanProcessors.push(\n new SimpleSpanProcessor({\n export: (spans: any[], resultCallback: (result: any) => void) => {\n if (this.config.debug) {\n console.log('[otel-browser] Spans:', spans);\n }\n resultCallback({ code: 0 }); // ExportResultCode.SUCCESS\n },\n shutdown: () => Promise.resolve(),\n } as any)\n );\n }\n\n // Create the provider with span processors in constructor (v2.x API)\n this.provider = new WebTracerProvider({\n resource: resourceFromAttributes(resourceAttrs),\n spanProcessors,\n });\n\n // Register the provider with ZoneContextManager for async context\n this.provider.register({\n contextManager: new ZoneContextManager(),\n });\n\n // Get the tracer\n this.tracer = trace.getTracer(this.otelConfig.serviceName, '1.0.0');\n\n this.log('Browser OTEL tracer initialized', {\n serviceName: this.otelConfig.serviceName,\n collectorUrl: this.otelConfig.collectorUrl || 'none (debug mode)',\n });\n } catch (error) {\n this.log('Failed to initialize OTEL', error);\n throw error;\n }\n }\n\n track(event: TelemetryEvent): void {\n if (!this.tracer) {\n this.log('Tracer not initialized, skipping track');\n return;\n }\n\n const span = this.tracer.startSpan(event.name);\n\n // Add event attributes\n span.setAttribute('event.name', event.name);\n span.setAttribute('event.timestamp', event.timestamp || new Date().toISOString());\n\n // Add payload attributes (flatten first level)\n if (event.payload) {\n Object.entries(event.payload).forEach(([key, value]) => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n span.setAttribute(`payload.${key}`, value);\n } else if (value !== null && value !== undefined) {\n try {\n span.setAttribute(`payload.${key}`, JSON.stringify(value));\n } catch {\n // Skip non-serializable values\n }\n }\n });\n }\n\n // Add meta attributes\n if (event.meta) {\n Object.entries(event.meta).forEach(([key, value]) => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n span.setAttribute(`meta.${key}`, value);\n }\n });\n }\n\n span.end();\n this.log('Span created', { name: event.name });\n }\n\n identify(event: IdentifyEvent): void {\n if (!this.tracer) return;\n\n // Create a span for the identify event\n const span = this.tracer.startSpan('user.identify');\n span.setAttribute('user.id', event.userId);\n\n if (event.traits) {\n Object.entries(event.traits).forEach(([key, value]) => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n span.setAttribute(`user.traits.${key}`, value);\n }\n });\n }\n\n span.end();\n this.log('User identified', { userId: event.userId });\n }\n\n page(event: PageEvent): void {\n this.track({\n name: 'page_view',\n payload: {\n pageName: event.name || window.location.pathname,\n url: window.location.href,\n referrer: document.referrer,\n ...event.properties,\n },\n timestamp: event.timestamp,\n });\n }\n\n async shutdown(): Promise<void> {\n if (this.provider) {\n try {\n await this.provider.shutdown();\n this.log('Provider shutdown complete');\n } catch (error) {\n this.log('Error during shutdown', error);\n }\n }\n await super.shutdown();\n }\n\n /**\n * Get the underlying tracer for advanced use cases\n */\n getTracer(): any {\n return this.tracer;\n }\n\n /**\n * Get the provider for advanced configuration\n */\n getProvider(): any {\n return this.provider;\n }\n}\n\n/**\n * Factory function to create a BrowserOtelConnector\n */\nexport function createBrowserOtelConnector(\n config: BrowserOtelConnectorConfig\n): BrowserOtelConnector {\n return new BrowserOtelConnector(config);\n}\n","/**\n * Context Propagation Utilities\n *\n * Works in both Node.js and Browser environments.\n * Uses @opentelemetry/api for trace context propagation.\n */\n\n/**\n * Trace context structure\n */\nexport interface TraceContext {\n traceId: string;\n spanId: string;\n traceFlags: number;\n}\n\n/**\n * Get current trace headers for manual injection into HTTP requests.\n * Returns headers like { traceparent: '00-abc123...', tracestate: '...' }\n *\n * If there's an active OTEL span, uses its context.\n * Otherwise, generates a new traceparent to enable backend trace correlation.\n *\n * @example\n * ```typescript\n * const headers = getTraceHeaders();\n * fetch('/api/data', { headers });\n * ```\n */\nexport async function getTraceHeaders(): Promise<Record<string, string>> {\n try {\n const { context, propagation, trace } = await import('@opentelemetry/api');\n const headers: Record<string, string> = {};\n propagation.inject(context.active(), headers);\n\n // If OTEL didn't provide traceparent (no active span), generate one\n // This ensures trace context is always propagated to backends\n if (!headers['traceparent']) {\n const traceId = generateTraceId();\n const spanId = generateSpanId();\n headers['traceparent'] = generateTraceparent(traceId, spanId, 1);\n }\n\n return headers;\n } catch {\n // OTEL not available, generate traceparent manually\n const traceId = generateTraceId();\n const spanId = generateSpanId();\n return {\n traceparent: generateTraceparent(traceId, spanId, 1),\n };\n }\n}\n\n/**\n * Synchronous version of getTraceHeaders (requires OTEL to be pre-loaded)\n * Use this when you know OTEL is already initialized.\n *\n * If there's an active OTEL span, uses its context.\n * Otherwise, generates a new traceparent to enable backend trace correlation.\n */\nexport function getTraceHeadersSync(): Record<string, string> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { context, propagation } = require('@opentelemetry/api');\n const headers: Record<string, string> = {};\n propagation.inject(context.active(), headers);\n\n // If OTEL didn't provide traceparent (no active span), generate one\n if (!headers['traceparent']) {\n const traceId = generateTraceId();\n const spanId = generateSpanId();\n headers['traceparent'] = generateTraceparent(traceId, spanId, 1);\n }\n\n return headers;\n } catch {\n // OTEL not available, generate traceparent manually\n const traceId = generateTraceId();\n const spanId = generateSpanId();\n return {\n traceparent: generateTraceparent(traceId, spanId, 1),\n };\n }\n}\n\n/**\n * Extract trace context from incoming headers.\n * Use this in middleware to link incoming requests to their parent trace.\n *\n * @example\n * ```typescript\n * // Express middleware\n * app.use((req, res, next) => {\n * const traceContext = extractTraceContext(req.headers);\n * if (traceContext) {\n * req.traceId = traceContext.traceId;\n * }\n * next();\n * });\n * ```\n */\nexport async function extractTraceContext(\n headers: Record<string, string | string[] | undefined>\n): Promise<TraceContext | null> {\n try {\n const { trace, context, propagation, isSpanContextValid } = await import('@opentelemetry/api');\n\n // Normalize headers to string values (lowercase keys for consistency)\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n const lowerKey = key.toLowerCase();\n if (typeof value === 'string') {\n normalizedHeaders[lowerKey] = value;\n } else if (Array.isArray(value)) {\n normalizedHeaders[lowerKey] = value[0] || '';\n }\n }\n\n const extractedContext = propagation.extract(context.active(), normalizedHeaders);\n\n // Use getSpanContext instead of getSpan - when extracting from headers,\n // there's no Span object, only SpanContext information\n const spanContext = trace.getSpanContext(extractedContext);\n\n if (!spanContext || !isSpanContextValid(spanContext)) {\n // If OTEL extraction failed, try manual parsing of traceparent\n const traceparent = normalizedHeaders['traceparent'];\n if (traceparent) {\n const parsed = parseTraceparent(traceparent);\n if (parsed) {\n return {\n traceId: parsed.traceId,\n spanId: parsed.spanId,\n traceFlags: parsed.traceFlags,\n };\n }\n }\n return null;\n }\n\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n traceFlags: spanContext.traceFlags,\n };\n } catch {\n // Fallback to manual parsing if OTEL is not available\n const traceparent = headers['traceparent'] || headers['Traceparent'];\n if (traceparent) {\n const value = typeof traceparent === 'string' ? traceparent : traceparent[0];\n const parsed = parseTraceparent(value || '');\n if (parsed) {\n return {\n traceId: parsed.traceId,\n spanId: parsed.spanId,\n traceFlags: parsed.traceFlags,\n };\n }\n }\n return null;\n }\n}\n\n/**\n * Run a function within an extracted trace context.\n * This ensures any spans created within the function are linked to the parent trace.\n *\n * @example\n * ```typescript\n * await withTraceContext(req.headers, async () => {\n * // Any spans created here will be children of the incoming trace\n * await processRequest();\n * });\n * ```\n */\nexport async function withTraceContext<T>(\n headers: Record<string, string | string[] | undefined>,\n fn: () => T | Promise<T>\n): Promise<T> {\n try {\n const { context, propagation } = await import('@opentelemetry/api');\n\n // Normalize headers\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n normalizedHeaders[key] = value;\n } else if (Array.isArray(value)) {\n normalizedHeaders[key] = value[0] || '';\n }\n }\n\n const extractedContext = propagation.extract(context.active(), normalizedHeaders);\n return context.with(extractedContext, fn);\n } catch {\n // OTEL not available, run function without context\n return fn();\n }\n}\n\n/**\n * Create a new span for tracking an operation.\n * The span will automatically be linked to the current trace context.\n *\n * @example\n * ```typescript\n * const span = await startSpan('fetch-user-data');\n * try {\n * const user = await fetchUser(id);\n * span.setAttribute('user.id', id);\n * span.setStatus({ code: SpanStatusCode.OK });\n * } catch (error) {\n * span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });\n * throw error;\n * } finally {\n * span.end();\n * }\n * ```\n */\nexport async function startSpan(\n name: string,\n serviceName = 'telemetry'\n): Promise<any> {\n try {\n const { trace } = await import('@opentelemetry/api');\n const tracer = trace.getTracer(serviceName);\n return tracer.startSpan(name);\n } catch {\n // Return a no-op span if OTEL is not available\n return {\n setAttribute: () => {},\n setStatus: () => {},\n addEvent: () => {},\n end: () => {},\n spanContext: () => ({ traceId: '', spanId: '', traceFlags: 0 }),\n };\n }\n}\n\n/**\n * Parse a traceparent header string into its components.\n * Format: version-traceId-spanId-traceFlags (e.g., \"00-abc123...-def456...-01\")\n */\nexport function parseTraceparent(\n traceparent: string\n): { version: string; traceId: string; spanId: string; traceFlags: number } | null {\n if (!traceparent) return null;\n\n const parts = traceparent.split('-');\n if (parts.length !== 4) return null;\n\n const [version, traceId, spanId, flags] = parts;\n\n // Validate format\n if (version.length !== 2 || traceId.length !== 32 || spanId.length !== 16 || flags.length !== 2) {\n return null;\n }\n\n return {\n version,\n traceId,\n spanId,\n traceFlags: parseInt(flags, 16),\n };\n}\n\n/**\n * Generate a traceparent header string.\n * Useful for creating custom trace contexts.\n */\nexport function generateTraceparent(\n traceId: string,\n spanId: string,\n traceFlags = 1\n): string {\n const flagsHex = traceFlags.toString(16).padStart(2, '0');\n return `00-${traceId}-${spanId}-${flagsHex}`;\n}\n\n/**\n * Generate a random trace ID (32 hex characters)\n */\nexport function generateTraceId(): string {\n const bytes = new Uint8Array(16);\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n // Fallback for environments without crypto\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Generate a random span ID (16 hex characters)\n */\nexport function generateSpanId(): string {\n const bytes = new Uint8Array(8);\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n","/**\n * Browser HTTP Interceptors\n *\n * Provides fetch and XMLHttpRequest interceptors for automatic\n * trace context propagation in browser environments.\n */\n\n// Declare browser globals for TypeScript\n// These are only needed when building outside of a browser context\n\n// Global window object\ndeclare const window: {\n location: {\n origin: string;\n href: string;\n pathname: string;\n };\n};\n\n// Fetch-related types (when not in DOM context)\ndeclare type RequestInfo = Request | string;\n\n// XMLHttpRequest types\ndeclare const XMLHttpRequest: {\n new (): XMLHttpRequestInstance;\n prototype: XMLHttpRequestInstance;\n};\n\ninterface XMLHttpRequestInstance {\n open(method: string, url: string | URL, async?: boolean, username?: string | null, password?: string | null): void;\n send(body?: any): void;\n setRequestHeader(name: string, value: string): void;\n}\n\ndeclare type DocumentType = any;\ndeclare type BodyInit = any;\n\nimport { getTraceHeaders } from '../context';\n\n/**\n * Configuration for the fetch interceptor\n */\nexport interface FetchInterceptorConfig {\n /** URLs to propagate trace context to (matches if URL contains string or matches RegExp) */\n propagateToUrls: (string | RegExp)[];\n /** URLs to exclude from trace propagation (matches if URL contains string or matches RegExp) */\n excludeUrls?: (string | RegExp)[];\n /** Original fetch function (defaults to globalThis.fetch) */\n originalFetch?: typeof fetch;\n /** Whether to create spans for fetch requests (requires OTEL to be initialized) */\n createSpans?: boolean;\n /** Service name for span creation */\n serviceName?: string;\n}\n\n/**\n * Check if a URL matches any of the patterns\n */\nfunction matchesPatterns(url: string, patterns: (string | RegExp)[]): boolean {\n return patterns.some((pattern) => {\n if (typeof pattern === 'string') {\n return url.includes(pattern);\n }\n return pattern.test(url);\n });\n}\n\n/**\n * Check if a URL should have trace context propagated\n */\nfunction shouldPropagate(\n url: string,\n includePatterns: (string | RegExp)[],\n excludePatterns?: (string | RegExp)[]\n): boolean {\n // First check if URL matches include patterns\n if (!matchesPatterns(url, includePatterns)) {\n return false;\n }\n // Then check if URL should be excluded\n if (excludePatterns && excludePatterns.length > 0) {\n return !matchesPatterns(url, excludePatterns);\n }\n return true;\n}\n\n/**\n * Create a traced fetch function that automatically injects trace context headers.\n *\n * @example\n * ```typescript\n * const tracedFetch = createTracedFetch({\n * propagateToUrls: [/api\\.example\\.com/, 'localhost:3000'],\n * });\n *\n * // Use directly\n * const response = await tracedFetch('/api/data');\n *\n * // Or replace global fetch\n * globalThis.fetch = tracedFetch;\n * ```\n */\nexport function createTracedFetch(config: FetchInterceptorConfig): typeof fetch {\n const originalFetch = config.originalFetch || globalThis.fetch;\n\n return async function tracedFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n // Get the URL string\n let url: string;\n if (typeof input === 'string') {\n url = input;\n } else if (input instanceof URL) {\n url = input.href;\n } else {\n url = input.url;\n }\n\n // Check if we should propagate trace context to this URL\n if (!shouldPropagate(url, config.propagateToUrls, config.excludeUrls)) {\n return originalFetch(input, init);\n }\n\n // Get trace headers\n const traceHeaders = await getTraceHeaders();\n\n // Merge trace headers with existing headers\n const headers = new Headers(init?.headers);\n Object.entries(traceHeaders).forEach(([key, value]) => {\n if (!headers.has(key)) {\n headers.set(key, value);\n }\n });\n\n // Create new init with merged headers\n const newInit: RequestInit = {\n ...init,\n headers,\n };\n\n // If span creation is enabled, wrap the fetch in a span\n if (config.createSpans) {\n return fetchWithSpan(originalFetch, input, newInit, url, config.serviceName);\n }\n\n return originalFetch(input, newInit);\n };\n}\n\n/**\n * Wrap a fetch call with an OTEL span\n */\nasync function fetchWithSpan(\n originalFetch: typeof fetch,\n input: RequestInfo | URL,\n init: RequestInit,\n url: string,\n serviceName = 'browser-fetch'\n): Promise<Response> {\n try {\n const { trace, SpanStatusCode } = await import('@opentelemetry/api');\n const tracer = trace.getTracer(serviceName);\n\n // Parse URL for span name\n const parsedUrl = new URL(url, window.location.origin);\n const spanName = `HTTP ${init.method || 'GET'} ${parsedUrl.pathname}`;\n\n const span = tracer.startSpan(spanName);\n\n try {\n // Add request attributes\n span.setAttribute('http.method', init.method || 'GET');\n span.setAttribute('http.url', url);\n span.setAttribute('http.host', parsedUrl.host);\n span.setAttribute('http.scheme', parsedUrl.protocol.replace(':', ''));\n\n const response = await originalFetch(input, init);\n\n // Add response attributes\n span.setAttribute('http.status_code', response.status);\n span.setAttribute('http.response_content_length', response.headers.get('content-length') || 0);\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `HTTP ${response.status} ${response.statusText}`,\n });\n }\n\n return response;\n } catch (error) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Fetch failed',\n });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n throw error;\n } finally {\n span.end();\n }\n } catch {\n // OTEL not available, just make the fetch\n return originalFetch(input, init);\n }\n}\n\n// Store the original fetch function for restoration\nlet storedOriginalFetch: typeof fetch | null = null;\n\n/**\n * Install the fetch interceptor globally.\n * This replaces `globalThis.fetch` with a traced version.\n *\n * @example\n * ```typescript\n * installFetchInterceptor({\n * propagateToUrls: [/api\\.example\\.com/, 'localhost:3000'],\n * excludeUrls: [/google-analytics/, /sentry\\.io/],\n * createSpans: true,\n * });\n *\n * // All subsequent fetch calls will have trace context\n * const response = await fetch('/api/data');\n * ```\n */\nexport function installFetchInterceptor(config: FetchInterceptorConfig): void {\n if (typeof globalThis.fetch === 'undefined') {\n console.warn('[@fountaneengineering/event-manager] fetch is not available in this environment');\n return;\n }\n\n // Store original fetch for later restoration\n const originalFetch = config.originalFetch || globalThis.fetch;\n storedOriginalFetch = originalFetch;\n\n // Replace global fetch\n globalThis.fetch = createTracedFetch({\n ...config,\n originalFetch,\n });\n}\n\n/**\n * Restore the original fetch function.\n * Call this to uninstall the fetch interceptor.\n *\n * @param originalFetch - Optional: pass the original fetch function.\n * If not provided, uses the stored original from installFetchInterceptor.\n */\nexport function uninstallFetchInterceptor(originalFetch?: typeof fetch): void {\n if (typeof globalThis.fetch !== 'undefined') {\n const fetchToRestore = originalFetch || storedOriginalFetch;\n if (fetchToRestore) {\n globalThis.fetch = fetchToRestore;\n storedOriginalFetch = null;\n }\n }\n}\n\n/**\n * Configuration for XMLHttpRequest interceptor\n */\nexport interface XHRInterceptorConfig {\n /** URLs to propagate trace context to */\n propagateToUrls: (string | RegExp)[];\n /** URLs to exclude from trace propagation */\n excludeUrls?: (string | RegExp)[];\n /** Whether to create spans for XHR requests */\n createSpans?: boolean;\n /** Service name for span creation */\n serviceName?: string;\n}\n\n/**\n * Install XMLHttpRequest interceptor for automatic trace context propagation.\n *\n * @example\n * ```typescript\n * installXHRInterceptor({\n * propagateToUrls: [/api\\.example\\.com/],\n * });\n *\n * const xhr = new XMLHttpRequest();\n * xhr.open('GET', 'https://api.example.com/data');\n * xhr.send(); // Trace headers will be automatically added\n * ```\n */\nexport function installXHRInterceptor(config: XHRInterceptorConfig): void {\n if (typeof XMLHttpRequest === 'undefined') {\n console.warn('[@fountaneengineering/event-manager] XMLHttpRequest is not available in this environment');\n return;\n }\n\n const OriginalXHR = XMLHttpRequest;\n const originalOpen = OriginalXHR.prototype.open;\n const originalSend = OriginalXHR.prototype.send;\n\n // Store URL on the XHR instance\n const urlMap = new WeakMap<XMLHttpRequestInstance, string>();\n\n // Override open to capture the URL\n OriginalXHR.prototype.open = function (\n method: string,\n url: string | URL,\n async: boolean = true,\n username?: string | null,\n password?: string | null\n ): void {\n const urlString = typeof url === 'string' ? url : url.href;\n urlMap.set(this, urlString);\n return originalOpen.call(this, method, urlString, async, username, password);\n };\n\n // Override send to inject trace headers\n OriginalXHR.prototype.send = async function (body?: DocumentType | BodyInit | null): Promise<void> {\n const url = urlMap.get(this);\n\n if (url && shouldPropagate(url, config.propagateToUrls, config.excludeUrls)) {\n try {\n const traceHeaders = await getTraceHeaders();\n Object.entries(traceHeaders).forEach(([key, value]) => {\n this.setRequestHeader(key, value);\n });\n } catch {\n // Ignore errors getting trace headers\n }\n }\n\n return originalSend.call(this, body);\n };\n}\n\n/**\n * Configuration for axios interceptor\n */\nexport interface AxiosInterceptorConfig {\n /** URLs to propagate trace context to (matches if URL contains string or matches RegExp) */\n propagateToUrls: (string | RegExp)[];\n /** URLs to exclude from trace propagation (matches if URL contains string or matches RegExp) */\n excludeUrls?: (string | RegExp)[];\n}\n\n/**\n * Create an axios interceptor for trace context propagation.\n * Use this with axios.interceptors.request.use()\n *\n * @example\n * ```typescript\n * import axios from 'axios';\n *\n * axios.interceptors.request.use(\n * createAxiosTraceInterceptor({\n * propagateToUrls: [/api\\.example\\.com/, 'localhost:3000'],\n * excludeUrls: [/google-analytics/, /sentry\\.io/],\n * })\n * );\n * ```\n */\nexport function createAxiosTraceInterceptor(\n config: AxiosInterceptorConfig\n): (axiosConfig: any) => Promise<any> {\n return async (axiosConfig: any) => {\n const url = axiosConfig.url || '';\n const baseURL = axiosConfig.baseURL || '';\n const fullUrl = url.startsWith('http') ? url : `${baseURL}${url}`;\n\n if (shouldPropagate(fullUrl, config.propagateToUrls, config.excludeUrls)) {\n const traceHeaders = await getTraceHeaders();\n axiosConfig.headers = {\n ...axiosConfig.headers,\n ...traceHeaders,\n };\n }\n\n return axiosConfig;\n };\n}\n\n/**\n * Install axios interceptor globally on an axios instance.\n * Convenience function that wraps createAxiosTraceInterceptor.\n *\n * @example\n * ```typescript\n * import axios from 'axios';\n *\n * installAxiosInterceptor(axios, {\n * propagateToUrls: [/api\\.example\\.com/],\n * excludeUrls: [/google-analytics/],\n * });\n * ```\n */\nexport function installAxiosInterceptor(\n axiosInstance: { interceptors: { request: { use: (fn: (config: any) => Promise<any>) => number } } },\n config: AxiosInterceptorConfig\n): number {\n return axiosInstance.interceptors.request.use(createAxiosTraceInterceptor(config));\n}\n\n/**\n * Create headers with trace context for manual injection.\n * Useful when you need to add trace context to custom HTTP clients.\n *\n * @example\n * ```typescript\n * const headers = await getTracedHeaders({ 'Content-Type': 'application/json' });\n * // headers now includes traceparent and any existing headers\n * ```\n */\nexport async function getTracedHeaders(\n existingHeaders: Record<string, string> = {}\n): Promise<Record<string, string>> {\n const traceHeaders = await getTraceHeaders();\n return {\n ...existingHeaders,\n ...traceHeaders,\n };\n}\n","import { BaseConnector } from './base.connector';\nimport type { TelemetryEvent, IdentifyEvent, PageEvent, ConnectorConfig } from '../core/types';\n\nexport interface ConsoleConnectorConfig extends ConnectorConfig {\n prefix?: string;\n}\n\n/**\n * Console connector for debugging during development\n */\nexport class ConsoleConnector extends BaseConnector {\n name = 'console';\n type = 'custom' as const;\n\n private prefix: string;\n\n constructor(config: ConsoleConnectorConfig = {}) {\n super(config);\n this.prefix = config.prefix || '[Telemetry]';\n }\n\n protected setup(): void {\n // No setup needed\n }\n\n track(event: TelemetryEvent): void {\n console.log(`${this.prefix} TRACK:`, event.name, event.payload);\n }\n\n identify(event: IdentifyEvent): void {\n console.log(`${this.prefix} IDENTIFY:`, event.userId, event.traits);\n }\n\n page(event: PageEvent): void {\n console.log(`${this.prefix} PAGE:`, event.name, event.properties);\n }\n}\n\nexport function createConsoleConnector(config?: ConsoleConnectorConfig): ConsoleConnector {\n return new ConsoleConnector(config);\n}\n","import { BaseConnector } from './base.connector';\nimport type { TelemetryEvent, IdentifyEvent, PageEvent, ConnectorConfig } from '../core/types';\n\nexport interface OtelConnectorConfig extends ConnectorConfig {\n serviceName: string;\n endpoint?: string;\n /** Custom span attributes extractor */\n attributesExtractor?: (event: TelemetryEvent) => Record<string, string | number | boolean>;\n}\n\n/**\n * OpenTelemetry connector for distributed tracing\n */\nexport class OtelConnector extends BaseConnector {\n name = 'otel';\n type = 'observability' as const;\n\n private tracer: any; // Type: Tracer from @opentelemetry/api\n private context: any; // Type: ContextAPI from @opentelemetry/api\n private serviceName: string;\n private attributesExtractor?: OtelConnectorConfig['attributesExtractor'];\n\n constructor(config: OtelConnectorConfig) {\n super(config);\n this.serviceName = config.serviceName;\n this.attributesExtractor = config.attributesExtractor;\n }\n\n protected async setup(): Promise<void> {\n // Dynamic import to avoid bundling OTEL if not used\n const api = await import('@opentelemetry/api');\n this.tracer = api.trace.getTracer(this.serviceName);\n this.context = api.context;\n this.log('OTEL tracer initialized');\n }\n\n track(event: TelemetryEvent): void {\n if (!this.tracer) {\n this.log('Tracer not initialized');\n return;\n }\n\n // Pass context.active() to link span to the active HTTP request context\n const span = this.tracer.startSpan(event.name, {}, this.context.active());\n\n // Add default attributes\n span.setAttribute('event.name', event.name);\n span.setAttribute('event.timestamp', event.timestamp || new Date().toISOString());\n\n // Add custom attributes via extractor\n if (this.attributesExtractor) {\n const customAttrs = this.attributesExtractor(event);\n Object.entries(customAttrs).forEach(([key, value]) => {\n span.setAttribute(key, value);\n });\n }\n\n // Add payload as attributes (flatten first level)\n Object.entries(event.payload).forEach(([key, value]) => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n span.setAttribute(`payload.${key}`, value);\n }\n });\n\n // Add meta as attributes\n if (event.meta) {\n Object.entries(event.meta).forEach(([key, value]) => {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n span.setAttribute(`meta.${key}`, value);\n }\n });\n }\n\n span.end();\n this.log('Span created', { name: event.name });\n }\n\n identify(event: IdentifyEvent): void {\n // Store user context for future spans\n this.log('Identify received', { userId: event.userId });\n }\n\n page(event: PageEvent): void {\n this.track({\n name: 'page_view',\n payload: { pageName: event.name, ...event.properties },\n timestamp: event.timestamp,\n });\n }\n}\n\nexport function createOtelConnector(config: OtelConnectorConfig): OtelConnector {\n return new OtelConnector(config);\n}\n","import { BaseConnector } from './base.connector';\nimport type { TelemetryEvent, IdentifyEvent, ConnectorConfig } from '../core/types';\nimport type { MetricMapping } from '../core/config';\n\nexport interface CloudWatchEmfConnectorConfig extends ConnectorConfig {\n /** CloudWatch namespace e.g., 'Virtu3D/Application' */\n namespace: string;\n /** Service name */\n serviceName: string;\n /** AWS Region */\n region?: string;\n /** Map event names to metric configurations */\n metricMappings?: Record<string, MetricMapping>;\n}\n\n/**\n * CloudWatch Embedded Metric Format (EMF) Connector\n *\n * Outputs structured JSON logs that CloudWatch automatically parses into metrics.\n * Works with existing Docker awslogs driver - no additional infrastructure needed.\n *\n * IMPORTANT: This is for CUSTOM BUSINESS METRICS only.\n * Application logs already go to CloudWatch via Docker awslogs driver + Pino.\n * DO NOT use this connector for application logging.\n *\n * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html\n */\nexport class CloudWatchEmfConnector extends BaseConnector {\n name = 'cloudwatch-emf';\n type = 'metrics' as const;\n\n private namespace: string;\n private serviceName: string;\n private region: string;\n private metricMappings: Record<string, MetricMapping>;\n\n constructor(config: CloudWatchEmfConnectorConfig) {\n super(config);\n this.namespace = config.namespace;\n this.serviceName = config.serviceName;\n this.region = config.region || process.env.AWS_REGION || 'us-east-1';\n this.metricMappings = config.metricMappings || {};\n }\n\n protected setup(): void {\n this.log('CloudWatch EMF connector initialized', {\n namespace: this.namespace,\n serviceName: this.serviceName,\n mappedEvents: Object.keys(this.metricMappings),\n });\n }\n\n track(event: TelemetryEvent): void {\n const mapping = this.metricMappings[event.name];\n\n // If no explicit mapping, create a default count metric\n const metricConfig: MetricMapping = mapping || {\n metricName: this.toMetricName(event.name),\n unit: 'Count',\n dimensions: ['service'],\n };\n\n // Extract metric value\n const metricValue = metricConfig.valueField\n ? Number(event.payload[metricConfig.valueField]) || 1\n : 1;\n\n // Build dimensions\n const dimensions: Record<string, string> = {\n service: this.serviceName,\n };\n\n if (metricConfig.dimensions) {\n for (const dim of metricConfig.dimensions) {\n if (dim !== 'service' && event.payload[dim] !== undefined) {\n dimensions[dim] = String(event.payload[dim]);\n }\n }\n }\n\n // Add user/org context if available\n if (event.meta?.userId) dimensions['userId'] = String(event.meta.userId);\n if (event.meta?.orgId) dimensions['orgId'] = String(event.meta.orgId);\n\n // Build EMF structure\n const emfLog = {\n _aws: {\n Timestamp: Date.now(),\n CloudWatchMetrics: [\n {\n Namespace: this.namespace,\n Dimensions: [Object.keys(dimensions)],\n Metrics: [\n {\n Name: metricConfig.metricName,\n Unit: metricConfig.unit,\n },\n ],\n },\n ],\n },\n // Dimensions as top-level fields\n ...dimensions,\n // Metric value\n [metricConfig.metricName]: metricValue,\n // Additional context (not dimensions, just for log inspection)\n eventName: event.name,\n timestamp: event.timestamp,\n payload: event.payload,\n };\n\n // Output EMF JSON - CloudWatch agent or awslogs driver picks this up\n console.log(JSON.stringify(emfLog));\n\n this.log('EMF metric emitted', {\n metric: metricConfig.metricName,\n value: metricValue,\n dimensions,\n });\n }\n\n identify(event: IdentifyEvent): void {\n // Optionally track user identification as a metric\n const emfLog = {\n _aws: {\n Timestamp: Date.now(),\n CloudWatchMetrics: [\n {\n Namespace: this.namespace,\n Dimensions: [['service']],\n Metrics: [\n {\n Name: 'UserIdentified',\n Unit: 'Count',\n },\n ],\n },\n ],\n },\n service: this.serviceName,\n UserIdentified: 1,\n userId: event.userId,\n traits: event.traits,\n };\n\n console.log(JSON.stringify(emfLog));\n }\n\n /**\n * Convert event name to CloudWatch metric name\n * e.g., 'ai_chat_completed' -> 'AiChatCompleted'\n */\n private toMetricName(eventName: string): string {\n return eventName\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join('');\n }\n}\n\nexport function createCloudWatchEmfConnector(\n config: CloudWatchEmfConnectorConfig\n): CloudWatchEmfConnector {\n return new CloudWatchEmfConnector(config);\n}\n","/**\n * Connector Factory Registry\n *\n * Maps connector type strings to their factory functions.\n * This allows the router to auto-instantiate connectors from config.\n */\n\nimport type { Connector, ConnectorConfig } from '../core/types';\n\n// Import all built-in connector factories (except Node.js-only connectors)\nimport { ConsoleConnector, type ConsoleConnectorConfig } from '../connectors/console.connector';\nimport { OtelConnector, type OtelConnectorConfig } from '../connectors/otel.connector';\nimport { CloudWatchEmfConnector, type CloudWatchEmfConnectorConfig } from '../connectors/cloudwatch-emf.connector';\n// Mixpanel and PostHog are loaded lazily to avoid bundling Node.js dependencies in browser builds\nimport type { MixpanelConnectorConfig } from '../connectors/mixpanel.connector';\nimport type { PostHogConnectorConfig } from '../connectors/posthog.connector';\n\n/**\n * Factory function type\n */\nexport type ConnectorFactoryFn<TConfig extends ConnectorConfig = ConnectorConfig> = (\n config: TConfig\n) => Connector;\n\n/**\n * Provider configuration for router\n */\nexport interface ProviderConfig {\n /** Unique name for this provider instance */\n name: string;\n /** Provider type - maps to factory */\n type: ConnectorTypeName;\n /** Enable/disable this provider */\n enabled?: boolean;\n /** Provider-specific configuration */\n config?: ConnectorConfig;\n}\n\n/**\n * Built-in connector type names\n */\nexport type ConnectorTypeName =\n | 'console'\n | 'otel'\n | 'otel-browser'\n | 'cloudwatch-emf'\n | 'mixpanel'\n | 'posthog';\n\n/**\n * Factory registry - maps type names to factory functions\n */\nconst factoryRegistry = new Map<string, ConnectorFactoryFn<any>>();\n\n/**\n * Register a connector factory\n */\nexport function registerFactory<TConfig extends ConnectorConfig>(\n typeName: string,\n factory: ConnectorFactoryFn<TConfig>\n): void {\n factoryRegistry.set(typeName, factory);\n}\n\n/**\n * Get a factory by type name\n */\nexport function getFactory(typeName: string): ConnectorFactoryFn | undefined {\n return factoryRegistry.get(typeName);\n}\n\n/**\n * Check if a factory is registered\n */\nexport function hasFactory(typeName: string): boolean {\n return factoryRegistry.has(typeName);\n}\n\n/**\n * Get all registered factory names\n */\nexport function getRegisteredFactories(): string[] {\n return Array.from(factoryRegistry.keys());\n}\n\n/**\n * Create a connector from type and config\n */\nexport function createConnector(typeName: string, config: ConnectorConfig): Connector {\n const factory = factoryRegistry.get(typeName);\n if (!factory) {\n throw new Error(\n `Unknown connector type: \"${typeName}\". ` +\n `Registered types: ${getRegisteredFactories().join(', ')}`\n );\n }\n return factory(config);\n}\n\n/**\n * Create connectors from provider configs\n */\nexport function createConnectorsFromConfig(providers: ProviderConfig[]): Connector[] {\n return providers\n .filter((p) => p.enabled !== false)\n .map((provider) => {\n const connector = createConnector(provider.type, provider.config || {});\n // Override name if provided\n if (provider.name && provider.name !== connector.name) {\n (connector as any).name = provider.name;\n }\n return connector;\n });\n}\n\nregisterFactory<ConsoleConnectorConfig>('console', (config) => new ConsoleConnector(config));\nregisterFactory<OtelConnectorConfig>('otel', (config) => new OtelConnector(config));\nregisterFactory<CloudWatchEmfConnectorConfig>('cloudwatch-emf', (config) => new CloudWatchEmfConnector(config));\n\n// Lazy-load Node.js-only connectors to avoid bundling their dependencies in browser builds\n// Use eval() to hide require() from static bundlers like Vite/Rollup\nregisterFactory<MixpanelConnectorConfig>('mixpanel', (config) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func\n const dynamicRequire = new Function('modulePath', 'return require(modulePath)');\n const { MixpanelConnector } = dynamicRequire('../connectors/mixpanel.connector');\n return new MixpanelConnector(config);\n } catch (err) {\n throw new Error(\n 'Mixpanel connector requires Node.js environment and the \"mixpanel\" package. ' +\n 'Install with: npm install mixpanel'\n );\n }\n});\nregisterFactory<PostHogConnectorConfig>('posthog', (config) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func\n const dynamicRequire = new Function('modulePath', 'return require(modulePath)');\n const { PostHogConnector } = dynamicRequire('../connectors/posthog.connector');\n return new PostHogConnector(config);\n } catch (err) {\n throw new Error(\n 'PostHog connector requires Node.js environment and the \"posthog-node\" package. ' +\n 'Install with: npm install posthog-node'\n );\n }\n});\n\nexport { factoryRegistry };\n","import type {\n Connector,\n ConnectorConfig,\n ConnectorFactory,\n TelemetryEvent,\n IdentifyEvent,\n PageEvent,\n RouterConfig,\n RouterPlugin,\n DispatchResult,\n DispatchResults,\n} from './types';\nimport { createConnectorsFromConfig, type ProviderConfig } from '../factories';\n\n/**\n * Extended router config with providers support\n */\nexport interface TelemetryRouterConfig extends RouterConfig {\n /** Provider configurations - auto-registered on construction */\n providers?: ProviderConfig[];\n}\n\nexport class TelemetryRouter {\n private connectors: Map<string, Connector> = new Map();\n private plugins: RouterPlugin[] = [];\n private config: TelemetryRouterConfig;\n private initialized = false;\n\n constructor(config: TelemetryRouterConfig = {}) {\n this.config = {\n debug: false,\n globalMeta: {},\n ...config,\n };\n this.plugins = config.plugins || [];\n\n // Auto-register connectors from providers config\n if (config.providers && config.providers.length > 0) {\n try {\n const connectors = createConnectorsFromConfig(config.providers);\n for (const connector of connectors) {\n this.registerConnector(connector);\n }\n } catch (error) {\n this.log('Failed to auto-register providers', error);\n }\n }\n }\n\n /**\n * Initialize all registered connectors\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n const initPromises = Array.from(this.connectors.values()).map(\n async (connector) => {\n try {\n await connector.init?.();\n this.log(`Connector initialized: ${connector.name}`);\n } catch (error) {\n this.log(`Failed to initialize connector: ${connector.name}`, error);\n }\n }\n );\n\n await Promise.allSettled(initPromises);\n this.initialized = true;\n }\n\n /**\n * Register a connector instance directly\n */\n registerConnector(connector: Connector): this {\n if (this.connectors.has(connector.name)) {\n this.log(`Connector \"${connector.name}\" already registered, replacing...`);\n }\n this.connectors.set(connector.name, connector);\n this.log(`Connector registered: ${connector.name} (${connector.type})`);\n return this;\n }\n\n /**\n * Register connector using a factory\n */\n use<TConfig extends ConnectorConfig>(factory: ConnectorFactory<TConfig>, config: TConfig): this {\n const connector = factory.create(config);\n return this.registerConnector(connector);\n }\n\n /**\n * Unregister a connector by name\n */\n unregisterConnector(name: string): this {\n const connector = this.connectors.get(name);\n if (connector) {\n connector.shutdown?.();\n this.connectors.delete(name);\n this.log(`Connector unregistered: ${name}`);\n }\n return this;\n }\n\n /**\n * Add a plugin\n */\n addPlugin(plugin: RouterPlugin): this {\n this.plugins.push(plugin);\n this.log(`Plugin added: ${plugin.name}`);\n return this;\n }\n\n /**\n * Track a custom event\n */\n async track(eventName: string, payload: Record<string, unknown> = {}): Promise<DispatchResults> {\n const event: TelemetryEvent = {\n name: eventName,\n payload,\n timestamp: new Date().toISOString(),\n meta: { ...this.config.globalMeta },\n };\n\n return this.dispatch('track', event);\n }\n\n /**\n * Identify a user\n */\n async identify(userId: string, traits: Record<string, unknown> = {}): Promise<DispatchResults> {\n const event: IdentifyEvent = {\n userId,\n traits,\n timestamp: new Date().toISOString(),\n };\n\n const telemetryEvent: TelemetryEvent = {\n name: 'identify',\n payload: { userId, traits },\n timestamp: event.timestamp,\n meta: { ...this.config.globalMeta, userId },\n };\n\n return this.dispatch('identify', telemetryEvent, event);\n }\n\n /**\n * Track a page view\n */\n async page(name?: string, properties: Record<string, unknown> = {}): Promise<DispatchResults> {\n const event: PageEvent = {\n name,\n properties,\n timestamp: new Date().toISOString(),\n };\n\n const telemetryEvent: TelemetryEvent = {\n name: 'page_view',\n payload: { pageName: name, ...properties },\n timestamp: event.timestamp,\n meta: { ...this.config.globalMeta },\n };\n\n return this.dispatch('page', telemetryEvent, event);\n }\n\n /**\n * Core dispatch method - sends to all connectors in parallel\n */\n private async dispatch(\n method: 'track' | 'identify' | 'page',\n event: TelemetryEvent,\n originalEvent?: IdentifyEvent | PageEvent\n ): Promise<DispatchResults> {\n // Run beforeDispatch plugins\n let processedEvent: TelemetryEvent | null = event;\n for (const plugin of this.plugins) {\n if (plugin.beforeDispatch) {\n processedEvent = plugin.beforeDispatch(processedEvent);\n if (!processedEvent) {\n this.log(`Event blocked by plugin: ${plugin.name}`);\n return {\n event,\n results: [],\n timestamp: new Date().toISOString(),\n };\n }\n }\n }\n\n const connectors = Array.from(this.connectors.values());\n const startTime = Date.now();\n\n // Dispatch to all connectors in parallel\n const settledResults = await Promise.allSettled(\n connectors.map(async (connector) => {\n const connectorStart = Date.now();\n try {\n switch (method) {\n case 'track':\n await connector.track(processedEvent!);\n break;\n case 'identify':\n await connector.identify?.(originalEvent as IdentifyEvent);\n break;\n case 'page':\n await connector.page?.(originalEvent as PageEvent);\n break;\n }\n return {\n connector: connector.name,\n success: true,\n duration: Date.now() - connectorStart,\n };\n } catch (error) {\n return {\n connector: connector.name,\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n duration: Date.now() - connectorStart,\n };\n }\n })\n );\n\n // Process results\n const results: DispatchResult[] = settledResults.map((result) => {\n if (result.status === 'fulfilled') {\n return result.value;\n }\n return {\n connector: 'unknown',\n success: false,\n error: result.reason,\n };\n });\n\n // Log results in debug mode\n this.log(`Event dispatched: ${event.name}`, {\n duration: Date.now() - startTime,\n results: results.map((r) => ({\n connector: r.connector,\n success: r.success,\n })),\n });\n\n // Run afterDispatch plugins\n for (const plugin of this.plugins) {\n plugin.afterDispatch?.(processedEvent!, results);\n }\n\n return {\n event: processedEvent!,\n results,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Get all registered connector names\n */\n getConnectors(): string[] {\n return Array.from(this.connectors.keys());\n }\n\n /**\n * Get connectors by type\n */\n getConnectorsByType(type: Connector['type']): string[] {\n return Array.from(this.connectors.values())\n .filter((c) => c.type === type)\n .map((c) => c.name);\n }\n\n /**\n * Shutdown all connectors\n */\n async shutdown(): Promise<void> {\n const shutdownPromises = Array.from(this.connectors.values()).map(\n async (connector) => {\n try {\n await connector.shutdown?.();\n this.log(`Connector shutdown: ${connector.name}`);\n } catch (error) {\n this.log(`Failed to shutdown connector: ${connector.name}`, error);\n }\n }\n );\n\n await Promise.allSettled(shutdownPromises);\n this.connectors.clear();\n this.initialized = false;\n }\n\n /**\n * Internal logger\n */\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n console.log(`[TelemetryRouter] ${message}`, data || '');\n }\n }\n}\n\n/**\n * Create a new TelemetryRouter instance\n */\nexport function createTelemetryRouter(config?: RouterConfig): TelemetryRouter {\n return new TelemetryRouter(config);\n}\n","/**\n * Telemetry Utilities\n *\n * Common helper functions for telemetry operations.\n */\n\n// Declare globals for cross-platform detection\ndeclare const window: unknown;\ndeclare const document: unknown;\n\n/**\n * Detect current environment (browser or node)\n */\nexport function detectEnvironment(): 'browser' | 'node' {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'browser';\n }\n return 'node';\n}\n\n/**\n * Generate a unique session ID\n */\nexport function generateSessionId(): string {\n const timestamp = Date.now().toString(36);\n const randomPart = Math.random().toString(36).substring(2, 10);\n return `${timestamp}-${randomPart}`;\n}\n\n/**\n * Generate a unique event ID\n */\nexport function generateEventId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Safely stringify an object (handles circular references)\n */\nexport function safeStringify(obj: unknown, space?: number): string {\n const seen = new WeakSet();\n return JSON.stringify(\n obj,\n (key, value) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n }\n // Handle BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n // Handle Error objects\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n return value;\n },\n space\n );\n}\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends object>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (isObject(sourceValue) && isObject(targetValue)) {\n (result as any)[key] = deepMerge(targetValue as object, sourceValue as object);\n } else if (sourceValue !== undefined) {\n (result as any)[key] = sourceValue;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check if value is a plain object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Sanitize sensitive fields from payload\n */\nexport function sanitizePayload(\n payload: Record<string, unknown>,\n sensitiveFields: string[] = ['password', 'token', 'secret', 'apiKey', 'api_key', 'authorization']\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(payload)) {\n const lowerKey = key.toLowerCase();\n if (sensitiveFields.some((field) => lowerKey.includes(field.toLowerCase()))) {\n result[key] = '[REDACTED]';\n } else if (isObject(value)) {\n result[key] = sanitizePayload(value as Record<string, unknown>, sensitiveFields);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Extract specific fields from an object\n */\nexport function extractFields<T extends Record<string, unknown>>(\n obj: T,\n fields: (keyof T)[]\n): Partial<T> {\n const result: Partial<T> = {};\n for (const field of fields) {\n if (field in obj) {\n result[field] = obj[field];\n }\n }\n return result;\n}\n\n/**\n * Flatten a nested object into dot-notation keys\n */\nexport function flattenObject(\n obj: Record<string, unknown>,\n prefix = ''\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const newKey = prefix ? `${prefix}.${key}` : key;\n\n if (isObject(value) && Object.keys(value).length > 0) {\n Object.assign(result, flattenObject(value as Record<string, unknown>, newKey));\n } else {\n result[newKey] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n options: {\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n factor?: number;\n } = {}\n): Promise<T> {\n const { maxRetries = 3, initialDelay = 100, maxDelay = 5000, factor = 2 } = options;\n\n let lastError: Error | undefined;\n let delay = initialDelay;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxRetries) {\n break;\n }\n\n await sleep(delay);\n delay = Math.min(delay * factor, maxDelay);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Sleep for a specified duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, delay);\n };\n}\n\n/**\n * Batch items and process in chunks\n */\nexport async function processBatch<T, R>(\n items: T[],\n processor: (batch: T[]) => Promise<R>,\n batchSize = 10\n): Promise<R[]> {\n const results: R[] = [];\n\n for (let i = 0; i < items.length; i += batchSize) {\n const batch = items.slice(i, i + batchSize);\n const result = await processor(batch);\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Create a simple in-memory cache with TTL\n */\nexport function createCache<T>(defaultTtl = 60000) {\n const cache = new Map<string, { value: T; expires: number }>();\n\n return {\n get(key: string): T | undefined {\n const entry = cache.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expires) {\n cache.delete(key);\n return undefined;\n }\n return entry.value;\n },\n\n set(key: string, value: T, ttl = defaultTtl): void {\n cache.set(key, { value, expires: Date.now() + ttl });\n },\n\n delete(key: string): boolean {\n return cache.delete(key);\n },\n\n clear(): void {\n cache.clear();\n },\n\n size(): number {\n return cache.size;\n },\n };\n}\n","/**\n * Browser Entry Point\n *\n * This module provides browser-specific exports for the @fountaneengineering/event-manager library.\n * It includes optimized connectors and interceptors for browser environments.\n *\n * @example\n * ```typescript\n * import {\n * TelemetryRouter,\n * BrowserOtelConnector,\n * installFetchInterceptor,\n * getTraceHeaders,\n * } from '@fountaneengineering/event-manager/browser';\n *\n * // Initialize telemetry\n * const telemetry = new TelemetryRouter({\n * app: 'my-web-app',\n * providers: [\n * {\n * name: 'otel-browser',\n * type: 'otel-browser',\n * config: {\n * serviceName: 'my-web-app',\n * collectorUrl: 'http://localhost:4318/v1/traces',\n * },\n * },\n * ],\n * });\n *\n * // Install fetch interceptor for automatic trace propagation\n * installFetchInterceptor({\n * propagateToUrls: [/api\\.example\\.com/, /localhost:3000/],\n * });\n *\n * // Track events\n * telemetry.track('button_click', { button_id: 'login' });\n * ```\n */\n\n// Browser-specific connector\nexport {\n BrowserOtelConnector,\n createBrowserOtelConnector,\n type BrowserOtelConnectorConfig,\n} from './otel-browser.connector';\n\n// Interceptors for automatic trace propagation\nexport {\n createTracedFetch,\n installFetchInterceptor,\n uninstallFetchInterceptor,\n installXHRInterceptor,\n createAxiosTraceInterceptor,\n installAxiosInterceptor,\n getTracedHeaders,\n type FetchInterceptorConfig,\n type XHRInterceptorConfig,\n type AxiosInterceptorConfig,\n} from './interceptors';\n\n// Re-export context utilities\nexport {\n getTraceHeaders,\n getTraceHeadersSync,\n extractTraceContext,\n withTraceContext,\n startSpan,\n parseTraceparent,\n generateTraceparent,\n generateTraceId,\n generateSpanId,\n type TraceContext,\n} from '../context';\n\n// Re-export core (works in browser too)\nexport {\n TelemetryRouter,\n createTelemetryRouter,\n type TelemetryRouterConfig,\n} from '../core/router';\n\nexport type {\n TelemetryEvent,\n IdentifyEvent,\n PageEvent,\n Connector,\n ConnectorConfig,\n ConnectorType,\n RouterConfig,\n RouterPlugin,\n DispatchResult,\n DispatchResults,\n} from '../core/types';\n\n// Re-export factories for manual connector registration\nexport {\n registerFactory,\n getFactory,\n hasFactory,\n createConnector,\n type ConnectorFactoryFn,\n type ProviderConfig,\n} from '../factories';\n\n// Re-export base connector for custom implementations\nexport { BaseConnector } from '../connectors/base.connector';\n\n// Re-export console connector (works in browser)\nexport { ConsoleConnector, createConsoleConnector } from '../connectors/console.connector';\nexport type { ConsoleConnectorConfig } from '../connectors/console.connector';\n\n// Re-export utilities\nexport {\n detectEnvironment,\n generateSessionId,\n generateEventId,\n safeStringify,\n deepMerge,\n isObject,\n sanitizePayload,\n debounce,\n} from '../utils';\n\n// Register browser-specific factory\nimport { registerFactory } from '../factories';\nimport { BrowserOtelConnector, type BrowserOtelConnectorConfig } from './otel-browser.connector';\n\n// Register the otel-browser factory\nregisterFactory<BrowserOtelConnectorConfig>('otel-browser', (config) => new BrowserOtelConnector(config));\n"]}
|