@burdenoff/be-sdk 2026.1002.2 → 2026.1005.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EventQueueFactory-XRAIXICA.js +7 -0
- package/dist/{EventQueueFactory-J2XXPYXH.js.map → EventQueueFactory-XRAIXICA.js.map} +1 -1
- package/dist/auth/index.d.ts +3 -3
- package/dist/cache/index.d.ts +1 -1
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-QJN4K7LD.js → chunk-3AEU6G6V.js} +3 -3
- package/dist/{chunk-QJN4K7LD.js.map → chunk-3AEU6G6V.js.map} +1 -1
- package/dist/{chunk-G6XPO5D7.js → chunk-7WLOO2VU.js} +4 -4
- package/dist/{chunk-G6XPO5D7.js.map → chunk-7WLOO2VU.js.map} +1 -1
- package/dist/{chunk-Z32KFAPT.js → chunk-AHEXIONU.js} +4 -4
- package/dist/chunk-AHEXIONU.js.map +1 -0
- package/dist/{chunk-LNFGZMDB.js → chunk-CVMQRWCB.js} +3 -3
- package/dist/{chunk-LNFGZMDB.js.map → chunk-CVMQRWCB.js.map} +1 -1
- package/dist/{chunk-CPLFP5JK.js → chunk-E5DTAGCA.js} +2 -2
- package/dist/chunk-E5DTAGCA.js.map +1 -0
- package/dist/{chunk-FYH5IAPR.js → chunk-JRMQ2B3B.js} +4 -4
- package/dist/{chunk-FYH5IAPR.js.map → chunk-JRMQ2B3B.js.map} +1 -1
- package/dist/{chunk-AIBMTE56.js → chunk-KXY4RSYI.js} +2 -2
- package/dist/{chunk-AIBMTE56.js.map → chunk-KXY4RSYI.js.map} +1 -1
- package/dist/{chunk-TYLVMGOP.js → chunk-L22J3BYR.js} +3 -3
- package/dist/{chunk-TYLVMGOP.js.map → chunk-L22J3BYR.js.map} +1 -1
- package/dist/{chunk-UFXHLQ2T.js → chunk-MLBNB5DB.js} +104 -44
- package/dist/chunk-MLBNB5DB.js.map +1 -0
- package/dist/{chunk-AFLPUWVI.js → chunk-PVNNVIIA.js} +40 -12
- package/dist/chunk-PVNNVIIA.js.map +1 -0
- package/dist/{chunk-VKYGGS2F.js → chunk-RFXAHMY4.js} +3 -3
- package/dist/{chunk-VKYGGS2F.js.map → chunk-RFXAHMY4.js.map} +1 -1
- package/dist/{chunk-XCQN6GH7.js → chunk-VVBA3LQV.js} +3 -3
- package/dist/{chunk-XCQN6GH7.js.map → chunk-VVBA3LQV.js.map} +1 -1
- package/dist/event-queue/index.d.ts +3 -3
- package/dist/event-queue/index.js +3 -3
- package/dist/export/index.js +3 -3
- package/dist/feature-flags/index.d.ts +2 -2
- package/dist/gateway/index.js +2 -2
- package/dist/gateway/security/index.js +1 -1
- package/dist/graph/index.d.ts +3 -3
- package/dist/graph/index.js +4 -4
- package/dist/{graphql-Dxxpbzr3.d.ts → graphql-AaLJfGzz.d.ts} +1 -1
- package/dist/{index-hWpL68Vx.d.ts → index-BKafOO7G.d.ts} +1 -1
- package/dist/{index-MsCFY9Ht.d.ts → index-BSlifT21.d.ts} +3 -3
- package/dist/{index-B8viwwDM.d.ts → index-CfRZtB99.d.ts} +1 -1
- package/dist/{index-CQGCVFmI.d.ts → index-CpXKka7c.d.ts} +5 -2
- package/dist/{index-BCelo6F3.d.ts → index-Cx5I3ydM.d.ts} +1 -0
- package/dist/{index-Cpr38QiE.d.ts → index-DMlr5R6K.d.ts} +2 -2
- package/dist/{index-By4Rxoj1.d.ts → index-Drvw0QPe.d.ts} +1 -1
- package/dist/{index-BLWIKXin.d.ts → index-Dvv6irk0.d.ts} +1 -1
- package/dist/{index-CUeQCuE5.d.ts → index-_dsCeVat.d.ts} +2 -2
- package/dist/index.d.ts +16 -16
- package/dist/index.js +15 -15
- package/dist/init/index.js +3 -3
- package/dist/instrumentation/index.d.ts +3 -3
- package/dist/instrumentation/index.js +1 -1
- package/dist/logger/index.d.ts +2 -2
- package/dist/notifications/index.d.ts +3 -3
- package/dist/prisma/index.js +3 -3
- package/dist/rbac/index.d.ts +2 -2
- package/dist/resource-caps/index.d.ts +2 -2
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +74 -1
- package/dist/server/index.js.map +1 -1
- package/dist/telemetry/index.d.ts +4 -4
- package/dist/telemetry/index.js +2 -2
- package/dist/tracker/index.d.ts +4 -4
- package/dist/{types-BAHkj1GE.d.ts → types-Biv0uaJk.d.ts} +17 -1
- package/dist/validation/index.js +1 -1
- package/package.json +47 -39
- package/dist/EventQueueFactory-J2XXPYXH.js +0 -7
- package/dist/chunk-AFLPUWVI.js.map +0 -1
- package/dist/chunk-CPLFP5JK.js.map +0 -1
- package/dist/chunk-UFXHLQ2T.js.map +0 -1
- package/dist/chunk-Z32KFAPT.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/instrumentation/index.ts","../src/instrumentation/tracer.ts","../src/telemetry/logger-state.ts","../src/instrumentation/types.ts","../src/instrumentation/graphql-plugin.ts","../src/instrumentation/decorators.ts"],"names":["SpanStatus","SpanKind","generateTraceId","bytes","Uint8Array","crypto","getRandomValues","Array","from","map","b","toString","padStart","join","generateSpanId","InMemorySpan","name","traceId","spanId","parentSpanId","kind","startTime","endTime","status","attributes","events","isRecording","onEnd","parentContext","Date","now","setAttribute","key","value","setAttributes","Object","assign","setStatus","message","recordException","error","stack","addEvent","push","timestamp","end","getSpanContext","traceFlags","NoOpSpan","Tracer","serviceName","activeSpans","Map","currentSpan","spanListeners","isEnabled","isInstrumentationConfigInitialized","isFeatureEnabled","startSpan","config","getInstrumentationConfig","tracing","ignoredOperations","includes","parent","span","completedSpan","onSpanEnd","serviceVersion","environment","resourceAttributes","set","startSpanFromContext","context","operationName","operationType","actorId","tenantId","workspaceId","requestId","getCurrentSpan","getTraceContext","spanContext","setCurrentSpan","withSpan","fn","result","Error","withSpanSync","addSpanListener","listener","removeSpanListener","index","indexOf","splice","delete","get","exporterType","logSpan","logger","duration","debug","eventCount","length","getActiveSpanCount","size","clearActiveSpans","clear","globalTracer","initializeTracer","getTracer","isTracerInitialized","extractTraceContext","headers","traceparent","undefined","isArray","parts","split","parseInt","isRemote","injectTraceContext","activeTelemetryLogger","setActiveTelemetryLogger","getActiveTelemetryLogger","STANDARD_METRICS","HTTP_REQUEST_DURATION","description","type","unit","labelKeys","boundaries","HTTP_REQUEST_TOTAL","HTTP_REQUEST_SIZE","HTTP_RESPONSE_SIZE","GRAPHQL_OPERATION_DURATION","GRAPHQL_OPERATION_TOTAL","GRAPHQL_RESOLVER_DURATION","DB_QUERY_DURATION","DB_QUERY_TOTAL","DB_CONNECTION_POOL_SIZE","CACHE_OPERATION_DURATION","CACHE_HIT_TOTAL","CACHE_MISS_TOTAL","OPERATION_DURATION","OPERATION_TOTAL","ACTIVE_OPERATIONS","RESOURCE_CAPS_PLAN_RESOLUTION","RESOURCE_CAPS_ENFORCEMENT","RESOURCE_CAPS_CLIENTLESS_FALLBACK","require","createRequire","url","prometheusPluginFactory","prometheusLoadAttempted","loadPrometheusPlugin","module","usePrometheus","info","warn","createPrometheusPlugin","options","pluginFactory","endpoint","skipIntrospection","metrics","graphql_yoga_http_duration","httpDuration","graphql_envelop_request_duration","requestDuration","graphql_envelop_request_time_summary","graphql_envelop_request","requestCount","graphql_envelop_error_result","errorCount","graphql_envelop_deprecated_field","deprecatedFields","graphql_envelop_phase_parse","parsePhase","graphql_envelop_phase_validate","validatePhase","graphql_envelop_phase_context","contextPhase","graphql_envelop_phase_execute","executePhase","graphql_envelop_phase_subscribe","graphql_envelop_schema_change","graphql_envelop_execute_resolver","resolverMetrics","instrumentResolvers","isPrometheusAvailable","apolloInlineTracePluginFactory","apolloInlineTraceLoadAttempted","loadApolloInlineTracePlugin","useApolloInlineTrace","createApolloInlineTracePlugin","_options","isApolloInlineTraceAvailable","createGraphQLMetrics","def","operationDuration","createHistogram","operationTotal","createCounter","operationErrors","resolverDuration","resolverTotal","graphqlMetrics","getGraphQLMetrics","extractOperationInfo","args","definitions","document","operation","loc","source","body","variables","variableValues","shouldIgnoreOperation","ignoredOps","graphql","createGraphQLInstrumentationPlugin","onExecute","operationInfo","tracer","spanName","SERVER","includeDocument","substring","includeVariables","JSON","stringify","contextValue","_instrumentation","onExecuteDone","hasErrors","errors","labels","operation_type","operation_name","record","inc","ERROR","e","OK","includeResult","instrumentResolver","resolver","typeName","fieldName","includeResolvers","INTERNAL","includeArgs","type_name","field_name","instrumentResolverMap","resolverMap","fields","entries","excludeTypes","includeTypes","fullName","excludeFields","getGraphQLOperationFromContext","instrumentedContext","getGraphQLSpanFromContext","Trace","target","propertyKey","descriptor","originalMethod","className","methodName","String","apply","skip","shouldSkip","extractAttributes","extractedAttrs","Metric","baseName","toLowerCase","durationHistogram","totalCounter","errorCounter","hasError","recordDuration","recordCount","Log","level","logEntry","logExit","logError","baseMessage","entryData","class","method","exitData","shouldSkipInstrumentation","skipOption","startInstrumentationSpan","traceOpts","extractFn","logInstrumentationEntry","logOpts","handleInstrumentationSuccess","handleInstrumentationError","recordInstrumentationMetrics","metricOpts","labelsFn","labelsObj","logInstrumentationExit","Instrument","trace","log","traced","instrumented","getLogger","defaultLogger","initializeInstrumentation","initConfig","initTracer","initMetrics","getTracerFn","getMetricsFn","getConfig","isInstrumentationInitialized","isConfigInit","isTracerInit","isMetricsInit","resetInstrumentation","resetConfig","resetMetrics","setupInstrumentation","plugins","useApollo","apolloPlugin","prometheusPlugin","prometheus"],"mappings":"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","file":"chunk-CPLFP5JK.js","sourcesContent":["/**\n * Instrumentation Module\n *\n * Comprehensive OpenTelemetry instrumentation utilities for\n * Burdenoff microservices including tracing, metrics, and logging.\n *\n * @module instrumentation\n * @category Observability\n *\n * @example\n * ```typescript\n * import {\n * initializeInstrumentation,\n * getTracer,\n * createCounter,\n * createGraphQLInstrumentationPlugin,\n * Trace,\n * Instrument,\n * } from '@burdenoff/be-sdk/instrumentation';\n *\n * // Initialize instrumentation\n * const { tracer, metrics } = initializeInstrumentation('my-service');\n *\n * // Create a span\n * await tracer.withSpan('operation', async (span) => {\n * span.setAttribute('key', 'value');\n * // ... operation logic\n * });\n *\n * // Use decorators\n * class MyService {\n * @Trace()\n * async myMethod() { ... }\n *\n * @Instrument({ tracing: true, metrics: true, logging: true })\n * async trackedMethod() { ... }\n * }\n * ```\n */\n\n// Internal imports for initialization functions\nimport {\n getInstrumentationConfig as getConfig,\n initializeInstrumentationConfig as initConfig,\n isInstrumentationConfigInitialized as isConfigInit,\n resetInstrumentationConfig as resetConfig,\n} from './config.js';\nimport {\n getMetricsRegistry as getMetricsFn,\n initializeMetricsRegistry as initMetrics,\n isMetricsRegistryInitialized as isMetricsInit,\n resetMetricsRegistry as resetMetrics,\n} from './metrics-collector.js';\nimport {\n getTracer as getTracerFn,\n initializeTracer as initTracer,\n isTracerInitialized as isTracerInit,\n} from './tracer.js';\nimport { logger as defaultLogger, type Logger } from '../logger/index.js';\nimport { getActiveTelemetryLogger } from '../telemetry/logger-state.js';\n\n// ============================================================================\n// Simplified Setup API\n// ============================================================================\n\nimport {\n createApolloInlineTracePlugin,\n createPrometheusPlugin,\n type PrometheusPluginOptions,\n} from './graphql-plugin.js';\n\n// Configuration exports\nexport {\n buildDatabaseConfig,\n buildFeatureFlags,\n buildGraphQLConfig,\n buildInstrumentationConfig,\n buildMetricsConfig,\n buildTracingConfig,\n DEFAULT_CACHE_CONFIG,\n DEFAULT_DATABASE_CONFIG,\n DEFAULT_EVENT_QUEUE_CONFIG,\n DEFAULT_FEATURE_FLAGS,\n DEFAULT_GRAPHQL_CONFIG,\n DEFAULT_HTTP_CONFIG,\n DEFAULT_LOGGING_CONFIG,\n DEFAULT_METRICS_CONFIG,\n DEFAULT_TRACING_CONFIG,\n ENV_VARS,\n getInstrumentationConfig,\n initializeInstrumentationConfig,\n isFeatureEnabled,\n isInstrumentationConfigInitialized,\n resetInstrumentationConfig,\n updateInstrumentationConfig,\n} from './config.js';\n\n// Tracer exports\nexport {\n extractTraceContext,\n getTraceContext,\n getTracer,\n initializeTracer,\n injectTraceContext,\n isTracerInitialized,\n type Span,\n type SpanEvent,\n SpanKind,\n SpanStatus,\n startSpan,\n Tracer,\n withSpan,\n} from './tracer.js';\n\n// Metrics exports\nexport {\n type Counter,\n createCounter,\n createGauge,\n createHistogram,\n createUpDownCounter,\n type Gauge,\n getMetricsRegistry,\n type Histogram,\n initializeMetricsRegistry,\n isMetricsRegistryInitialized,\n type MetricLabels,\n MetricsRegistry,\n resetMetricsRegistry,\n type UpDownCounter,\n} from './metrics-collector.js';\n\n// Decorator exports\nexport { Instrument, instrumented, Log, Metric, Trace, traced } from './decorators.js';\n\n// GraphQL plugin exports\nexport {\n type ApolloInlineTraceOptions,\n createApolloInlineTracePlugin,\n createGraphQLInstrumentationPlugin,\n createPrometheusPlugin,\n extractOperationInfo,\n getGraphQLOperationFromContext,\n getGraphQLSpanFromContext,\n type GraphQLOperationInfo,\n type GraphQLOperationType,\n instrumentResolver,\n instrumentResolverMap,\n type InstrumentationContextExtension,\n isApolloInlineTraceAvailable,\n isPrometheusAvailable,\n type PrometheusPluginOptions,\n} from './graphql-plugin.js';\n\n// Type exports\nexport type {\n CacheInstrumentationConfig,\n DatabaseInstrumentationConfig,\n EventQueueInstrumentationConfig,\n GraphQLInstrumentationConfig,\n HTTPInstrumentationConfig,\n InstrumentationConfig,\n InstrumentationFeatureFlags,\n LoggingConfig,\n MetricDefinition,\n MetricsConfig,\n OperationContext,\n SpanAttributes,\n SpanContext,\n TraceContext,\n TracingConfig,\n} from './types.js';\n\nexport { STANDARD_METRICS } from './types.js';\n\n// Re-export logger for convenience\nexport { logger } from '../logger/index.js';\n\nexport function getLogger(): Logger {\n return getActiveTelemetryLogger() ?? defaultLogger;\n}\n\n/**\n * Options for initializing instrumentation\n */\nexport interface InitializeInstrumentationOptions {\n features?: Partial<import('./types.js').InstrumentationFeatureFlags>;\n tracing?: Partial<import('./types.js').TracingConfig>;\n metrics?: Partial<import('./types.js').MetricsConfig>;\n logging?: Partial<import('./types.js').LoggingConfig>;\n graphql?: Partial<import('./types.js').GraphQLInstrumentationConfig>;\n database?: Partial<import('./types.js').DatabaseInstrumentationConfig>;\n http?: Partial<import('./types.js').HTTPInstrumentationConfig>;\n cache?: Partial<import('./types.js').CacheInstrumentationConfig>;\n eventQueue?: Partial<import('./types.js').EventQueueInstrumentationConfig>;\n}\n\n/**\n * Initialize all instrumentation components\n *\n * This is a convenience function that initializes the tracer, metrics registry,\n * and instrumentation configuration in one call.\n *\n * @param serviceName - Name of the service for tracing and metrics\n * @param options - Optional configuration overrides\n * @returns Initialized instrumentation components\n *\n * @example\n * ```typescript\n * const { tracer, metrics, config } = initializeInstrumentation('my-service', {\n * features: { tracing: true, metrics: true, logging: true },\n * tracing: { samplingRate: 0.5 },\n * });\n * ```\n */\nexport function initializeInstrumentation(\n serviceName: string,\n options?: InitializeInstrumentationOptions\n): {\n tracer: import('./tracer.js').Tracer;\n metrics: import('./metrics-collector.js').MetricsRegistry;\n config: import('./types.js').InstrumentationConfig;\n} {\n // Initialize configuration - cast options to the expected type\n // The buildInstrumentationConfig function handles merging with defaults\n initConfig(serviceName, options as unknown as Partial<import('./types.js').InstrumentationConfig>);\n\n // Initialize tracer\n initTracer(serviceName);\n\n // Initialize metrics registry\n initMetrics(serviceName);\n\n return {\n tracer: getTracerFn(),\n metrics: getMetricsFn(),\n config: getConfig(),\n };\n}\n\n/**\n * Check if instrumentation is fully initialized\n */\nexport function isInstrumentationInitialized(): boolean {\n return isConfigInit() && isTracerInit() && isMetricsInit();\n}\n\n/**\n * Reset all instrumentation state (useful for testing)\n */\nexport function resetInstrumentation(): void {\n resetConfig();\n resetMetrics();\n}\n\n/**\n * Options for simplified instrumentation setup\n */\nexport interface SetupInstrumentationOptions extends InitializeInstrumentationOptions {\n /**\n * Use Apollo Federation inline tracing for automatic resolver/field-level tracing.\n * This is the recommended approach for microservices in a federated architecture.\n * @default true\n */\n useApolloInlineTrace?: boolean;\n\n /**\n * Use Prometheus metrics plugin for automatic GraphQL operation metrics.\n * This provides comprehensive metrics including:\n * - HTTP request duration\n * - GraphQL operation duration\n * - Error counts\n * - Execution phase metrics\n * - Optional resolver-level metrics\n * @default true\n */\n usePrometheus?: boolean;\n\n /**\n * Prometheus plugin configuration options.\n * Only used if usePrometheus is true.\n */\n prometheus?: PrometheusPluginOptions;\n}\n\n/**\n * Result of instrumentation setup\n */\nexport interface InstrumentationSetupResult {\n /** Initialized tracer instance */\n tracer: import('./tracer.js').Tracer;\n /** Initialized metrics registry */\n metrics: import('./metrics-collector.js').MetricsRegistry;\n /** Full instrumentation configuration */\n config: import('./types.js').InstrumentationConfig;\n /**\n * GraphQL Yoga plugins to add to your server.\n * These provide automatic tracing and metrics without manual instrumentation.\n */\n plugins: unknown[];\n}\n\n/**\n * Set up complete instrumentation for a microservice with minimal configuration.\n *\n * This is the recommended way to set up instrumentation in Burdenoff microservices.\n * It automatically configures:\n * - OpenTelemetry tracing with Apollo Federation inline traces\n * - Metrics collection\n * - GraphQL operation logging\n *\n * All you need to do is pass the returned plugins to your GraphQL Yoga server.\n *\n * @param serviceName - Name of your service (e.g., 'module-tags')\n * @param options - Optional overrides for defaults\n * @returns Instrumentation components and GraphQL plugins\n *\n * @example\n * ```typescript\n * import { setupInstrumentation } from '@burdenoff/be-sdk/instrumentation';\n * import { createYoga } from 'graphql-yoga';\n *\n * // Simple setup with all defaults\n * const { plugins, tracer, metrics } = setupInstrumentation('module-tags');\n *\n * // Create Yoga server with automatic tracing\n * const yoga = createYoga({\n * schema,\n * plugins: [...plugins, ...otherPlugins],\n * });\n *\n * // With custom overrides\n * const { plugins } = setupInstrumentation('module-tags', {\n * tracing: { samplingRate: 0.5 },\n * metrics: { metricPrefix: 'tags' },\n * });\n * ```\n */\nexport function setupInstrumentation(\n serviceName: string,\n options?: SetupInstrumentationOptions\n): InstrumentationSetupResult {\n // Initialize core instrumentation\n const { tracer, metrics, config } = initializeInstrumentation(serviceName, options);\n\n // Build plugin list\n const plugins: unknown[] = [];\n\n // Add Apollo inline trace plugin for automatic resolver/field-level tracing\n // This provides distributed tracing across federated services\n const useApollo = options?.useApolloInlineTrace ?? true;\n if (useApollo) {\n const apolloPlugin = createApolloInlineTracePlugin();\n if (apolloPlugin) {\n plugins.push(apolloPlugin);\n }\n }\n\n // Add Prometheus metrics plugin for automatic GraphQL metrics\n // This provides comprehensive metrics without manual instrumentation\n const usePrometheus = options?.usePrometheus ?? true;\n if (usePrometheus) {\n const prometheusPlugin = createPrometheusPlugin(options?.prometheus);\n if (prometheusPlugin) {\n plugins.push(prometheusPlugin);\n }\n }\n\n return {\n tracer,\n metrics,\n config,\n plugins,\n };\n}\n","/**\n * Tracer Module\n *\n * OpenTelemetry tracing utilities for distributed tracing across\n * Burdenoff microservices. Provides span creation, context propagation,\n * and trace management.\n *\n * @module instrumentation/tracer\n * @category Observability\n */\n\nimport { logger } from '../logger/index.js';\nimport { getInstrumentationConfig, isFeatureEnabled, isInstrumentationConfigInitialized } from './config.js';\nimport type { OperationContext, SpanAttributes, SpanContext, TraceContext } from './types.js';\n\n/**\n * Span status\n */\nexport enum SpanStatus {\n UNSET = 0,\n OK = 1,\n ERROR = 2,\n}\n\n/**\n * Span kind\n */\nexport enum SpanKind {\n INTERNAL = 0,\n SERVER = 1,\n CLIENT = 2,\n PRODUCER = 3,\n CONSUMER = 4,\n}\n\n/**\n * Span interface for tracing operations\n */\nexport interface Span {\n /** Span name */\n name: string;\n /** Trace ID */\n traceId: string;\n /** Span ID */\n spanId: string;\n /** Parent span ID */\n parentSpanId?: string;\n /** Span kind */\n kind: SpanKind;\n /** Start time in milliseconds */\n startTime: number;\n /** End time in milliseconds */\n endTime?: number;\n /** Span status */\n status: SpanStatus;\n /** Span attributes */\n attributes: SpanAttributes;\n /** Events recorded in this span */\n events: SpanEvent[];\n /** Whether the span is recording */\n isRecording: boolean;\n\n /** Set an attribute on the span */\n setAttribute(key: string, value: string | number | boolean): Span;\n /** Set multiple attributes on the span */\n setAttributes(attributes: SpanAttributes): Span;\n /** Set the span status */\n setStatus(status: SpanStatus, message?: string): Span;\n /** Record an exception */\n recordException(error: Error): Span;\n /** Add an event to the span */\n addEvent(name: string, attributes?: SpanAttributes): Span;\n /** End the span */\n end(): void;\n /** Get span context for propagation */\n getSpanContext(): SpanContext;\n}\n\n/**\n * Span event\n */\nexport interface SpanEvent {\n name: string;\n timestamp: number;\n attributes?: SpanAttributes;\n}\n\n/**\n * Generate a random trace ID (32 hex characters)\n */\nfunction generateTraceId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\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 */\nfunction generateSpanId(): string {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * In-memory span implementation\n */\nclass InMemorySpan implements Span {\n name: string;\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n kind: SpanKind;\n startTime: number;\n endTime?: number;\n status: SpanStatus = SpanStatus.UNSET;\n attributes: SpanAttributes = {};\n events: SpanEvent[] = [];\n isRecording = true;\n\n private onEnd?: (span: Span) => void;\n\n constructor(\n name: string,\n kind: SpanKind = SpanKind.INTERNAL,\n parentContext?: SpanContext,\n onEnd?: (span: Span) => void\n ) {\n this.name = name;\n this.kind = kind;\n this.startTime = Date.now();\n this.spanId = generateSpanId();\n this.onEnd = onEnd;\n\n if (parentContext) {\n this.traceId = parentContext.traceId;\n this.parentSpanId = parentContext.spanId;\n } else {\n this.traceId = generateTraceId();\n }\n }\n\n setAttribute(key: string, value: string | number | boolean): Span {\n if (this.isRecording) {\n this.attributes[key] = value;\n }\n return this;\n }\n\n setAttributes(attributes: SpanAttributes): Span {\n if (this.isRecording) {\n Object.assign(this.attributes, attributes);\n }\n return this;\n }\n\n setStatus(status: SpanStatus, message?: string): Span {\n this.status = status;\n if (message) {\n this.attributes['status.message'] = message;\n }\n return this;\n }\n\n recordException(error: Error): Span {\n this.status = SpanStatus.ERROR;\n this.attributes['error'] = true;\n this.attributes['error.type'] = error.name;\n this.attributes['error.message'] = error.message;\n if (error.stack) {\n this.attributes['error.stack'] = error.stack;\n }\n this.addEvent('exception', {\n 'exception.type': error.name,\n 'exception.message': error.message,\n });\n return this;\n }\n\n addEvent(name: string, attributes?: SpanAttributes): Span {\n if (this.isRecording) {\n this.events.push({\n name,\n timestamp: Date.now(),\n attributes,\n });\n }\n return this;\n }\n\n end(): void {\n if (!this.isRecording) return;\n\n this.endTime = Date.now();\n this.isRecording = false;\n\n if (this.onEnd) {\n this.onEnd(this);\n }\n }\n\n getSpanContext(): SpanContext {\n return {\n traceId: this.traceId,\n spanId: this.spanId,\n traceFlags: this.status === SpanStatus.ERROR ? 1 : 0,\n };\n }\n}\n\n/**\n * No-op span for when tracing is disabled\n */\nclass NoOpSpan implements Span {\n name = '';\n traceId = '';\n spanId = '';\n kind = SpanKind.INTERNAL;\n startTime = 0;\n status = SpanStatus.UNSET;\n attributes: SpanAttributes = {};\n events: SpanEvent[] = [];\n isRecording = false;\n\n setAttribute(): Span {\n return this;\n }\n setAttributes(): Span {\n return this;\n }\n setStatus(): Span {\n return this;\n }\n recordException(): Span {\n return this;\n }\n addEvent(): Span {\n return this;\n }\n end(): void {}\n getSpanContext(): SpanContext {\n return { traceId: '', spanId: '', traceFlags: 0 };\n }\n}\n\n/**\n * Tracer class for creating and managing spans\n */\nexport class Tracer {\n private serviceName: string;\n private activeSpans: Map<string, Span> = new Map();\n private currentSpan: Span | null = null;\n private spanListeners: Array<(span: Span) => void> = [];\n\n constructor(serviceName: string) {\n this.serviceName = serviceName;\n }\n\n /**\n * Check if tracing is enabled\n */\n isEnabled(): boolean {\n return isInstrumentationConfigInitialized() && isFeatureEnabled('tracing');\n }\n\n /**\n * Start a new span\n */\n startSpan(name: string, kind: SpanKind = SpanKind.INTERNAL, parentContext?: SpanContext): Span {\n if (!this.isEnabled()) {\n return new NoOpSpan();\n }\n\n const config = getInstrumentationConfig();\n\n // Check if operation should be ignored\n if (config.tracing.ignoredOperations?.includes(name)) {\n return new NoOpSpan();\n }\n\n // Use current span as parent if no parent provided\n const parent = parentContext || this.currentSpan?.getSpanContext();\n\n const span = new InMemorySpan(name, kind, parent, (completedSpan) => {\n this.onSpanEnd(completedSpan);\n });\n\n // Add service attributes\n span.setAttributes({\n 'service.name': this.serviceName,\n 'service.version': config.tracing.serviceVersion || '1.0.0',\n 'deployment.environment': config.tracing.environment || 'development',\n });\n\n // Add custom resource attributes\n if (config.tracing.resourceAttributes) {\n span.setAttributes(config.tracing.resourceAttributes);\n }\n\n // Track active span\n this.activeSpans.set(span.spanId, span);\n this.currentSpan = span;\n\n return span;\n }\n\n /**\n * Start a span from operation context\n */\n startSpanFromContext(context: OperationContext, kind: SpanKind = SpanKind.INTERNAL): Span {\n const span = this.startSpan(context.operationName, kind);\n\n if (span.isRecording) {\n span.setAttributes({\n 'operation.type': context.operationType,\n ...(context.actorId && { 'actor.id': context.actorId }),\n ...(context.tenantId && { 'tenant.id': context.tenantId }),\n ...(context.workspaceId && { 'workspace.id': context.workspaceId }),\n ...(context.requestId && { 'request.id': context.requestId }),\n ...context.attributes,\n });\n }\n\n return span;\n }\n\n /**\n * Get current active span\n */\n getCurrentSpan(): Span | null {\n return this.currentSpan;\n }\n\n /**\n * Get current trace context for logging\n */\n getTraceContext(): TraceContext {\n if (!this.currentSpan || !this.isEnabled()) {\n return {};\n }\n\n const spanContext = this.currentSpan.getSpanContext();\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n traceFlags: spanContext.traceFlags,\n parentSpanId: this.currentSpan.parentSpanId,\n };\n }\n\n /**\n * Set current span (for context propagation)\n */\n setCurrentSpan(span: Span): void {\n this.currentSpan = span;\n }\n\n /**\n * Run a function within a span\n */\n async withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n kind: SpanKind = SpanKind.INTERNAL,\n parentContext?: SpanContext\n ): Promise<T> {\n const span = this.startSpan(name, kind, parentContext);\n\n try {\n const result = await fn(span);\n span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n /**\n * Run a synchronous function within a span\n */\n withSpanSync<T>(\n name: string,\n fn: (span: Span) => T,\n kind: SpanKind = SpanKind.INTERNAL,\n parentContext?: SpanContext\n ): T {\n const span = this.startSpan(name, kind, parentContext);\n\n try {\n const result = fn(span);\n span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }\n\n /**\n * Add a listener for completed spans\n */\n addSpanListener(listener: (span: Span) => void): void {\n this.spanListeners.push(listener);\n }\n\n /**\n * Remove a span listener\n */\n removeSpanListener(listener: (span: Span) => void): void {\n const index = this.spanListeners.indexOf(listener);\n if (index !== -1) {\n this.spanListeners.splice(index, 1);\n }\n }\n\n /**\n * Handle span completion\n */\n private onSpanEnd(span: Span): void {\n // Remove from active spans\n this.activeSpans.delete(span.spanId);\n\n // Update current span to parent if this was the current span\n if (this.currentSpan?.spanId === span.spanId) {\n if (span.parentSpanId) {\n this.currentSpan = this.activeSpans.get(span.parentSpanId) || null;\n } else {\n this.currentSpan = null;\n }\n }\n\n // Log span if console exporter enabled\n const config = getInstrumentationConfig();\n if (config.tracing.exporterType === 'console') {\n this.logSpan(span);\n }\n\n // Notify listeners\n for (const listener of this.spanListeners) {\n try {\n listener(span);\n } catch (error) {\n logger.error('[Tracer] Error in span listener:', error);\n }\n }\n }\n\n /**\n * Log span to console (for debugging)\n */\n private logSpan(span: Span): void {\n const duration = span.endTime ? span.endTime - span.startTime : 0;\n\n logger.debug('[Tracer] Span completed', {\n name: span.name,\n traceId: span.traceId,\n spanId: span.spanId,\n parentSpanId: span.parentSpanId,\n kind: SpanKind[span.kind],\n status: SpanStatus[span.status],\n duration: `${duration}ms`,\n attributes: span.attributes,\n eventCount: span.events.length,\n });\n }\n\n /**\n * Get active span count\n */\n getActiveSpanCount(): number {\n return this.activeSpans.size;\n }\n\n /**\n * Clear all active spans (for testing)\n */\n clearActiveSpans(): void {\n this.activeSpans.clear();\n this.currentSpan = null;\n }\n}\n\n/**\n * Global tracer instance\n */\nlet globalTracer: Tracer | null = null;\n\n/**\n * Initialize global tracer\n */\nexport function initializeTracer(serviceName: string): Tracer {\n globalTracer = new Tracer(serviceName);\n return globalTracer;\n}\n\n/**\n * Get global tracer instance\n */\nexport function getTracer(): Tracer {\n if (!globalTracer) {\n // Return a default tracer if not initialized\n globalTracer = new Tracer('unknown-service');\n }\n return globalTracer;\n}\n\n/**\n * Check if tracer is initialized\n */\nexport function isTracerInitialized(): boolean {\n return globalTracer !== null;\n}\n\n/**\n * Convenience function to start a span\n */\nexport function startSpan(name: string, kind: SpanKind = SpanKind.INTERNAL, parentContext?: SpanContext): Span {\n return getTracer().startSpan(name, kind, parentContext);\n}\n\n/**\n * Convenience function to run code within a span\n */\nexport async function withSpan<T>(\n name: string,\n fn: (span: Span) => Promise<T>,\n kind: SpanKind = SpanKind.INTERNAL\n): Promise<T> {\n return getTracer().withSpan(name, fn, kind);\n}\n\n/**\n * Convenience function to get current trace context\n */\nexport function getTraceContext(): TraceContext {\n return getTracer().getTraceContext();\n}\n\n/**\n * Extract trace context from HTTP headers (W3C Trace Context format)\n */\nexport function extractTraceContext(headers: Record<string, string | string[] | undefined>): SpanContext | undefined {\n const traceparent = headers['traceparent'];\n if (!traceparent) return undefined;\n\n const value = Array.isArray(traceparent) ? traceparent[0] : traceparent;\n if (!value) return undefined;\n\n // Parse W3C traceparent: version-trace_id-parent_id-trace_flags\n const parts = value.split('-');\n if (parts.length !== 4) return undefined;\n\n const [, traceId, spanId, traceFlags] = parts;\n if (!traceId || !spanId || traceId.length !== 32 || spanId.length !== 16) {\n return undefined;\n }\n\n return {\n traceId,\n spanId,\n traceFlags: parseInt(traceFlags || '0', 16),\n isRemote: true,\n };\n}\n\n/**\n * Inject trace context into HTTP headers (W3C Trace Context format)\n */\nexport function injectTraceContext(headers: Record<string, string>, spanContext?: SpanContext): void {\n const context = spanContext || getTracer().getCurrentSpan()?.getSpanContext();\n if (!context || !context.traceId || !context.spanId) return;\n\n // Format: version-trace_id-parent_id-trace_flags\n headers['traceparent'] =\n `00-${context.traceId}-${context.spanId}-${context.traceFlags.toString(16).padStart(2, '0')}`;\n}\n","import type { Logger } from '../logger/index.js';\n\nlet activeTelemetryLogger: Logger | undefined;\n\nexport function setActiveTelemetryLogger(logger: Logger): void {\n activeTelemetryLogger = logger;\n}\n\nexport function getActiveTelemetryLogger(): Logger | undefined {\n return activeTelemetryLogger;\n}\n","/**\n * Instrumentation Types\n *\n * Type definitions for OpenTelemetry instrumentation configuration\n * and utilities used across all Burdenoff microservices.\n *\n * @module instrumentation/types\n * @category Observability\n */\n\n/**\n * Instrumentation feature flags for conditional enable/disable\n */\nexport interface InstrumentationFeatureFlags {\n /** Enable distributed tracing with spans */\n tracing: boolean;\n /** Enable metrics collection (counters, histograms, gauges) */\n metrics: boolean;\n /** Enable enhanced logging with trace context */\n logging: boolean;\n /** Enable GraphQL resolver instrumentation */\n graphql: boolean;\n /** Enable database query instrumentation */\n database: boolean;\n /** Enable HTTP request/response instrumentation */\n http: boolean;\n /** Enable cache operation instrumentation */\n cache: boolean;\n /** Enable event queue instrumentation */\n eventQueue: boolean;\n}\n\n/**\n * Tracing configuration\n */\nexport interface TracingConfig {\n /** Enable tracing (default: true when instrumentation enabled) */\n enabled: boolean;\n /** Service name for traces */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** Environment (development, staging, production) */\n environment?: string;\n /** OTLP exporter endpoint (e.g., http://localhost:4318) */\n exporterEndpoint?: string;\n /** Exporter type: 'otlp' | 'console' | 'none' */\n exporterType?: 'otlp' | 'console' | 'none';\n /** Trace sampling rate (0-1, default: 1.0) */\n samplingRate?: number;\n /** Propagation format: 'w3c' | 'b3' | 'jaeger' */\n propagationFormat?: 'w3c' | 'b3' | 'jaeger';\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string>;\n /** Ignored routes (won't create spans) */\n ignoredRoutes?: string[];\n /** Ignored operations (won't create spans) */\n ignoredOperations?: string[];\n}\n\n/**\n * Metrics configuration\n */\nexport interface MetricsConfig {\n /** Enable metrics (default: true when instrumentation enabled) */\n enabled: boolean;\n /** Service name for metrics */\n serviceName: string;\n /** OTLP exporter endpoint */\n exporterEndpoint?: string;\n /** Exporter type: 'otlp' | 'prometheus' | 'console' | 'none' */\n exporterType?: 'otlp' | 'prometheus' | 'console' | 'none';\n /** Prometheus metrics endpoint (default: /metrics) */\n prometheusEndpoint?: string;\n /** Prometheus metrics port (default: 9090) */\n prometheusPort?: number;\n /** Metrics collection interval in ms (default: 60000) */\n collectInterval?: number;\n /** Enable default runtime metrics (CPU, memory, etc.) */\n defaultMetrics?: boolean;\n /** Custom metric prefix */\n metricPrefix?: string;\n}\n\n/**\n * Logging configuration for instrumentation\n */\nexport interface LoggingConfig {\n /** Enable trace context in logs */\n enabled: boolean;\n /** Include trace ID in logs */\n includeTraceId?: boolean;\n /** Include span ID in logs */\n includeSpanId?: boolean;\n /** Include trace flags in logs */\n includeTraceFlags?: boolean;\n /** Log level for instrumentation messages */\n level?: 'debug' | 'info' | 'warn' | 'error';\n}\n\n/**\n * GraphQL instrumentation configuration\n */\nexport interface GraphQLInstrumentationConfig {\n /** Enable GraphQL instrumentation */\n enabled: boolean;\n /** Include query/mutation in span attributes */\n includeDocument?: boolean;\n /** Include variables in span attributes (be careful with sensitive data) */\n includeVariables?: boolean;\n /** Include result in span attributes */\n includeResult?: boolean;\n /** Depth to which to serialize document */\n documentDepth?: number;\n /** Operations to ignore */\n ignoredOperations?: string[];\n /** Include resolver-level spans */\n includeResolvers?: boolean;\n /** Max depth for resolver spans */\n resolverSpanDepth?: number;\n}\n\n/**\n * Database instrumentation configuration\n */\nexport interface DatabaseInstrumentationConfig {\n /** Enable database instrumentation */\n enabled: boolean;\n /** Include SQL query in span attributes */\n includeStatement?: boolean;\n /** Include query parameters (be careful with sensitive data) */\n includeParameters?: boolean;\n /** Include row count in span attributes */\n includeRowCount?: boolean;\n /** Slow query threshold in ms (logs warning if exceeded) */\n slowQueryThreshold?: number;\n /** Operations to ignore */\n ignoredOperations?: string[];\n}\n\n/**\n * HTTP instrumentation configuration\n */\nexport interface HTTPInstrumentationConfig {\n /** Enable HTTP instrumentation */\n enabled: boolean;\n /** Include request headers */\n includeRequestHeaders?: boolean;\n /** Include response headers */\n includeResponseHeaders?: boolean;\n /** Include request body (be careful with sensitive data) */\n includeRequestBody?: boolean;\n /** Include response body */\n includeResponseBody?: boolean;\n /** Headers to redact */\n redactedHeaders?: string[];\n /** Routes to ignore */\n ignoredRoutes?: string[];\n /** Request size threshold for body inclusion */\n maxBodySize?: number;\n}\n\n/**\n * Cache instrumentation configuration\n */\nexport interface CacheInstrumentationConfig {\n /** Enable cache instrumentation */\n enabled: boolean;\n /** Include cache key in span attributes */\n includeKey?: boolean;\n /** Include cache value size */\n includeValueSize?: boolean;\n /** Include TTL in span attributes */\n includeTTL?: boolean;\n}\n\n/**\n * Event queue instrumentation configuration\n */\nexport interface EventQueueInstrumentationConfig {\n /** Enable event queue instrumentation */\n enabled: boolean;\n /** Include message payload (be careful with sensitive data) */\n includePayload?: boolean;\n /** Include message headers */\n includeHeaders?: boolean;\n /** Max payload size to include */\n maxPayloadSize?: number;\n}\n\n/**\n * Complete instrumentation configuration\n */\nexport interface InstrumentationConfig {\n /** Enable all instrumentation (master switch) */\n enabled: boolean;\n /** Feature flags for conditional enable/disable */\n features: InstrumentationFeatureFlags;\n /** Tracing configuration */\n tracing: TracingConfig;\n /** Metrics configuration */\n metrics: MetricsConfig;\n /** Logging configuration */\n logging: LoggingConfig;\n /** GraphQL instrumentation configuration */\n graphql: GraphQLInstrumentationConfig;\n /** Database instrumentation configuration */\n database: DatabaseInstrumentationConfig;\n /** HTTP instrumentation configuration */\n http: HTTPInstrumentationConfig;\n /** Cache instrumentation configuration */\n cache: CacheInstrumentationConfig;\n /** Event queue instrumentation configuration */\n eventQueue: EventQueueInstrumentationConfig;\n}\n\n/**\n * Span attributes for consistent naming\n */\nexport interface SpanAttributes {\n /** Service name */\n 'service.name'?: string;\n /** Service version */\n 'service.version'?: string;\n /** Environment */\n 'deployment.environment'?: string;\n /** Operation name */\n 'operation.name'?: string;\n /** Operation type */\n 'operation.type'?: string;\n /** User ID */\n 'user.id'?: string;\n /** Tenant ID */\n 'tenant.id'?: string;\n /** Workspace ID */\n 'workspace.id'?: string;\n /** Request ID */\n 'request.id'?: string;\n /** Error flag */\n error?: boolean;\n /** Error message */\n 'error.message'?: string;\n /** Error type */\n 'error.type'?: string;\n /** Custom attributes */\n [key: string]: string | number | boolean | undefined;\n}\n\n/**\n * Metric types\n */\nexport type MetricType = 'counter' | 'histogram' | 'gauge' | 'upDownCounter';\n\n/**\n * Metric definition\n */\nexport interface MetricDefinition {\n /** Metric name */\n name: string;\n /** Metric description */\n description: string;\n /** Metric type */\n type: MetricType;\n /** Unit of measurement */\n unit?: string;\n /** Label keys */\n labelKeys?: string[];\n /** Histogram boundaries (for histogram type) */\n boundaries?: number[];\n}\n\n/**\n * Predefined metrics for microservices\n */\nexport const STANDARD_METRICS: Record<string, MetricDefinition> = {\n // HTTP metrics\n HTTP_REQUEST_DURATION: {\n name: 'http_request_duration_ms',\n description: 'HTTP request duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['method', 'route', 'status_code'],\n boundaries: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],\n },\n HTTP_REQUEST_TOTAL: {\n name: 'http_requests_total',\n description: 'Total number of HTTP requests',\n type: 'counter',\n labelKeys: ['method', 'route', 'status_code'],\n },\n HTTP_REQUEST_SIZE: {\n name: 'http_request_size_bytes',\n description: 'HTTP request size in bytes',\n type: 'histogram',\n unit: 'bytes',\n labelKeys: ['method', 'route'],\n boundaries: [100, 1000, 10000, 100000, 1000000],\n },\n HTTP_RESPONSE_SIZE: {\n name: 'http_response_size_bytes',\n description: 'HTTP response size in bytes',\n type: 'histogram',\n unit: 'bytes',\n labelKeys: ['method', 'route'],\n boundaries: [100, 1000, 10000, 100000, 1000000],\n },\n\n // GraphQL metrics\n GRAPHQL_OPERATION_DURATION: {\n name: 'graphql_operation_duration_ms',\n description: 'GraphQL operation duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['operation_type', 'operation_name'],\n boundaries: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000],\n },\n GRAPHQL_OPERATION_TOTAL: {\n name: 'graphql_operations_total',\n description: 'Total number of GraphQL operations',\n type: 'counter',\n labelKeys: ['operation_type', 'operation_name', 'status'],\n },\n GRAPHQL_RESOLVER_DURATION: {\n name: 'graphql_resolver_duration_ms',\n description: 'GraphQL resolver duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['type_name', 'field_name'],\n boundaries: [1, 5, 10, 25, 50, 100, 250, 500],\n },\n\n // Database metrics\n DB_QUERY_DURATION: {\n name: 'db_query_duration_ms',\n description: 'Database query duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['operation', 'model'],\n boundaries: [1, 5, 10, 25, 50, 100, 250, 500, 1000],\n },\n DB_QUERY_TOTAL: {\n name: 'db_queries_total',\n description: 'Total number of database queries',\n type: 'counter',\n labelKeys: ['operation', 'model', 'status'],\n },\n DB_CONNECTION_POOL_SIZE: {\n name: 'db_connection_pool_size',\n description: 'Database connection pool size',\n type: 'gauge',\n labelKeys: ['state'],\n },\n\n // Cache metrics\n CACHE_OPERATION_DURATION: {\n name: 'cache_operation_duration_ms',\n description: 'Cache operation duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['operation'],\n boundaries: [0.1, 0.5, 1, 2, 5, 10, 25, 50],\n },\n CACHE_HIT_TOTAL: {\n name: 'cache_hits_total',\n description: 'Total number of cache hits',\n type: 'counter',\n labelKeys: ['cache_type'],\n },\n CACHE_MISS_TOTAL: {\n name: 'cache_misses_total',\n description: 'Total number of cache misses',\n type: 'counter',\n labelKeys: ['cache_type'],\n },\n\n // Business metrics\n OPERATION_DURATION: {\n name: 'operation_duration_ms',\n description: 'Business operation duration in milliseconds',\n type: 'histogram',\n unit: 'ms',\n labelKeys: ['operation', 'status'],\n boundaries: [10, 50, 100, 250, 500, 1000, 2500, 5000, 10000],\n },\n OPERATION_TOTAL: {\n name: 'operations_total',\n description: 'Total number of business operations',\n type: 'counter',\n labelKeys: ['operation', 'status'],\n },\n ACTIVE_OPERATIONS: {\n name: 'active_operations',\n description: 'Number of currently active operations',\n type: 'upDownCounter',\n labelKeys: ['operation'],\n },\n\n // Resource-cap metrics (BOFF-4809)\n RESOURCE_CAPS_PLAN_RESOLUTION: {\n name: 'resource_caps.plan_resolution_total',\n description: 'Total number of billing plan resolutions for resource caps',\n type: 'counter',\n labelKeys: ['result', 'reason'],\n },\n RESOURCE_CAPS_ENFORCEMENT: {\n name: 'resource_caps.enforcement_total',\n description: 'Total number of resource cap enforcement checks',\n type: 'counter',\n labelKeys: ['resource', 'plan_tier', 'result'],\n },\n RESOURCE_CAPS_CLIENTLESS_FALLBACK: {\n name: 'resource_caps.clientless_fallback_total',\n description: 'Total number of times resource caps fell back because no billing source was configured at bootstrap',\n type: 'counter',\n labelKeys: [],\n },\n};\n\n/**\n * Span context for propagation\n */\nexport interface SpanContext {\n traceId: string;\n spanId: string;\n traceFlags: number;\n isRemote?: boolean;\n}\n\n/**\n * Trace context for logging\n */\nexport interface TraceContext {\n traceId?: string;\n spanId?: string;\n traceFlags?: number;\n parentSpanId?: string;\n}\n\n/**\n * Operation context for instrumentation\n */\nexport interface OperationContext {\n /** Operation name */\n operationName: string;\n /** Operation type (query, mutation, subscription, http, db, cache, etc.) */\n operationType: string;\n /** Actor ID */\n actorId?: string;\n /** Tenant ID */\n tenantId?: string;\n /** Workspace ID */\n workspaceId?: string;\n /** Request ID */\n requestId?: string;\n /** Additional attributes */\n attributes?: Record<string, string | number | boolean>;\n}\n","/**\n * GraphQL Instrumentation Plugin\n *\n * Envelop/GraphQL Yoga plugin for comprehensive GraphQL operation\n * instrumentation including tracing, metrics, and logging.\n *\n * Uses Apollo Federation inline trace plugin for automatic resolver/field-level\n * tracing without manual instrumentation code in microservices.\n *\n * @module instrumentation/graphql-plugin\n * @category Observability\n */\n\nimport { createRequire } from 'node:module';\nimport { logger } from '../logger/index.js';\nimport { getInstrumentationConfig, isFeatureEnabled, isInstrumentationConfigInitialized } from './config.js';\nimport { createCounter, createHistogram, type MetricLabels } from './metrics-collector.js';\nimport { getTracer, SpanKind, SpanStatus, type Span } from './tracer.js';\nimport { STANDARD_METRICS } from './types.js';\n\n// Create a require function for loading optional CommonJS modules in ESM context\nconst require = createRequire(import.meta.url);\n\n// ============================================================================\n// Prometheus Metrics Plugin\n// ============================================================================\n\n/**\n * Cached reference to the Prometheus plugin.\n * Uses lazy loading to avoid top-level await (CJS compatibility).\n */\nlet prometheusPluginFactory: ((options: unknown) => unknown) | null | undefined = undefined;\nlet prometheusLoadAttempted = false;\n\n/**\n * Lazily load the Prometheus plugin.\n * Returns null if not available.\n */\nfunction loadPrometheusPlugin(): ((options: unknown) => unknown) | null {\n if (prometheusLoadAttempted) {\n return prometheusPluginFactory ?? null;\n }\n\n prometheusLoadAttempted = true;\n\n try {\n // Use require for synchronous loading of optional peer dependency\n const module = require('@graphql-yoga/plugin-prometheus');\n prometheusPluginFactory = module.usePrometheus;\n if (prometheusPluginFactory) {\n logger.info('[Instrumentation] Successfully loaded @graphql-yoga/plugin-prometheus');\n } else {\n logger.warn('[Instrumentation] @graphql-yoga/plugin-prometheus loaded but usePrometheus not found');\n }\n return prometheusPluginFactory ?? null;\n } catch (error) {\n // Plugin not installed\n logger.warn('[Instrumentation] Failed to load @graphql-yoga/plugin-prometheus:', error);\n prometheusPluginFactory = null;\n return null;\n }\n}\n\n/**\n * Options for the Prometheus metrics plugin\n */\nexport interface PrometheusPluginOptions {\n /** Endpoint to expose metrics (default: '/metrics') */\n endpoint?: string | false;\n /** Skip introspection queries from metrics (default: true) */\n skipIntrospection?: boolean;\n /** Enable HTTP duration metrics (default: true) */\n httpDuration?: boolean;\n /** Enable request duration histogram (default: true) */\n requestDuration?: boolean;\n /** Enable request count metrics (default: true) */\n requestCount?: boolean;\n /** Enable error count metrics (default: true) */\n errorCount?: boolean;\n /** Enable resolver-level metrics (default: false - has performance overhead) */\n resolverMetrics?: boolean;\n /** Specific resolvers to instrument (e.g., ['Query.*', 'Mutation.*']) */\n instrumentResolvers?: string[];\n /** Enable deprecated field tracking (default: true) */\n deprecatedFields?: boolean;\n /** Enable parse phase metrics (default: true) */\n parsePhase?: boolean;\n /** Enable validate phase metrics (default: true) */\n validatePhase?: boolean;\n /** Enable context phase metrics (default: true) */\n contextPhase?: boolean;\n /** Enable execute phase metrics (default: true) */\n executePhase?: boolean;\n}\n\n/**\n * Create the Prometheus metrics plugin for automatic GraphQL metrics.\n *\n * This plugin automatically tracks all GraphQL operations and provides\n * Prometheus-compatible metrics for monitoring dashboards.\n *\n * Metrics exposed:\n * - graphql_yoga_http_duration - HTTP request duration\n * - graphql_envelop_request_duration - Operation duration histogram\n * - graphql_envelop_request - Operation counter\n * - graphql_envelop_error_result - Error counter\n * - graphql_envelop_deprecated_field - Deprecated field usage\n * - graphql_envelop_phase_* - Execution phase metrics\n * - graphql_envelop_execute_resolver - Resolver metrics (if enabled)\n *\n * @example\n * ```typescript\n * import { createPrometheusPlugin } from '@burdenoff/be-sdk/instrumentation';\n *\n * const yoga = createYoga({\n * plugins: [\n * createPrometheusPlugin({\n * endpoint: '/metrics',\n * resolverMetrics: false,\n * }),\n * ],\n * });\n * ```\n */\nexport function createPrometheusPlugin(options?: PrometheusPluginOptions): unknown | null {\n // Check if metrics is enabled\n if (isInstrumentationConfigInitialized() && !isFeatureEnabled('metrics')) {\n logger.debug('[Instrumentation] Metrics disabled, skipping Prometheus plugin');\n return null;\n }\n\n // Lazily load the plugin\n const pluginFactory = loadPrometheusPlugin();\n\n // Check if the plugin is available\n if (!pluginFactory) {\n logger.debug('[Instrumentation] @graphql-yoga/plugin-prometheus not installed, metrics not available');\n return null;\n }\n\n const config = {\n // Expose metrics endpoint (set to false to disable, e.g., for push mode)\n endpoint: options?.endpoint ?? '/metrics',\n // Skip introspection queries from metrics\n skipIntrospection: options?.skipIntrospection ?? true,\n // Metrics configuration\n metrics: {\n // HTTP-level metrics\n graphql_yoga_http_duration: options?.httpDuration ?? true,\n // Operation-level metrics\n graphql_envelop_request_duration: options?.requestDuration ?? true,\n graphql_envelop_request_time_summary: options?.requestDuration ?? true,\n graphql_envelop_request: options?.requestCount ?? true,\n graphql_envelop_error_result: options?.errorCount ?? true,\n graphql_envelop_deprecated_field: options?.deprecatedFields ?? true,\n // Execution phase metrics\n graphql_envelop_phase_parse: options?.parsePhase ?? true,\n graphql_envelop_phase_validate: options?.validatePhase ?? true,\n graphql_envelop_phase_context: options?.contextPhase ?? true,\n graphql_envelop_phase_execute: options?.executePhase ?? true,\n graphql_envelop_phase_subscribe: true,\n // Schema change tracking\n graphql_envelop_schema_change: true,\n // Resolver-level metrics (disabled by default due to performance overhead)\n graphql_envelop_execute_resolver: options?.resolverMetrics ?? false,\n },\n // If resolver metrics enabled, optionally filter which resolvers to instrument\n ...(options?.instrumentResolvers && { instrumentResolvers: options.instrumentResolvers }),\n };\n\n logger.debug('[Instrumentation] Using Prometheus metrics plugin', {\n endpoint: config.endpoint,\n resolverMetrics: options?.resolverMetrics ?? false,\n });\n\n return pluginFactory(config);\n}\n\n/**\n * Check if Prometheus plugin is available\n */\nexport function isPrometheusAvailable(): boolean {\n return loadPrometheusPlugin() !== null;\n}\n\n// ============================================================================\n// Apollo Federation Inline Trace Plugin\n// ============================================================================\n\n/**\n * Cached reference to the Apollo inline trace plugin.\n * Uses lazy loading to avoid top-level await (CJS compatibility).\n */\nlet apolloInlineTracePluginFactory: (() => unknown) | null | undefined = undefined;\nlet apolloInlineTraceLoadAttempted = false;\n\n/**\n * Lazily load the Apollo inline trace plugin.\n * Returns null if not available.\n */\nfunction loadApolloInlineTracePlugin(): (() => unknown) | null {\n if (apolloInlineTraceLoadAttempted) {\n return apolloInlineTracePluginFactory ?? null;\n }\n\n apolloInlineTraceLoadAttempted = true;\n\n try {\n // Use require for synchronous loading of optional peer dependency\n const module = require('@graphql-yoga/plugin-apollo-inline-trace');\n apolloInlineTracePluginFactory = module.useApolloInlineTrace;\n return apolloInlineTracePluginFactory ?? null;\n } catch {\n // Plugin not installed\n apolloInlineTracePluginFactory = null;\n return null;\n }\n}\n\n/**\n * Options for the Apollo Federation inline trace plugin\n */\nexport interface ApolloInlineTraceOptions {\n /** Include detailed field-level traces (default: true) */\n includeFieldTraces?: boolean;\n /** Include variable values in traces (default: false for security) */\n includeVariables?: boolean;\n /** Operations to exclude from tracing */\n excludeOperations?: string[];\n}\n\n/**\n * Create the Apollo Federation inline trace plugin for automatic tracing.\n *\n * This plugin automatically instruments all GraphQL operations and resolvers\n * without requiring manual tracing code. It's designed to work with Apollo Federation\n * and the API Gateway for distributed tracing.\n *\n * @example\n * ```typescript\n * import { createApolloInlineTracePlugin } from '@burdenoff/be-sdk/instrumentation';\n *\n * const yoga = createYoga({\n * plugins: [\n * createApolloInlineTracePlugin(),\n * ],\n * });\n * ```\n */\nexport function createApolloInlineTracePlugin(_options?: ApolloInlineTraceOptions): unknown | null {\n // Check if tracing is enabled\n if (isInstrumentationConfigInitialized() && !isFeatureEnabled('tracing')) {\n logger.debug('[Instrumentation] Tracing disabled, skipping Apollo inline trace plugin');\n return null;\n }\n\n // Lazily load the plugin\n const pluginFactory = loadApolloInlineTracePlugin();\n\n // Check if the plugin is available\n if (!pluginFactory) {\n logger.debug('[Instrumentation] @graphql-yoga/plugin-apollo-inline-trace not installed, using fallback tracing');\n return null;\n }\n\n logger.debug('[Instrumentation] Using Apollo Federation inline trace plugin');\n return pluginFactory();\n}\n\n/**\n * Check if Apollo inline tracing is available\n */\nexport function isApolloInlineTraceAvailable(): boolean {\n return loadApolloInlineTracePlugin() !== null;\n}\n\n/**\n * GraphQL operation type\n */\nexport type GraphQLOperationType = 'query' | 'mutation' | 'subscription';\n\n/**\n * GraphQL operation info\n */\nexport interface GraphQLOperationInfo {\n operationType: GraphQLOperationType;\n operationName: string | null;\n document?: string;\n variables?: Record<string, unknown>;\n}\n\n/**\n * Context extension for instrumentation\n */\nexport interface InstrumentationContextExtension {\n _instrumentation?: {\n span?: Span;\n startTime?: number;\n operationInfo?: GraphQLOperationInfo;\n };\n}\n\n/**\n * Create GraphQL metrics\n */\nfunction createGraphQLMetrics(): {\n operationDuration: ReturnType<typeof createHistogram>;\n operationTotal: ReturnType<typeof createCounter>;\n operationErrors: ReturnType<typeof createCounter>;\n resolverDuration: ReturnType<typeof createHistogram>;\n resolverTotal: ReturnType<typeof createCounter>;\n} {\n const def = STANDARD_METRICS;\n\n return {\n operationDuration: createHistogram(\n def['GRAPHQL_OPERATION_DURATION']?.name || 'graphql_operation_duration_ms',\n def['GRAPHQL_OPERATION_DURATION']?.description || 'GraphQL operation duration',\n def['GRAPHQL_OPERATION_DURATION']?.boundaries\n ),\n operationTotal: createCounter(\n def['GRAPHQL_OPERATION_TOTAL']?.name || 'graphql_operations_total',\n def['GRAPHQL_OPERATION_TOTAL']?.description || 'Total GraphQL operations'\n ),\n operationErrors: createCounter('graphql_operation_errors_total', 'Total GraphQL operation errors'),\n resolverDuration: createHistogram(\n def['GRAPHQL_RESOLVER_DURATION']?.name || 'graphql_resolver_duration_ms',\n def['GRAPHQL_RESOLVER_DURATION']?.description || 'GraphQL resolver duration',\n def['GRAPHQL_RESOLVER_DURATION']?.boundaries\n ),\n resolverTotal: createCounter('graphql_resolvers_total', 'Total GraphQL resolver calls'),\n };\n}\n\n// Lazy-initialized metrics\nlet graphqlMetrics: ReturnType<typeof createGraphQLMetrics> | null = null;\n\nfunction getGraphQLMetrics(): ReturnType<typeof createGraphQLMetrics> {\n if (!graphqlMetrics) {\n graphqlMetrics = createGraphQLMetrics();\n }\n return graphqlMetrics;\n}\n\n/**\n * Extract operation info from GraphQL execution args\n */\nexport function extractOperationInfo(args: {\n document?: { loc?: { source?: { body?: string } }; definitions?: unknown[] };\n operationName?: string | null;\n variableValues?: Record<string, unknown>;\n}): GraphQLOperationInfo {\n let operationType: GraphQLOperationType = 'query';\n let operationName: string | null = args.operationName || null;\n\n // Try to extract operation type from document\n const definitions = args.document?.definitions as\n | Array<{ kind?: string; operation?: string; name?: { value?: string } }>\n | undefined;\n if (definitions && definitions.length > 0) {\n for (const def of definitions) {\n if (def.kind === 'OperationDefinition') {\n operationType = (def.operation as GraphQLOperationType) || 'query';\n if (!operationName && def.name?.value) {\n operationName = def.name.value;\n }\n break;\n }\n }\n }\n\n return {\n operationType,\n operationName,\n document: args.document?.loc?.source?.body,\n variables: args.variableValues,\n };\n}\n\n/**\n * Check if operation should be ignored\n */\nfunction shouldIgnoreOperation(operationName: string | null): boolean {\n if (!isInstrumentationConfigInitialized()) return false;\n\n const config = getInstrumentationConfig();\n const ignoredOps = config.graphql.ignoredOperations || [];\n\n return operationName ? ignoredOps.includes(operationName) : false;\n}\n\n/**\n * GraphQL Yoga plugin for instrumentation\n *\n * @example\n * ```typescript\n * import { createYoga } from 'graphql-yoga';\n * import { createGraphQLInstrumentationPlugin } from '@burdenoff/be-sdk/instrumentation';\n *\n * const yoga = createYoga({\n * plugins: [\n * createGraphQLInstrumentationPlugin(),\n * ],\n * });\n * ```\n */\nexport function createGraphQLInstrumentationPlugin(): {\n onExecute: (args: {\n args: {\n document?: unknown;\n operationName?: string | null;\n variableValues?: Record<string, unknown>;\n contextValue?: unknown;\n };\n }) =>\n | {\n onExecuteDone: (args: { result: unknown; setResult?: (result: unknown) => void }) => void;\n }\n | undefined;\n onSubscribe?: (args: { args: unknown }) => void;\n} {\n return {\n onExecute({\n args,\n }): { onExecuteDone: (args: { result: unknown; setResult?: (result: unknown) => void }) => void } | undefined {\n // Check if GraphQL instrumentation is enabled\n if (!isFeatureEnabled('graphql')) {\n return undefined;\n }\n\n const operationInfo = extractOperationInfo(\n args as {\n document?: { loc?: { source?: { body?: string } }; definitions?: unknown[] };\n operationName?: string | null;\n variableValues?: Record<string, unknown>;\n }\n );\n\n // Check if this operation should be ignored\n if (shouldIgnoreOperation(operationInfo.operationName)) {\n return undefined;\n }\n\n const startTime = Date.now();\n const config = getInstrumentationConfig();\n const metrics = getGraphQLMetrics();\n\n // Start span for tracing\n let span: Span | undefined;\n if (isFeatureEnabled('tracing')) {\n const tracer = getTracer();\n const spanName = operationInfo.operationName\n ? `GraphQL ${operationInfo.operationType} ${operationInfo.operationName}`\n : `GraphQL ${operationInfo.operationType}`;\n\n span = tracer.startSpan(spanName, SpanKind.SERVER);\n\n span.setAttributes({\n 'graphql.operation.type': operationInfo.operationType,\n 'graphql.operation.name': operationInfo.operationName || 'anonymous',\n });\n\n // Include document if configured\n if (config.graphql.includeDocument && operationInfo.document) {\n span.setAttribute('graphql.document', operationInfo.document.substring(0, 2000));\n }\n\n // Include variables if configured (be careful with sensitive data)\n if (config.graphql.includeVariables && operationInfo.variables) {\n try {\n span.setAttribute('graphql.variables', JSON.stringify(operationInfo.variables).substring(0, 500));\n } catch {\n // Ignore serialization errors\n }\n }\n }\n\n // Log operation start\n if (isFeatureEnabled('logging')) {\n logger.debug('[GraphQL] Operation started', {\n type: operationInfo.operationType,\n name: operationInfo.operationName || 'anonymous',\n });\n }\n\n // Store instrumentation context\n const context = args.contextValue as InstrumentationContextExtension | undefined;\n if (context) {\n context._instrumentation = {\n span,\n startTime,\n operationInfo,\n };\n }\n\n return {\n onExecuteDone({ result }): void {\n const duration = Date.now() - startTime;\n const hasErrors =\n result &&\n typeof result === 'object' &&\n 'errors' in result &&\n Array.isArray((result as { errors?: unknown[] }).errors) &&\n (result as { errors: unknown[] }).errors.length > 0;\n\n // Record metrics\n if (isFeatureEnabled('metrics')) {\n const labels: MetricLabels = {\n operation_type: operationInfo.operationType,\n operation_name: operationInfo.operationName || 'anonymous',\n };\n\n metrics.operationDuration.record(duration, labels);\n metrics.operationTotal.inc({ ...labels, status: hasErrors ? 'error' : 'success' });\n\n if (hasErrors) {\n metrics.operationErrors.inc(labels);\n }\n }\n\n // Update span\n if (span) {\n span.setAttribute('graphql.duration_ms', duration);\n\n if (hasErrors) {\n span.setStatus(SpanStatus.ERROR, 'GraphQL operation had errors');\n const errors = (result as { errors?: Array<{ message?: string }> }).errors;\n if (errors && errors.length > 0) {\n span.setAttribute('graphql.error_count', errors.length);\n span.addEvent('graphql.errors', {\n errors: errors.map((e) => e.message || 'Unknown error').join('; '),\n });\n }\n } else {\n span.setStatus(SpanStatus.OK);\n }\n\n // Include result if configured\n if (config.graphql.includeResult) {\n try {\n span.setAttribute('graphql.result', JSON.stringify(result).substring(0, 500));\n } catch {\n // Ignore\n }\n }\n\n span.end();\n }\n\n // Log completion\n if (isFeatureEnabled('logging')) {\n if (hasErrors) {\n logger.warn('[GraphQL] Operation completed with errors', {\n type: operationInfo.operationType,\n name: operationInfo.operationName || 'anonymous',\n duration: `${duration}ms`,\n errorCount: ((result as { errors?: unknown[] }).errors || []).length,\n });\n } else {\n logger.debug('[GraphQL] Operation completed', {\n type: operationInfo.operationType,\n name: operationInfo.operationName || 'anonymous',\n duration: `${duration}ms`,\n });\n }\n }\n },\n };\n },\n };\n}\n\n/**\n * Resolver instrumentation wrapper\n *\n * Use this to wrap individual resolvers for detailed tracing and metrics.\n *\n * @example\n * ```typescript\n * const resolvers = {\n * Query: {\n * getUser: instrumentResolver('Query.getUser', async (parent, args, context) => {\n * // resolver logic\n * }),\n * },\n * };\n * ```\n */\nexport function instrumentResolver<TArgs extends unknown[], TResult>(\n name: string,\n resolver: (...args: TArgs) => Promise<TResult>,\n options?: {\n /** Include resolver arguments in span */\n includeArgs?: boolean;\n /** Include resolver result in span */\n includeResult?: boolean;\n /** Custom span attributes */\n attributes?: Record<string, string | number | boolean>;\n }\n): (...args: TArgs) => Promise<TResult> {\n const [typeName, fieldName] = name.includes('.') ? name.split('.', 2) : ['Unknown', name];\n\n return async (...args: TArgs): Promise<TResult> => {\n // Check if GraphQL instrumentation is enabled\n if (!isFeatureEnabled('graphql')) {\n return resolver(...args);\n }\n\n const config = getInstrumentationConfig();\n\n // Check resolver depth limit\n // (This is a simplified check - in production you'd track nesting level)\n const startTime = Date.now();\n const metrics = getGraphQLMetrics();\n\n // Start span\n let span: Span | undefined;\n if (isFeatureEnabled('tracing') && config.graphql.includeResolvers) {\n const tracer = getTracer();\n span = tracer.startSpan(`Resolver: ${name}`, SpanKind.INTERNAL);\n\n span.setAttributes({\n 'graphql.resolver.type': typeName || 'Unknown',\n 'graphql.resolver.field': fieldName || name,\n ...options?.attributes,\n });\n\n if (options?.includeArgs && args.length > 1) {\n try {\n // args[1] is typically the resolver arguments\n span.setAttribute('graphql.resolver.args', JSON.stringify(args[1]).substring(0, 500));\n } catch {\n // Ignore\n }\n }\n }\n\n try {\n const result = await resolver(...args);\n\n if (span) {\n span.setStatus(SpanStatus.OK);\n if (options?.includeResult) {\n try {\n span.setAttribute('graphql.resolver.result', JSON.stringify(result).substring(0, 500));\n } catch {\n // Ignore\n }\n }\n }\n\n return result;\n } catch (error) {\n if (span && error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n\n if (span) {\n span.end();\n }\n\n // Record metrics\n if (isFeatureEnabled('metrics')) {\n metrics.resolverDuration.record(duration, {\n type_name: typeName || 'Unknown',\n field_name: fieldName || name,\n });\n metrics.resolverTotal.inc({\n type_name: typeName || 'Unknown',\n field_name: fieldName || name,\n });\n }\n }\n };\n}\n\n/**\n * Create instrumented resolvers from a resolver map\n *\n * @example\n * ```typescript\n * const resolvers = instrumentResolverMap({\n * Query: {\n * getUser: async (parent, args, context) => { ... },\n * getUsers: async (parent, args, context) => { ... },\n * },\n * Mutation: {\n * createUser: async (parent, args, context) => { ... },\n * },\n * });\n * ```\n */\nexport function instrumentResolverMap<\n T extends Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>>,\n>(\n resolverMap: T,\n options?: {\n /** Types to include (default: all) */\n includeTypes?: string[];\n /** Types to exclude */\n excludeTypes?: string[];\n /** Fields to exclude (format: \"TypeName.fieldName\") */\n excludeFields?: string[];\n }\n): T {\n const result: Record<string, Record<string, (...args: unknown[]) => Promise<unknown>>> = {};\n\n for (const [typeName, fields] of Object.entries(resolverMap)) {\n // Check if type should be included\n if (options?.excludeTypes?.includes(typeName)) {\n result[typeName] = fields;\n continue;\n }\n if (options?.includeTypes && !options.includeTypes.includes(typeName)) {\n result[typeName] = fields;\n continue;\n }\n\n result[typeName] = {};\n\n for (const [fieldName, resolver] of Object.entries(fields)) {\n const fullName = `${typeName}.${fieldName}`;\n\n // Check if field should be excluded\n if (options?.excludeFields?.includes(fullName)) {\n result[typeName][fieldName] = resolver;\n continue;\n }\n\n // Wrap resolver with instrumentation\n result[typeName][fieldName] = instrumentResolver(fullName, resolver);\n }\n }\n\n return result as T;\n}\n\n/**\n * Get current GraphQL operation info from context\n */\nexport function getGraphQLOperationFromContext(context: unknown): GraphQLOperationInfo | undefined {\n const instrumentedContext = context as InstrumentationContextExtension | undefined;\n return instrumentedContext?._instrumentation?.operationInfo;\n}\n\n/**\n * Get current GraphQL span from context\n */\nexport function getGraphQLSpanFromContext(context: unknown): Span | undefined {\n const instrumentedContext = context as InstrumentationContextExtension | undefined;\n return instrumentedContext?._instrumentation?.span;\n}\n","/**\n * Instrumentation Decorators\n *\n * TypeScript decorators for easy method instrumentation with\n * tracing, metrics, and logging.\n *\n * @module instrumentation/decorators\n * @category Observability\n */\n\nimport { logger } from '../logger/index.js';\nimport { isFeatureEnabled } from './config.js';\nimport { createCounter, createHistogram, type MetricLabels } from './metrics-collector.js';\nimport { getTracer, SpanKind, SpanStatus, type Span } from './tracer.js';\n\n/**\n * Type for span attributes (primitive values only)\n */\nexport type SpanAttributes = Record<string, string | number | boolean>;\n\n/**\n * Options for the @Trace decorator\n */\nexport interface TraceOptions {\n /** Custom span name (default: className.methodName) */\n name?: string;\n /** Span kind */\n kind?: SpanKind;\n /** Additional span attributes */\n attributes?: SpanAttributes;\n /** Include method arguments in span (be careful with sensitive data) */\n includeArgs?: boolean;\n /** Include result in span */\n includeResult?: boolean;\n /** Extract attributes from method arguments */\n extractAttributes?: (args: unknown[]) => SpanAttributes;\n /** Skip tracing for this method */\n skip?: boolean | ((args: unknown[]) => boolean);\n}\n\n/**\n * Options for the @Metric decorator\n */\nexport interface MetricOptions {\n /** Custom metric name (default: operation_duration) */\n name?: string;\n /** Additional labels */\n labels?: MetricLabels | ((args: unknown[], result?: unknown) => MetricLabels);\n /** Record count metric */\n recordCount?: boolean;\n /** Record duration metric */\n recordDuration?: boolean;\n /** Custom histogram boundaries */\n boundaries?: number[];\n}\n\n/**\n * Options for the @Log decorator\n */\nexport interface LogOptions {\n /** Log level */\n level?: 'debug' | 'info' | 'warn' | 'error';\n /** Include method arguments */\n includeArgs?: boolean;\n /** Include result */\n includeResult?: boolean;\n /** Log on entry */\n logEntry?: boolean;\n /** Log on exit */\n logExit?: boolean;\n /** Log on error */\n logError?: boolean;\n /** Custom message */\n message?: string;\n}\n\n/**\n * Combined options for the @Instrument decorator\n */\nexport interface InstrumentOptions {\n /** Operation name */\n operationName?: string;\n /** Operation type */\n operationType?: string;\n /** Tracing options */\n trace?: TraceOptions | boolean;\n /** Metrics options */\n metrics?: MetricOptions | boolean;\n /** Logging options */\n log?: LogOptions | boolean;\n /** Skip instrumentation condition */\n skip?: boolean | ((args: unknown[]) => boolean);\n}\n\n/**\n * @Trace decorator - adds tracing to a method\n *\n * @example\n * ```typescript\n * class UserService {\n * @Trace({ name: 'getUserById', kind: SpanKind.INTERNAL })\n * async getUser(id: string): Promise<User> {\n * // ...\n * }\n * }\n * ```\n */\nexport function Trace(options: TraceOptions = {}): MethodDecorator {\n return function <T>(\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== 'function') {\n return descriptor;\n }\n\n const className = target.constructor.name;\n const methodName = String(propertyKey);\n const spanName = options.name || `${className}.${methodName}`;\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n // Check if tracing is enabled\n if (!isFeatureEnabled('tracing')) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n\n // Check skip condition\n if (options.skip) {\n const shouldSkip = typeof options.skip === 'function' ? options.skip(args) : options.skip;\n if (shouldSkip) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n }\n\n const tracer = getTracer();\n const span = tracer.startSpan(spanName, options.kind || SpanKind.INTERNAL);\n\n // Add base attributes\n span.setAttributes({\n 'code.function': methodName,\n 'code.namespace': className,\n ...options.attributes,\n });\n\n // Extract custom attributes from arguments\n if (options.extractAttributes) {\n try {\n const extractedAttrs = options.extractAttributes(args);\n span.setAttributes(extractedAttrs);\n } catch {\n // Ignore extraction errors\n }\n }\n\n // Include args if configured\n if (options.includeArgs) {\n try {\n span.setAttribute('method.args', JSON.stringify(args).substring(0, 1000));\n } catch {\n // Ignore serialization errors\n }\n }\n\n try {\n const result = await (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n\n // Include result if configured\n if (options.includeResult) {\n try {\n span.setAttribute('method.result', JSON.stringify(result).substring(0, 1000));\n } catch {\n // Ignore serialization errors\n }\n }\n\n span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n } as T;\n\n return descriptor;\n };\n}\n\n/**\n * @Metric decorator - adds metrics to a method\n *\n * @example\n * ```typescript\n * class UserService {\n * @Metric({ name: 'user_fetch', recordCount: true, recordDuration: true })\n * async getUser(id: string): Promise<User> {\n * // ...\n * }\n * }\n * ```\n */\nexport function Metric(options: MetricOptions = {}): MethodDecorator {\n return function <T>(\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== 'function') {\n return descriptor;\n }\n\n const className = target.constructor.name;\n const methodName = String(propertyKey);\n const baseName = options.name || `${className.toLowerCase()}_${methodName.toLowerCase()}`;\n\n // Create metrics (they will be no-ops if metrics are disabled)\n const durationHistogram = createHistogram(\n `${baseName}_duration_ms`,\n `Duration of ${className}.${methodName} in milliseconds`,\n options.boundaries\n );\n const totalCounter = createCounter(`${baseName}_total`, `Total calls to ${className}.${methodName}`);\n const errorCounter = createCounter(`${baseName}_errors_total`, `Total errors in ${className}.${methodName}`);\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n // Check if metrics are enabled\n if (!isFeatureEnabled('metrics')) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n\n const startTime = Date.now();\n let result: unknown;\n let hasError = false;\n\n try {\n result = await (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n return result;\n } catch (error) {\n hasError = true;\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n\n // Get labels\n let labels: MetricLabels = {};\n if (options.labels) {\n labels = typeof options.labels === 'function' ? options.labels(args, result) : options.labels;\n }\n\n // Record metrics\n if (options.recordDuration !== false) {\n durationHistogram.record(duration, labels);\n }\n\n if (options.recordCount !== false) {\n totalCounter.inc({ ...labels, status: hasError ? 'error' : 'success' });\n }\n\n if (hasError) {\n errorCounter.inc(labels);\n }\n }\n } as T;\n\n return descriptor;\n };\n}\n\n/**\n * @Log decorator - adds logging to a method\n *\n * @example\n * ```typescript\n * class UserService {\n * @Log({ level: 'info', logEntry: true, logExit: true })\n * async getUser(id: string): Promise<User> {\n * // ...\n * }\n * }\n * ```\n */\nexport function Log(options: LogOptions = {}): MethodDecorator {\n return function <T>(\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== 'function') {\n return descriptor;\n }\n\n const className = target.constructor.name;\n const methodName = String(propertyKey);\n const level = options.level || 'debug';\n const logEntry = options.logEntry !== false;\n const logExit = options.logExit !== false;\n const logError = options.logError !== false;\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n // Check if logging instrumentation is enabled\n if (!isFeatureEnabled('logging')) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n\n const baseMessage = options.message || `${className}.${methodName}`;\n\n // Log entry\n if (logEntry) {\n const entryData: Record<string, unknown> = {\n class: className,\n method: methodName,\n };\n if (options.includeArgs) {\n entryData['args'] = args;\n }\n logger[level](`[Enter] ${baseMessage}`, entryData);\n }\n\n const startTime = Date.now();\n\n try {\n const result = await (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n\n // Log exit\n if (logExit) {\n const duration = Date.now() - startTime;\n const exitData: Record<string, unknown> = {\n class: className,\n method: methodName,\n duration: `${duration}ms`,\n };\n if (options.includeResult) {\n exitData['result'] = result;\n }\n logger[level](`[Exit] ${baseMessage}`, exitData);\n }\n\n return result;\n } catch (error) {\n // Log error\n if (logError) {\n const duration = Date.now() - startTime;\n logger.error(`[Error] ${baseMessage}`, {\n class: className,\n method: methodName,\n duration: `${duration}ms`,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n throw error;\n }\n } as T;\n\n return descriptor;\n };\n}\n\n/**\n * Helper: Check if instrumentation should be skipped\n */\nfunction shouldSkipInstrumentation(\n skipOption: boolean | ((args: unknown[]) => boolean) | undefined,\n args: unknown[]\n): boolean {\n if (!skipOption) {\n return false;\n }\n return typeof skipOption === 'function' ? skipOption(args) : skipOption;\n}\n\n/**\n * Helper: Start and configure tracing span\n */\nfunction startInstrumentationSpan(\n traceOpts: Record<string, unknown> | null,\n operationName: string,\n operationType: string,\n methodName: string,\n className: string,\n args: unknown[]\n): Span | null {\n if (traceOpts === null || !isFeatureEnabled('tracing')) {\n return null;\n }\n\n const tracer = getTracer();\n const span = tracer.startSpan(\n (traceOpts?.['name'] as string | undefined) || operationName,\n (traceOpts?.['kind'] as SpanKind | undefined) || SpanKind.INTERNAL\n );\n\n span.setAttributes({\n 'operation.type': operationType,\n 'code.function': methodName,\n 'code.namespace': className,\n ...(traceOpts?.['attributes'] as SpanAttributes | undefined),\n });\n\n if (traceOpts?.['extractAttributes']) {\n try {\n const extractFn = traceOpts['extractAttributes'] as (args: unknown[]) => SpanAttributes;\n span.setAttributes(extractFn(args));\n } catch {\n // Ignore extraction errors\n }\n }\n\n return span;\n}\n\n/**\n * Helper: Log method entry\n */\nfunction logInstrumentationEntry(\n logOpts: Record<string, unknown> | null,\n operationName: string,\n operationType: string,\n args: unknown[]\n): void {\n if (logOpts === null || !isFeatureEnabled('logging')) {\n return;\n }\n\n if (logOpts?.['logEntry'] === false) {\n return;\n }\n\n const level = (logOpts?.['level'] as 'debug' | 'info' | 'warn' | 'error' | undefined) || 'debug';\n logger[level](`[Enter] ${operationName}`, {\n operation: operationName,\n type: operationType,\n ...(logOpts?.['includeArgs'] ? { args } : {}),\n });\n}\n\n/**\n * Helper: Handle successful method execution\n */\nfunction handleInstrumentationSuccess(\n span: Span | null,\n traceOpts: Record<string, unknown> | null,\n result: unknown\n): void {\n if (!span) {\n return;\n }\n\n span.setStatus(SpanStatus.OK);\n\n if (traceOpts?.['includeResult']) {\n try {\n span.setAttribute('result', JSON.stringify(result).substring(0, 500));\n } catch {\n // Ignore serialization errors\n }\n }\n}\n\n/**\n * Helper: Handle method error\n */\nfunction handleInstrumentationError(\n span: Span | null,\n logOpts: Record<string, unknown> | null,\n operationName: string,\n operationType: string,\n error: unknown,\n startTime: number\n): void {\n if (span && error instanceof Error) {\n span.recordException(error);\n }\n\n if (logOpts !== null && isFeatureEnabled('logging') && logOpts?.['logError'] !== false) {\n logger.error(`[Error] ${operationName}`, {\n operation: operationName,\n type: operationType,\n error: error instanceof Error ? error.message : String(error),\n duration: `${Date.now() - startTime}ms`,\n });\n }\n}\n\n/**\n * Helper: Record metrics in finally block\n */\nfunction recordInstrumentationMetrics(\n metricOpts: Record<string, unknown> | null,\n durationHistogram: ReturnType<typeof createHistogram> | null,\n totalCounter: ReturnType<typeof createCounter> | null,\n errorCounter: ReturnType<typeof createCounter> | null,\n duration: number,\n args: unknown[],\n result: unknown,\n hasError: boolean\n): void {\n if (metricOpts === null || !isFeatureEnabled('metrics')) {\n return;\n }\n\n const labelsFn = metricOpts?.['labels'] as ((args: unknown[], result?: unknown) => MetricLabels) | undefined;\n const labelsObj = metricOpts?.['labels'] as MetricLabels | undefined;\n const labels = typeof metricOpts?.['labels'] === 'function' ? labelsFn?.(args, result) : labelsObj || {};\n\n if (durationHistogram && metricOpts?.['recordDuration'] !== false) {\n durationHistogram.record(duration, labels);\n }\n\n if (totalCounter && metricOpts?.['recordCount'] !== false) {\n totalCounter.inc({ ...labels, status: hasError ? 'error' : 'success' });\n }\n\n if (errorCounter && hasError) {\n errorCounter.inc(labels);\n }\n}\n\n/**\n * Helper: Log method exit in finally block\n */\nfunction logInstrumentationExit(\n logOpts: Record<string, unknown> | null,\n operationName: string,\n operationType: string,\n duration: number,\n result: unknown,\n hasError: boolean\n): void {\n if (logOpts === null || !isFeatureEnabled('logging')) {\n return;\n }\n\n if (logOpts?.['logExit'] === false || hasError) {\n return;\n }\n\n const level = (logOpts?.['level'] as 'debug' | 'info' | 'warn' | 'error' | undefined) || 'debug';\n logger[level](`[Exit] ${operationName}`, {\n operation: operationName,\n type: operationType,\n duration: `${duration}ms`,\n ...(logOpts?.['includeResult'] ? { result } : {}),\n });\n}\n\n/**\n * @Instrument decorator - combines tracing, metrics, and logging\n *\n * @example\n * ```typescript\n * class UserService {\n * @Instrument({\n * operationName: 'getUser',\n * operationType: 'query',\n * trace: true,\n * metrics: true,\n * log: { level: 'debug' }\n * })\n * async getUser(id: string): Promise<User> {\n * // ...\n * }\n * }\n * ```\n */\nexport function Instrument(options: InstrumentOptions = {}): MethodDecorator {\n return function <T>(\n target: object,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<T>\n ): TypedPropertyDescriptor<T> {\n const originalMethod = descriptor.value;\n\n if (typeof originalMethod !== 'function') {\n return descriptor;\n }\n\n const className = target.constructor.name;\n const methodName = String(propertyKey);\n const operationName = options.operationName || `${className}.${methodName}`;\n const operationType = options.operationType || 'internal';\n\n // Parse options\n let traceOpts: Record<string, unknown> | null;\n if (options.trace === true) {\n traceOpts = {};\n } else if (options.trace === false || options.trace === undefined) {\n traceOpts = null;\n } else {\n traceOpts = options.trace as Record<string, unknown>;\n }\n\n let metricOpts: Record<string, unknown> | null;\n if (options.metrics === true) {\n metricOpts = {};\n } else if (options.metrics === false || options.metrics === undefined) {\n metricOpts = null;\n } else {\n metricOpts = options.metrics as Record<string, unknown>;\n }\n\n let logOpts: Record<string, unknown> | null;\n if (options.log === true) {\n logOpts = {};\n } else if (options.log === false || options.log === undefined) {\n logOpts = null;\n } else {\n logOpts = options.log as Record<string, unknown>;\n }\n\n // Create metrics if enabled\n let durationHistogram: ReturnType<typeof createHistogram> | null = null;\n let totalCounter: ReturnType<typeof createCounter> | null = null;\n let errorCounter: ReturnType<typeof createCounter> | null = null;\n\n if (metricOpts !== null) {\n const baseName =\n (metricOpts?.['name'] as string | undefined) || `${className.toLowerCase()}_${methodName.toLowerCase()}`;\n durationHistogram = createHistogram(`${baseName}_duration_ms`, `Duration of ${operationName} in ms`);\n totalCounter = createCounter(`${baseName}_total`, `Total calls to ${operationName}`);\n errorCounter = createCounter(`${baseName}_errors_total`, `Total errors in ${operationName}`);\n }\n\n descriptor.value = async function (this: unknown, ...args: unknown[]) {\n // Check skip condition\n if (shouldSkipInstrumentation(options.skip, args)) {\n return (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n }\n\n const startTime = Date.now();\n let hasError = false;\n let result: unknown;\n\n // Start span and log entry\n const span = startInstrumentationSpan(traceOpts, operationName, operationType, methodName, className, args);\n logInstrumentationEntry(logOpts, operationName, operationType, args);\n\n try {\n result = await (originalMethod as (...args: unknown[]) => unknown).apply(this, args);\n handleInstrumentationSuccess(span, traceOpts, result);\n return result;\n } catch (error) {\n hasError = true;\n handleInstrumentationError(span, logOpts, operationName, operationType, error, startTime);\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n\n if (span) {\n span.end();\n }\n\n recordInstrumentationMetrics(\n metricOpts,\n durationHistogram,\n totalCounter,\n errorCounter,\n duration,\n args,\n result,\n hasError\n );\n\n logInstrumentationExit(logOpts, operationName, operationType, duration, result, hasError);\n }\n } as T;\n\n return descriptor;\n };\n}\n\n/**\n * Helper function to create a traced function without decorators\n */\nexport function traced<T extends (...args: unknown[]) => Promise<unknown>>(\n name: string,\n fn: T,\n options?: TraceOptions\n): T {\n return (async (...args: unknown[]) => {\n if (!isFeatureEnabled('tracing')) {\n return fn(...args);\n }\n\n const tracer = getTracer();\n const span = tracer.startSpan(name, options?.kind || SpanKind.INTERNAL);\n\n if (options?.attributes) {\n span.setAttributes(options.attributes);\n }\n\n try {\n const result = await fn(...args);\n span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n if (error instanceof Error) {\n span.recordException(error);\n }\n throw error;\n } finally {\n span.end();\n }\n }) as T;\n}\n\n/**\n * Helper function to create an instrumented function without decorators\n */\nexport function instrumented<T extends (...args: unknown[]) => Promise<unknown>>(\n name: string,\n fn: T,\n options?: InstrumentOptions\n): T {\n const operationType = options?.operationType || 'internal';\n\n // Create metrics\n const durationHistogram =\n options?.metrics !== false\n ? createHistogram(`${name.toLowerCase()}_duration_ms`, `Duration of ${name} in ms`)\n : null;\n const totalCounter =\n options?.metrics !== false ? createCounter(`${name.toLowerCase()}_total`, `Total calls to ${name}`) : null;\n\n return (async (...args: unknown[]) => {\n const startTime = Date.now();\n let span: Span | null = null;\n let hasError = false;\n\n // Start span\n if (options?.trace !== false && isFeatureEnabled('tracing')) {\n span = getTracer().startSpan(name, SpanKind.INTERNAL);\n span.setAttribute('operation.type', operationType);\n }\n\n // Log entry\n if (options?.log !== false && isFeatureEnabled('logging')) {\n logger.debug(`[Enter] ${name}`, { operation: name, type: operationType });\n }\n\n try {\n const result = await fn(...args);\n if (span) span.setStatus(SpanStatus.OK);\n return result;\n } catch (error) {\n hasError = true;\n if (span && error instanceof Error) span.recordException(error);\n throw error;\n } finally {\n const duration = Date.now() - startTime;\n if (span) span.end();\n\n // Record metrics\n if (durationHistogram && isFeatureEnabled('metrics')) {\n durationHistogram.record(duration, { status: hasError ? 'error' : 'success' });\n }\n if (totalCounter && isFeatureEnabled('metrics')) {\n totalCounter.inc({ status: hasError ? 'error' : 'success' });\n }\n\n // Log exit/error\n if (options?.log !== false && isFeatureEnabled('logging')) {\n if (hasError) {\n logger.error(`[Error] ${name}`, { operation: name, duration: `${duration}ms` });\n } else {\n logger.debug(`[Exit] ${name}`, { operation: name, duration: `${duration}ms` });\n }\n }\n }\n }) as T;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/event-queue/implementations/redis-streams/trace-context.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventConsumer.ts","../src/event-queue/implementations/redis-streams/serialize.ts","../src/event-queue/implementations/redis-streams/RedisStreamsEventPublisher.ts","../src/event-queue/types/config.ts","../src/event-queue/factory/EventQueueFactory.ts"],"names":["otelApiPromise","loadOtelApi","mod","logger","debug","TRACE_KEYS","injectTraceFields","api","carrier","propagation","inject","context","active","set","c","k","v","err","error","Error","message","String","extractTraceContext","fields","undefined","key","value","extract","get","keys","Object","runWithConsumerSpan","subject","handler","parentCtx","tracer","trace","getTracer","Promise","resolve","reject","startActiveSpan","kind","attributes","span","result","setStatus","code","end","recordException","DEFAULT_BLOCK_MS","DEFAULT_BATCH","REGISTRY_REFRESH_MS","DEFAULT_ACK_WAIT_MS","DEFAULT_MAX_DELIVER","SWEEP_INTERVAL_MS","DELAYQ_INTERVAL_MS","RedisStreamsSubscription","id","randomUUID","receivedCount","processedCount","failedCount","lastActivity","Date","toISOString","unsubscribeFn","unsubscribe","isActive","getStats","messagesReceived","messagesProcessed","messagesFailed","recordReceived","recordProcessed","recordFailed","RedisStreamsEventConsumer","shutdownName","connection","subscriptions","subscriptionLoops","Set","keyPrefix","consumerName","group","maxDeliver","ackWaitMs","maxConcurrent","consumedCount","stopped","sweepTimer","delayqTimer","knownStreams","Map","config","RedisStreamsConnection","type","url","process","env","user","password","name","connectionTimeout","consumer","hostname","pid","ackWait","Math","max","round","registerDisposable","dispose","disconnect","connect","t","setInterval","sweepPending","catch","unref","drainDelayQueues","unregisterDisposable","clearInterval","unsubscribeAll","isConnected","healthCheck","t0","now","pong","ping","status","timestamp","connected","latencyMs","details","length","getStatistics","messagesConsumed","messagesPublished","activeConsumers","ensureStream","_config","ensureConsumer","subscribe","opts","sub","filter","s","push","startId","resolveStartId","options","deliverPolicy","wildcard","isWildcard","handlerFn","stream","streamKey","prefix","ensureGroup","subjectFilter","filteredHandler","evt","matchSubject","ack","spawnLoop","boundary","boundaryOf","refresh","client","getClient","subjects","smembers","registryKey","has","subscribeMultiple","out","pull","raw","xreadgroup","batch","timeout","streamName","entries","rawFields","parsed","parseEntry","toAcknowledgeable","clear","getSubscriptions","processDLQ","dlqGroup","dlq","dlqKey","xgroup","res","listSubjects","_stream","seen","values","members","m","add","policy","msg","includes","loop","makeBlockingClient","warn","setTimeout","nak","i","val","data","JSON","parse","metadata","correlationId","deliveryCount","acked","xack","xdel","delay","score","payload","stringify","zadd","delayQueueKey","term","flat","xadd","isRedelivered","getDeliveryAttempt","size","claimed","xautoclaim","pending","xpending","Array","isArray","lockKey","delayLockKey","got","due","zrangebyscore","member","split","indexOf","slice","zrem","del","safeStringify","_key","toString","RedisStreamsEventPublisher","publishCount","lastPublishTime","maxLen","dedupTtl","parseInt","dedupTtlSeconds","activePublishers","publish","publishInternal","msgId","messageId","enableDedup","enableDeduplication","ok","dedupKey","priority","defaultPriority","source","userId","workspaceId","tenantId","sadd","publishBatch","events","e","publishWithAck","reply","replyKey","replyTo","timeoutMs","xrange","last","payloadIdx","sendReply","expire","QueueType","resolveQueueType","REDIS_STREAMS","redactConnectionUrl","URL","rendered","authorityStart","authorityEnd","schemeEnd","EventQueueFactory","createPublisher","info","createConsumer","createPublisherFromEnv","createConsumerFromEnv","createPublisherForLayer","_layer","serviceName","createConsumerForLayer"],"mappings":"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","file":"chunk-UFXHLQ2T.js","sourcesContent":["/**\n * W3C trace context propagation for Redis Streams entries.\n *\n * Stream entries carry trace context as ordinary fields (`traceparent`,\n * `tracestate`, `baggage`). When `@opentelemetry/api` isn't installed at the\n * consumer, these helpers degrade to no-ops.\n */\nimport { logger } from '../../../logger/index.js';\n\ntype OtelApi = {\n propagation: {\n inject: (\n ctx: unknown,\n carrier: Record<string, string>,\n setter: { set: (c: Record<string, string>, k: string, v: string) => void }\n ) => void;\n extract: (\n ctx: unknown,\n carrier: Record<string, string>,\n getter: {\n get: (c: Record<string, string>, k: string) => string | undefined;\n keys: (c: Record<string, string>) => string[];\n }\n ) => unknown;\n };\n context: { active: () => unknown; with: <T>(ctx: unknown, fn: () => T) => T };\n trace: { getTracer: (name: string, version?: string) => { startActiveSpan: (...args: unknown[]) => unknown } };\n};\n\nlet otelApiPromise: Promise<OtelApi | null> | null = null;\n\nasync function loadOtelApi(): Promise<OtelApi | null> {\n if (otelApiPromise) return otelApiPromise;\n otelApiPromise = (async () => {\n try {\n const mod = (await import('@opentelemetry/api')) as unknown as OtelApi;\n return mod;\n } catch {\n logger.debug('[redis-streams/trace-context] @opentelemetry/api not available; tracing disabled');\n return null;\n }\n })();\n return otelApiPromise;\n}\n\nconst TRACE_KEYS = ['traceparent', 'tracestate', 'baggage'] as const;\n\n/** Inject the active OTel context into a plain record of stream fields. */\nexport async function injectTraceFields(): Promise<Record<string, string>> {\n const api = await loadOtelApi();\n if (!api) return {};\n const carrier: Record<string, string> = {};\n try {\n api.propagation.inject(api.context.active(), carrier, {\n set(c, k, v) {\n c[k] = v;\n },\n });\n } catch (err) {\n logger.debug('[redis-streams/trace-context] inject failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n return carrier;\n}\n\n/** Extract OTel context from stream-entry fields. */\nexport async function extractTraceContext(fields: Record<string, string>): Promise<unknown> {\n const api = await loadOtelApi();\n if (!api) return undefined;\n const carrier: Record<string, string> = {};\n for (const key of TRACE_KEYS) {\n const value = fields[key];\n if (value) carrier[key] = value;\n }\n try {\n return api.propagation.extract(api.context.active(), carrier, {\n get(c, k) {\n return c[k];\n },\n keys(c) {\n return Object.keys(c);\n },\n });\n } catch {\n return undefined;\n }\n}\n\n/** Wrap a consumer handler in a CONSUMER-kind span rooted at the carried trace. */\nexport async function runWithConsumerSpan<T>(\n subject: string,\n fields: Record<string, string>,\n handler: () => Promise<T>\n): Promise<T> {\n const api = await loadOtelApi();\n if (!api) return handler();\n try {\n const parentCtx = await extractTraceContext(fields);\n const tracer = api.trace.getTracer('@burdenoff/be-sdk/redis-streams');\n return await new Promise<T>((resolve, reject) => {\n tracer.startActiveSpan(\n `redis-streams.consume ${subject}`,\n {\n kind: 5,\n attributes: { 'messaging.system': 'redis', 'messaging.destination.name': subject },\n },\n parentCtx,\n async (span: {\n setStatus: (status: { code: number; message?: string }) => void;\n recordException: (err: Error) => void;\n end: () => void;\n }) => {\n try {\n const result = await handler();\n span.setStatus({ code: 1 });\n span.end();\n resolve(result);\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({ code: 2, message: err instanceof Error ? err.message : String(err) });\n span.end();\n reject(err);\n }\n }\n );\n });\n } catch {\n return handler();\n }\n}\n","/**\n * Redis Streams implementation of IEventConsumer.\n *\n * One ioredis client per active subscription handles `XREADGROUP BLOCK` in a\n * background loop, with periodic XAUTOCLAIM reclaiming abandoned pending\n * entries and a small ZSET-based delay queue draining NAK'd messages back\n * into the stream when their delay expires.\n */\nimport { randomUUID } from 'node:crypto';\nimport { hostname } from 'node:os';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventConsumer, ISubscription } from '../../interfaces/IEventConsumer.js';\nimport type { ConsumerConfig, EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\nimport type {\n AcknowledgeableEvent,\n EventHandler,\n EventMetadata,\n StreamConfig,\n SubscriptionOptions,\n} from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport {\n boundaryOf,\n delayLockKey,\n delayQueueKey,\n dlqKey,\n isWildcard,\n matchSubject,\n registryKey,\n streamKey,\n} from './keyspace.js';\nimport { runWithConsumerSpan } from './trace-context.js';\nimport { registerDisposable, unregisterDisposable, type ShutdownDisposable } from '../../../lifecycle/index.js';\n\ninterface ParsedEntry<T = unknown> {\n id: string;\n stream: string;\n subject: string;\n data: T;\n metadata: EventMetadata;\n timestamp: string;\n fields: Record<string, string>;\n deliveryCount: number;\n}\n\nconst DEFAULT_BLOCK_MS = 5000;\nconst DEFAULT_BATCH = 10;\nconst REGISTRY_REFRESH_MS = 10_000;\nconst DEFAULT_ACK_WAIT_MS = 30_000;\nconst DEFAULT_MAX_DELIVER = 3;\nconst SWEEP_INTERVAL_MS = 15_000;\nconst DELAYQ_INTERVAL_MS = 1_000;\n\nclass RedisStreamsSubscription implements ISubscription {\n readonly id = randomUUID();\n private active = true;\n private receivedCount = 0;\n private processedCount = 0;\n private failedCount = 0;\n private lastActivity = new Date().toISOString();\n\n constructor(\n readonly subject: string,\n private readonly unsubscribeFn: () => Promise<void>\n ) {}\n\n async unsubscribe(): Promise<void> {\n if (!this.active) return;\n this.active = false;\n await this.unsubscribeFn();\n }\n\n isActive(): boolean {\n return this.active;\n }\n\n getStats(): {\n messagesReceived: number;\n messagesProcessed: number;\n messagesFailed: number;\n lastActivity: string;\n } {\n return {\n messagesReceived: this.receivedCount,\n messagesProcessed: this.processedCount,\n messagesFailed: this.failedCount,\n lastActivity: this.lastActivity,\n };\n }\n\n recordReceived(): void {\n this.receivedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordProcessed(): void {\n this.processedCount++;\n this.lastActivity = new Date().toISOString();\n }\n recordFailed(): void {\n this.failedCount++;\n this.lastActivity = new Date().toISOString();\n }\n}\n\nexport interface RedisStreamsConsumerConfig extends ConsumerConfig {\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventConsumer implements IEventConsumer, ShutdownDisposable {\n public readonly shutdownName: string;\n private readonly connection: RedisStreamsConnection;\n private subscriptions: RedisStreamsSubscription[] = [];\n private readonly subscriptionLoops: Set<() => Promise<void>> = new Set();\n private readonly keyPrefix: string;\n private readonly consumerName: string;\n private readonly group: string;\n private readonly maxDeliver: number;\n private readonly ackWaitMs: number;\n private readonly maxConcurrent: number;\n private consumedCount = 0;\n private failedCount = 0;\n private lastActivity: Date | null = null;\n private stopped = false;\n private sweepTimer: ReturnType<typeof setInterval> | null = null;\n private delayqTimer: ReturnType<typeof setInterval> | null = null;\n private knownStreams: Map<string, string> = new Map(); // streamKey -> subject\n\n constructor(config: RedisStreamsConsumerConfig) {\n this.connection = new RedisStreamsConnection({\n type: 'redis-streams',\n url: config.url ?? process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n user: config.user,\n password: config.password,\n name: config.name,\n connectionTimeout: config.connectionTimeout,\n });\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n this.group = config.consumer || config.name || 'default-consumer';\n this.consumerName = `${this.group}:${hostname()}:${process.pid}`;\n this.maxDeliver = config.maxDeliver ?? DEFAULT_MAX_DELIVER;\n this.ackWaitMs = config.ackWait ? Math.max(1000, Math.round(config.ackWait / 1_000_000)) : DEFAULT_ACK_WAIT_MS;\n this.maxConcurrent = config.maxConcurrent ?? 5;\n this.shutdownName = `redis-streams-consumer:${config.name ?? this.group}`;\n // The consumer holds one blocking ioredis client per subscribed stream —\n // the bulk of the event-bus connections. Ensure they are all closed on\n // graceful shutdown even if the owner never calls disconnect().\n registerDisposable(this);\n }\n\n /** Close underlying connections on graceful shutdown. */\n dispose(): Promise<void> {\n return this.disconnect();\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n if (!this.sweepTimer) {\n const t = setInterval(() => {\n void this.sweepPending().catch((err) => {\n logger.debug('[RedisStreamsEventConsumer] sweep error', {\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }, SWEEP_INTERVAL_MS);\n t.unref?.();\n this.sweepTimer = t;\n }\n if (!this.delayqTimer) {\n const t = setInterval(() => {\n void this.drainDelayQueues().catch(() => undefined);\n }, DELAYQ_INTERVAL_MS);\n t.unref?.();\n this.delayqTimer = t;\n }\n }\n\n async disconnect(): Promise<void> {\n unregisterDisposable(this);\n this.stopped = true;\n if (this.sweepTimer) clearInterval(this.sweepTimer);\n if (this.delayqTimer) clearInterval(this.delayqTimer);\n await this.unsubscribeAll();\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: {\n type: 'redis-streams',\n subscriptions: this.subscriptions.length,\n },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return Promise.resolve({\n messagesConsumed: this.consumedCount,\n messagesFailed: this.failedCount,\n messagesPublished: 0,\n activeConsumers: this.subscriptions.length,\n lastActivity: this.lastActivity?.toISOString() ?? null,\n details: { type: 'redis-streams', group: this.group },\n });\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async ensureConsumer(_config: ConsumerConfig): Promise<void> {\n return Promise.resolve();\n }\n\n async subscribe<T = unknown>(opts: {\n subject: string;\n handler: EventHandler<T>;\n options?: SubscriptionOptions;\n }): Promise<ISubscription> {\n await this.connect();\n const sub = new RedisStreamsSubscription(opts.subject, async () => {\n this.subscriptions = this.subscriptions.filter((s) => s !== sub);\n });\n this.subscriptions.push(sub);\n\n const startId = this.resolveStartId(opts.options?.deliverPolicy);\n const wildcard = isWildcard(opts.subject);\n const handlerFn = opts.handler as EventHandler<unknown>;\n\n // When the caller provides an explicit stream name (e.g. 'WSPACE_GRAPH_EVENTS'),\n // pin the consumer to that single aggregated stream and filter by subject locally.\n // This mirrors the publisher's stream override logic so both sides use the same key.\n if (opts.options?.stream) {\n const stream = streamKey(opts.options.stream, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n const subjectFilter = wildcard ? opts.subject : null;\n const filteredHandler: EventHandler<unknown> = subjectFilter\n ? async (evt) => {\n if (matchSubject(subjectFilter, evt.subject)) {\n await handlerFn(evt);\n } else {\n await evt.ack();\n }\n }\n : handlerFn;\n this.spawnLoop(sub, stream, opts.subject, filteredHandler);\n return sub;\n }\n\n if (!wildcard) {\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, opts.subject);\n this.spawnLoop(sub, stream, opts.subject, handlerFn);\n } else {\n const boundary = boundaryOf(opts.subject);\n const refresh = async (): Promise<void> => {\n const client = this.connection.getClient();\n const subjects = await client.smembers(registryKey(boundary));\n for (const s of subjects) {\n if (!matchSubject(opts.subject, s)) continue;\n const stream = streamKey(s, { prefix: this.keyPrefix });\n if (this.knownStreams.has(stream)) continue;\n await this.ensureGroup(stream, startId);\n this.knownStreams.set(stream, s);\n this.spawnLoop(sub, stream, s, handlerFn);\n }\n };\n await refresh();\n const t = setInterval(() => {\n if (this.stopped || !sub.isActive()) {\n clearInterval(t);\n return;\n }\n void refresh().catch(() => undefined);\n }, REGISTRY_REFRESH_MS);\n t.unref?.();\n }\n\n return sub;\n }\n\n async subscribeMultiple<T = unknown>(\n subjects: string[],\n handler: EventHandler<T>,\n options?: SubscriptionOptions\n ): Promise<ISubscription[]> {\n const out: ISubscription[] = [];\n for (const subject of subjects) {\n out.push(await this.subscribe({ subject, handler, options }));\n }\n return out;\n }\n\n async pull<T = unknown>(opts: {\n subject: string;\n batch?: number;\n timeout?: number;\n }): Promise<AcknowledgeableEvent<T>[]> {\n await this.connect();\n const stream = streamKey(opts.subject, { prefix: this.keyPrefix });\n await this.ensureGroup(stream, '$');\n const client = this.connection.getClient();\n const raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n opts.batch ?? DEFAULT_BATCH,\n 'BLOCK',\n opts.timeout ?? DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!raw) return [];\n const out: AcknowledgeableEvent<T>[] = [];\n for (const [streamName, entries] of raw) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(streamName, id, rawFields);\n out.push(this.toAcknowledgeable(streamName, id, parsed));\n }\n }\n return out;\n }\n\n async unsubscribeAll(): Promise<void> {\n for (const sub of [...this.subscriptions]) {\n await sub.unsubscribe();\n }\n this.subscriptions = [];\n this.subscriptionLoops.clear();\n }\n\n getSubscriptions(): ISubscription[] {\n return [...this.subscriptions];\n }\n\n async processDLQ<T = unknown>(handler: EventHandler<T>): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const dlqGroup = `${this.group}-dlq`;\n for (const [stream] of this.knownStreams) {\n const dlq = dlqKey(stream);\n try {\n await client.xgroup('CREATE', dlq, dlqGroup, '0', 'MKSTREAM');\n } catch {\n /* already exists */\n }\n const res = (await client.xreadgroup(\n 'GROUP',\n dlqGroup,\n this.consumerName,\n 'COUNT',\n 50,\n 'BLOCK',\n 100,\n 'STREAMS',\n dlq,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n if (!res) continue;\n for (const [, entries] of res) {\n for (const [id, rawFields] of entries) {\n const parsed = this.parseEntry<T>(dlq, id, rawFields);\n const evt = this.toAcknowledgeable<T>(dlq, id, parsed, dlqGroup);\n try {\n await handler(evt);\n } catch (err) {\n logger.error('[RedisStreamsEventConsumer] DLQ handler error', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n }\n }\n\n async listSubjects(_stream?: string): Promise<string[]> {\n await this.connect();\n const client = this.connection.getClient();\n const seen = new Set<string>();\n for (const subject of this.knownStreams.values()) {\n const members = await client.smembers(registryKey(boundaryOf(subject)));\n for (const m of members) seen.add(m);\n }\n return [...seen];\n }\n\n // ---- internals ----\n\n private resolveStartId(policy: SubscriptionOptions['deliverPolicy'] | undefined): string {\n switch (policy) {\n case 'all':\n return '0';\n case 'new':\n return '$';\n case 'last':\n return '$';\n default:\n return '$';\n }\n }\n\n private async ensureGroup(stream: string, startId: string): Promise<void> {\n const client = this.connection.getClient();\n try {\n await client.xgroup('CREATE', stream, this.group, startId, 'MKSTREAM');\n logger.debug('[RedisStreamsEventConsumer] group created', {\n stream,\n group: this.group,\n startId,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (!msg.includes('BUSYGROUP')) {\n throw err;\n }\n }\n }\n\n private spawnLoop(\n sub: RedisStreamsSubscription,\n stream: string,\n subject: string,\n handler: EventHandler<unknown>\n ): void {\n const loop = async (): Promise<void> => {\n const client = await this.connection.makeBlockingClient();\n try {\n while (!this.stopped && sub.isActive()) {\n let raw: Array<[string, Array<[string, string[]]>]> | null = null;\n try {\n raw = (await client.xreadgroup(\n 'GROUP',\n this.group,\n this.consumerName,\n 'COUNT',\n this.maxConcurrent,\n 'BLOCK',\n DEFAULT_BLOCK_MS,\n 'STREAMS',\n stream,\n '>'\n )) as Array<[string, Array<[string, string[]]>]> | null;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) {\n await this.ensureGroup(stream, '$');\n continue;\n }\n logger.warn('[RedisStreamsEventConsumer] read error', { stream, error: msg });\n await new Promise((res) => setTimeout(res, 1000));\n continue;\n }\n if (!raw) continue;\n for (const [, entries] of raw) {\n for (const [id, rawFields] of entries) {\n sub.recordReceived();\n this.consumedCount++;\n this.lastActivity = new Date();\n const parsed = this.parseEntry(stream, id, rawFields);\n const evt = this.toAcknowledgeable(stream, id, parsed);\n try {\n await runWithConsumerSpan(subject, parsed.fields, () => handler(evt));\n sub.recordProcessed();\n } catch (err) {\n sub.recordFailed();\n this.failedCount++;\n logger.error('[RedisStreamsEventConsumer] handler error', {\n subject,\n id,\n error: err instanceof Error ? err.message : String(err),\n });\n // Auto-nak on uncaught throw (re-deliver after ackWait).\n try {\n await evt.nak();\n } catch {\n /* ignore */\n }\n }\n }\n }\n }\n } finally {\n try {\n client.disconnect();\n } catch {\n /* ignore */\n }\n }\n };\n void loop().catch((err) => {\n logger.error('[RedisStreamsEventConsumer] loop crashed', {\n stream,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }\n\n private parseEntry<T>(stream: string, id: string, rawFields: string[]): ParsedEntry<T> {\n const fields: Record<string, string> = {};\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n const key = rawFields[i];\n const val = rawFields[i + 1];\n if (key === undefined || val === undefined) continue;\n fields[key] = val;\n }\n let data: T;\n try {\n data = JSON.parse(fields['payload'] ?? 'null') as T;\n } catch {\n data = fields['payload'] as unknown as T;\n }\n let metadata: EventMetadata;\n try {\n metadata = JSON.parse(fields['metadata'] ?? '{}') as EventMetadata;\n } catch {\n metadata = { correlationId: fields['correlation-id'] ?? '' };\n }\n if (!metadata.correlationId) metadata.correlationId = fields['correlation-id'] ?? '';\n return {\n id,\n stream,\n subject: fields['subject'] ?? '',\n data,\n metadata,\n timestamp: fields['timestamp'] ?? new Date().toISOString(),\n fields,\n deliveryCount: 1,\n };\n }\n\n private toAcknowledgeable<T>(\n stream: string,\n id: string,\n parsed: ParsedEntry<T>,\n group: string = this.group\n ): AcknowledgeableEvent<T> {\n const connection = this.connection;\n let acked = false;\n return {\n id,\n subject: parsed.subject,\n data: parsed.data,\n metadata: parsed.metadata,\n timestamp: parsed.timestamp,\n async ack(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n async nak(delay = 0): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n if (delay > 0) {\n // Park in delay queue; worker will re-XADD and ACK original.\n const score = Date.now() + delay;\n const payload = JSON.stringify(parsed.fields);\n await client.zadd(delayQueueKey(stream), score, `${id}|${payload}`);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n }\n // delay=0: do nothing — XAUTOCLAIM will reclaim after ackWait.\n },\n async term(): Promise<void> {\n if (acked) return;\n acked = true;\n const client = connection.getClient();\n const dlq = dlqKey(stream);\n const flat: string[] = [];\n for (const [k, v] of Object.entries(parsed.fields)) flat.push(k, v);\n await client.xadd(dlq, 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, group, id);\n await client.xdel(stream, id).catch(() => undefined);\n },\n isRedelivered(): boolean {\n return parsed.deliveryCount > 1;\n },\n getDeliveryAttempt(): number {\n return parsed.deliveryCount;\n },\n };\n }\n\n private async sweepPending(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n try {\n const claimed = (await client.xautoclaim(\n stream,\n this.group,\n this.consumerName,\n this.ackWaitMs,\n '0',\n 'COUNT',\n 50\n )) as [string, Array<[string, string[]]>, string[]] | null;\n if (!claimed) continue;\n const entries = claimed[1] ?? [];\n for (const [id, rawFields] of entries) {\n const pending = (await client.xpending(\n stream,\n this.group,\n 'IDLE',\n 0,\n '-',\n '+',\n 1,\n this.consumerName\n )) as Array<[string, string, number, number]>;\n const deliveryCount = Array.isArray(pending) && pending[0] ? pending[0][3] : 1;\n if (deliveryCount > this.maxDeliver) {\n const flat: string[] = [];\n for (let i = 0; i + 1 < rawFields.length; i += 2) {\n flat.push(rawFields[i]!, rawFields[i + 1]!);\n }\n flat.push('dlq-reason', 'max-deliver-exceeded');\n flat.push('dlq-deliveries', String(deliveryCount));\n await client.xadd(dlqKey(stream), 'MAXLEN', '~', 10_000, '*', ...flat);\n await client.xack(stream, this.group, id);\n await client.xdel(stream, id).catch(() => undefined);\n logger.warn('[RedisStreamsEventConsumer] message moved to DLQ', {\n stream,\n id,\n deliveryCount,\n });\n }\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('NOGROUP')) continue;\n logger.debug('[RedisStreamsEventConsumer] sweep iteration error', { stream, error: msg });\n }\n }\n }\n\n private async drainDelayQueues(): Promise<void> {\n if (this.stopped || this.knownStreams.size === 0) return;\n const client = this.connection.getClient();\n for (const [stream] of this.knownStreams) {\n const lockKey = delayLockKey(stream);\n const got = await client.set(lockKey, this.consumerName, 'NX', 'EX', 30).catch(() => null);\n if (got !== 'OK') continue;\n try {\n const due = await client.zrangebyscore(delayQueueKey(stream), 0, Date.now(), 'LIMIT', 0, 50);\n for (const member of due) {\n const split = member.indexOf('|');\n if (split < 0) continue;\n const payload = member.slice(split + 1);\n let fields: Record<string, string> = {};\n try {\n fields = JSON.parse(payload) as Record<string, string>;\n } catch {\n continue;\n }\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) flat.push(k, v);\n await client.xadd(stream, 'MAXLEN', '~', 100_000, '*', ...flat);\n await client.zrem(delayQueueKey(stream), member);\n }\n } finally {\n await client.del(lockKey).catch(() => undefined);\n }\n }\n }\n}\n\nexport type { IoRedis };\n","/**\n * Serialization helpers for the Redis Streams backend.\n *\n * @module event-queue/implementations/redis-streams/serialize\n */\n\n/**\n * `JSON.stringify` that does not throw on BigInt values.\n *\n * Event payloads frequently originate from Prisma rows, which expose BigInt\n * columns (e.g. counters / durations) as native `bigint`. The standard\n * `JSON.stringify` throws `TypeError: Do not know how to serialize a BigInt`,\n * which would drop the entire event — an entity would then silently never reach\n * the graph / search index. We serialize BigInt as its decimal string so the\n * value is preserved and the event is published.\n */\nexport function safeStringify(value: unknown): string {\n return JSON.stringify(value ?? null, (_key, val) => (typeof val === 'bigint' ? val.toString() : val));\n}\n","/**\n * Redis Streams implementation of IEventPublisher.\n *\n * Each subject is its own stream (`boff:events:<subject-with-colons>`); MAXLEN\n * trimming keeps each stream bounded; dedup is enforced by `SET NX EX` on a\n * per-message-id key before XADD.\n */\nimport { randomUUID } from 'node:crypto';\nimport { logger } from '../../../logger/index.js';\nimport type { IEventPublisher, PublishOptions } from '../../interfaces/IEventPublisher.js';\nimport type { PublisherConfig, EventQueueHealthCheckResult, QueueStatistics } from '../../types/config.js';\nimport type { EventMetadata, StreamConfig } from '../../types/events.js';\nimport { RedisStreamsConnection, type IoRedis } from './RedisStreamsConnection.js';\nimport { boundaryOf, dedupKey, registryKey, replyKey, streamKey } from './keyspace.js';\nimport { safeStringify } from './serialize.js';\nimport { injectTraceFields } from './trace-context.js';\nimport { registerDisposable, unregisterDisposable, type ShutdownDisposable } from '../../../lifecycle/index.js';\n\nexport interface RedisStreamsPublisherConfig extends PublisherConfig {\n /** Approximate MAXLEN trim threshold per stream. Default 100_000. */\n maxLen?: number;\n /** Dedup TTL window in seconds. Default 120. */\n dedupTtlSeconds?: number;\n /** Key namespace override. Default `boff:events`. */\n keyPrefix?: string;\n}\n\nexport class RedisStreamsEventPublisher implements IEventPublisher, ShutdownDisposable {\n private connection: RedisStreamsConnection;\n private publishCount = 0;\n private lastPublishTime: Date | null = null;\n private readonly maxLen: number;\n private readonly dedupTtl: number;\n private readonly keyPrefix: string;\n public readonly shutdownName: string;\n\n constructor(private config: RedisStreamsPublisherConfig) {\n this.connection = new RedisStreamsConnection(config);\n this.maxLen = config.maxLen ?? parseInt(process.env['REDIS_STREAMS_MAXLEN'] ?? '100000', 10);\n this.dedupTtl = config.dedupTtlSeconds ?? parseInt(process.env['REDIS_STREAMS_DEDUP_TTL'] ?? '120', 10);\n this.keyPrefix = config.keyPrefix ?? process.env['REDIS_STREAMS_KEY_PREFIX'] ?? 'boff:events';\n this.shutdownName = `redis-streams-publisher:${config.name ?? 'default'}`;\n // Ensure the socket is closed on graceful shutdown even if the owner never\n // calls disconnect() (see lifecycle/shutdown-registry).\n registerDisposable(this);\n }\n\n /** Close underlying connections on graceful shutdown. */\n dispose(): Promise<void> {\n return this.disconnect();\n }\n\n async connect(): Promise<void> {\n await this.connection.connect();\n }\n\n async disconnect(): Promise<void> {\n unregisterDisposable(this);\n await this.connection.disconnect();\n }\n\n isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n async healthCheck(): Promise<EventQueueHealthCheckResult> {\n try {\n const t0 = Date.now();\n const pong = await this.connection.ping();\n return {\n status: pong === 'PONG' ? 'healthy' : 'degraded',\n timestamp: new Date().toISOString(),\n connected: this.isConnected(),\n latencyMs: Date.now() - t0,\n details: { type: 'redis-streams', url: this.config.url },\n };\n } catch (err) {\n return {\n status: 'unhealthy',\n timestamp: new Date().toISOString(),\n connected: false,\n details: { type: 'redis-streams' },\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n async getStatistics(): Promise<QueueStatistics> {\n return {\n messagesPublished: this.publishCount,\n messagesConsumed: 0,\n messagesFailed: 0,\n activePublishers: 1,\n activeConsumers: 0,\n lastActivity: this.lastPublishTime?.toISOString() ?? null,\n details: { type: 'redis-streams' },\n };\n }\n\n async ensureStream(_config: StreamConfig): Promise<void> {\n // Streams are created lazily by XADD; no-op here.\n return Promise.resolve();\n }\n\n async publish<T = unknown>(options: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<number | string> {\n return this.publishInternal(options);\n }\n\n private async publishInternal<T>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }): Promise<string> {\n await this.connect();\n const client = this.connection.getClient();\n // When the caller provides an explicit stream name (e.g. 'WSPACE_GRAPH_EVENTS'),\n // use it as the Redis stream key so all events land in one aggregated stream that\n // a single consumer can read. Fall back to the per-subject stream when no override.\n const streamName = opts.options?.stream ?? opts.subject;\n const stream = streamKey(streamName, { prefix: this.keyPrefix });\n const msgId = opts.options?.messageId ?? randomUUID();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const enableDedup = this.config.enableDeduplication === true || opts.options?.messageId !== undefined;\n\n if (enableDedup) {\n const ok = await client.set(dedupKey(stream, msgId), '1', 'NX', 'EX', this.dedupTtl);\n if (ok !== 'OK') {\n logger.debug('[RedisStreamsEventPublisher] dedup hit; skipping publish', {\n subject: opts.subject,\n msgId,\n });\n return msgId;\n }\n }\n\n const trace = await injectTraceFields();\n const fields: Record<string, string> = {\n 'msg-id': msgId,\n subject: opts.subject,\n 'correlation-id': correlationId,\n timestamp: new Date().toISOString(),\n priority: opts.options?.priority ?? this.config.defaultPriority ?? 'normal',\n source: opts.metadata?.source ?? this.config.name ?? 'unknown',\n payload: safeStringify(opts.data ?? null),\n metadata: safeStringify(opts.metadata ?? {}),\n ...trace,\n };\n if (opts.metadata?.userId) fields['user-id'] = String(opts.metadata.userId);\n if (opts.metadata?.workspaceId) fields['workspace-id'] = String(opts.metadata.workspaceId);\n if (opts.metadata?.tenantId) fields['tenant-id'] = String(opts.metadata.tenantId);\n\n const flat: string[] = [];\n for (const [k, v] of Object.entries(fields)) {\n flat.push(k, v);\n }\n\n const id = await client.xadd(stream, 'MAXLEN', '~', this.maxLen, '*', ...flat);\n\n // Async fire-and-forget registry update\n void client.sadd(registryKey(boundaryOf(opts.subject)), opts.subject).catch(() => undefined);\n\n this.publishCount++;\n this.lastPublishTime = new Date();\n logger.debug('[RedisStreamsEventPublisher] published', {\n subject: opts.subject,\n stream,\n id,\n });\n return id;\n }\n\n async publishBatch<T = unknown>(\n events: Array<{\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n options?: PublishOptions;\n }>\n ): Promise<Array<number | string>> {\n const out: string[] = [];\n for (const e of events) {\n out.push(await this.publishInternal(e));\n }\n return out;\n }\n\n /**\n * Emulated request/response: writer XADDs onto its own subject, then\n * blocks on a one-shot reply stream keyed by correlationId.\n */\n async publishWithAck<T = unknown, R = unknown>(opts: {\n subject: string;\n data: T;\n metadata?: Partial<EventMetadata>;\n timeout?: number;\n }): Promise<R> {\n await this.connect();\n const client = this.connection.getClient();\n const correlationId = opts.metadata?.correlationId ?? randomUUID();\n const reply = replyKey(correlationId);\n await this.publishInternal({\n subject: opts.subject,\n data: opts.data,\n metadata: { ...opts.metadata, correlationId, replyTo: reply },\n });\n\n const timeoutMs = opts.timeout ?? 5000;\n const t0 = Date.now();\n while (Date.now() - t0 < timeoutMs) {\n const entries = (await client.xrange(reply, '-', '+')) as Array<[string, string[]]>;\n if (Array.isArray(entries) && entries.length > 0) {\n const last = entries[entries.length - 1];\n if (!last) break;\n const rawFields = last[1];\n const payloadIdx = rawFields.indexOf('payload');\n const payload = payloadIdx >= 0 ? rawFields[payloadIdx + 1] : '{}';\n await client.del(reply);\n return JSON.parse(payload ?? '{}') as R;\n }\n await new Promise((res) => setTimeout(res, 50));\n }\n await client.del(reply).catch(() => undefined);\n throw new Error(`[RedisStreamsEventPublisher] publishWithAck timed out for subject=${opts.subject}`);\n }\n\n /** Internal helper used by the consumer's reply path. */\n async sendReply(correlationId: string, data: unknown): Promise<void> {\n await this.connect();\n const client = this.connection.getClient();\n const key = replyKey(correlationId);\n await client.xadd(key, '*', 'payload', safeStringify(data ?? null));\n await client.expire(key, 60);\n }\n}\n\nexport type { IoRedis };\n","/**\n * Event Queue Configuration Types\n */\n\n/**\n * Queue type enum\n */\nexport enum QueueType {\n REDIS_STREAMS = 'redis-streams',\n RABBITMQ = 'rabbitmq',\n KAFKA = 'kafka',\n SQS = 'sqs',\n}\n\n/**\n * Base configuration for event queue\n */\nexport interface BaseQueueConfig {\n /** Queue type */\n type: QueueType | string;\n /** Connection URL */\n url: string;\n /** Optional username */\n user?: string;\n /** Optional password */\n password?: string;\n /** Optional auth token */\n token?: string;\n /** Optional credentials file contents (auth payload for the backend) */\n creds?: string;\n /** Optional path to a credentials file */\n credsFile?: string;\n /** Maximum reconnection attempts (-1 for infinite) */\n maxReconnectAttempts?: number;\n /** Time to wait between reconnection attempts (ms) */\n reconnectTimeWait?: number;\n /** Connection timeout (ms) */\n connectionTimeout?: number;\n /** Connection name/identifier */\n name?: string;\n}\n\n/**\n * Publisher-specific configuration\n */\nexport interface PublisherConfig extends BaseQueueConfig {\n /** Default message TTL (ms) */\n defaultTTL?: number;\n /** Enable message deduplication */\n enableDeduplication?: boolean;\n /** Default priority for messages */\n defaultPriority?: 'low' | 'normal' | 'high';\n}\n\n/**\n * Consumer-specific configuration\n */\nexport interface ConsumerConfig extends Partial<BaseQueueConfig> {\n /** Stream name to consume from */\n stream: string;\n /** Consumer name (durable) */\n consumer: string;\n /** Subject filter pattern */\n filterSubject?: string;\n /** Maximum concurrent message processing */\n maxConcurrent?: number;\n /** Maximum delivery attempts */\n maxDeliver?: number;\n /** Acknowledgment wait time (nanoseconds) */\n ackWait?: number;\n /** Acknowledgment policy */\n ackPolicy?: 'explicit' | 'all' | 'none';\n /** Delivery policy */\n deliverPolicy?: 'all' | 'last' | 'new' | 'byStartSequence' | 'byStartTime';\n /** Maximum pending acknowledgments */\n maxAckPending?: number;\n}\n\n/**\n * Health check result\n */\nexport interface EventQueueHealthCheckResult {\n /** Overall health status */\n status: 'healthy' | 'unhealthy' | 'degraded';\n /** Timestamp of health check */\n timestamp: string;\n /** Connection status */\n connected?: boolean;\n /** Latency in milliseconds */\n latencyMs?: number;\n /** Additional details */\n details?: Record<string, unknown>;\n /** Error message if unhealthy */\n error?: string;\n}\n\n/**\n * Statistics\n */\nexport interface QueueStatistics {\n /** Total messages published */\n messagesPublished?: number;\n /** Total messages consumed */\n messagesConsumed?: number;\n /** Messages currently pending */\n messagesPending?: number;\n /** Messages in queue */\n queueSize?: number;\n /** Failed message count */\n messagesFailed?: number;\n /** Active consumers count */\n activeConsumers?: number;\n /** Active publishers count */\n activePublishers?: number;\n /** Average processing time (ms) */\n avgProcessingTimeMs?: number;\n /** Last activity timestamp */\n lastActivity?: string | null;\n /** Custom metrics */\n details?: Record<string, unknown>;\n}\n","/**\n * Event Queue Factory\n *\n * Single-backend wrapper around the Redis Streams publisher/consumer.\n * NATS support was removed on 2026-05-16 — Redis is the canonical fleet\n * event-bus. Other backends (RabbitMQ, Kafka, SQS) are listed in\n * `QueueType` for future extension; today only `redis-streams` is wired.\n */\nimport { logger } from '../../logger/index.js';\nimport type { ServiceLayer } from '../../types/layer.js';\n\nimport { RedisStreamsEventConsumer } from '../implementations/redis-streams/RedisStreamsEventConsumer.js';\nimport { RedisStreamsEventPublisher } from '../implementations/redis-streams/RedisStreamsEventPublisher.js';\nimport type { IEventConsumer } from '../interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from '../interfaces/IEventPublisher.js';\nimport { type ConsumerConfig, type PublisherConfig, QueueType } from '../types/config.js';\n\nfunction resolveQueueType(): QueueType {\n // Kept for the API contract — always returns REDIS_STREAMS now.\n return QueueType.REDIS_STREAMS;\n}\n\nfunction redactConnectionUrl(url: string | undefined): string | undefined {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n const rendered = parsed.toString();\n const authorityStart = rendered.indexOf('//') + 2;\n const authorityEnd = rendered.indexOf('@', authorityStart);\n if (authorityStart < 2 || authorityEnd < 0) return rendered;\n return `${rendered.slice(0, authorityStart)}:***@${rendered.slice(authorityEnd + 1)}`;\n } catch {\n const schemeEnd = url.indexOf('://');\n if (schemeEnd < 0) return url;\n const authorityStart = schemeEnd + 3;\n const authorityEnd = url.indexOf('@', authorityStart);\n if (authorityEnd < 0) return url;\n return `${url.slice(0, authorityStart)}:***@${url.slice(authorityEnd + 1)}`;\n }\n}\n\n/**\n * Factory for creating event queue instances\n */\nexport class EventQueueFactory {\n /**\n * Create an event publisher based on configuration\n */\n static createPublisher(config: PublisherConfig): IEventPublisher {\n logger.info('[EventQueueFactory] Creating event publisher', {\n type: config.type,\n url: redactConnectionUrl(config.url),\n });\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventPublisher(config);\n }\n\n throw new Error(`Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`);\n }\n\n /**\n * Create an event consumer based on configuration\n */\n static createConsumer(config: ConsumerConfig): IEventConsumer {\n logger.info('[EventQueueFactory] Creating event consumer', {\n type: config.type,\n url: redactConnectionUrl(config.url),\n stream: config.stream,\n consumer: config.consumer,\n });\n\n if (config.type === QueueType.REDIS_STREAMS) {\n return new RedisStreamsEventConsumer(config);\n }\n\n throw new Error(`Unsupported queue type: ${config.type}. NATS was retired on 2026-05-16; use 'redis-streams'.`);\n }\n\n /**\n * Create a publisher from environment variables.\n * Reads `REDIS_URL`, `REDIS_PASSWORD`, and standard queue options.\n */\n static createPublisherFromEnv(): IEventPublisher {\n return EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? 'be-sdk-publisher',\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') ?? 'normal',\n });\n }\n\n /**\n * Create a consumer from environment variables.\n */\n static createConsumerFromEnv(stream: string, consumer: string): IEventConsumer {\n return EventQueueFactory.createConsumer({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: process.env['QUEUE_CLIENT_NAME'] ?? process.env['SERVICE_NAME'] ?? consumer,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n\n // ========================================================================\n // Layer-Aware Factory Methods\n // ========================================================================\n\n /**\n * Create a publisher for a specific layer.\n * The layer is preserved on the publisher name; otherwise identical to\n * `createPublisherFromEnv()`.\n */\n static createPublisherForLayer(_layer: ServiceLayer, serviceName: string): IEventPublisher {\n return EventQueueFactory.createPublisher({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n enableDeduplication: process.env['QUEUE_ENABLE_DEDUPLICATION'] === 'true',\n defaultPriority: (process.env['QUEUE_DEFAULT_PRIORITY'] as 'low' | 'normal' | 'high') ?? 'normal',\n });\n }\n\n /**\n * Create a consumer for a specific layer.\n */\n static createConsumerForLayer(\n _layer: ServiceLayer,\n serviceName: string,\n stream: string,\n consumer: string\n ): IEventConsumer {\n return EventQueueFactory.createConsumer({\n type: QueueType.REDIS_STREAMS,\n url: process.env['REDIS_URL'] ?? 'redis://localhost:6379',\n password: process.env['REDIS_PASSWORD'],\n name: serviceName,\n stream,\n consumer,\n maxConcurrent: process.env['QUEUE_MAX_CONCURRENT'] ? parseInt(process.env['QUEUE_MAX_CONCURRENT'], 10) : 5,\n maxDeliver: process.env['QUEUE_MAX_DELIVER'] ? parseInt(process.env['QUEUE_MAX_DELIVER'], 10) : 3,\n ackWait: process.env['QUEUE_ACK_WAIT']\n ? parseInt(process.env['QUEUE_ACK_WAIT'], 10) * 1_000_000_000\n : 30_000_000_000,\n });\n }\n}\n\n// Internal helper kept exported for callers that imported it previously.\nexport { resolveQueueType };\n"]}
|