@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.
Files changed (71) hide show
  1. package/dist/EventQueueFactory-XRAIXICA.js +7 -0
  2. package/dist/{EventQueueFactory-J2XXPYXH.js.map → EventQueueFactory-XRAIXICA.js.map} +1 -1
  3. package/dist/auth/index.d.ts +3 -3
  4. package/dist/cache/index.d.ts +1 -1
  5. package/dist/cache/index.js +1 -1
  6. package/dist/{chunk-QJN4K7LD.js → chunk-3AEU6G6V.js} +3 -3
  7. package/dist/{chunk-QJN4K7LD.js.map → chunk-3AEU6G6V.js.map} +1 -1
  8. package/dist/{chunk-G6XPO5D7.js → chunk-7WLOO2VU.js} +4 -4
  9. package/dist/{chunk-G6XPO5D7.js.map → chunk-7WLOO2VU.js.map} +1 -1
  10. package/dist/{chunk-Z32KFAPT.js → chunk-AHEXIONU.js} +4 -4
  11. package/dist/chunk-AHEXIONU.js.map +1 -0
  12. package/dist/{chunk-LNFGZMDB.js → chunk-CVMQRWCB.js} +3 -3
  13. package/dist/{chunk-LNFGZMDB.js.map → chunk-CVMQRWCB.js.map} +1 -1
  14. package/dist/{chunk-CPLFP5JK.js → chunk-E5DTAGCA.js} +2 -2
  15. package/dist/chunk-E5DTAGCA.js.map +1 -0
  16. package/dist/{chunk-FYH5IAPR.js → chunk-JRMQ2B3B.js} +4 -4
  17. package/dist/{chunk-FYH5IAPR.js.map → chunk-JRMQ2B3B.js.map} +1 -1
  18. package/dist/{chunk-AIBMTE56.js → chunk-KXY4RSYI.js} +2 -2
  19. package/dist/{chunk-AIBMTE56.js.map → chunk-KXY4RSYI.js.map} +1 -1
  20. package/dist/{chunk-TYLVMGOP.js → chunk-L22J3BYR.js} +3 -3
  21. package/dist/{chunk-TYLVMGOP.js.map → chunk-L22J3BYR.js.map} +1 -1
  22. package/dist/{chunk-UFXHLQ2T.js → chunk-MLBNB5DB.js} +104 -44
  23. package/dist/chunk-MLBNB5DB.js.map +1 -0
  24. package/dist/{chunk-AFLPUWVI.js → chunk-PVNNVIIA.js} +40 -12
  25. package/dist/chunk-PVNNVIIA.js.map +1 -0
  26. package/dist/{chunk-VKYGGS2F.js → chunk-RFXAHMY4.js} +3 -3
  27. package/dist/{chunk-VKYGGS2F.js.map → chunk-RFXAHMY4.js.map} +1 -1
  28. package/dist/{chunk-XCQN6GH7.js → chunk-VVBA3LQV.js} +3 -3
  29. package/dist/{chunk-XCQN6GH7.js.map → chunk-VVBA3LQV.js.map} +1 -1
  30. package/dist/event-queue/index.d.ts +3 -3
  31. package/dist/event-queue/index.js +3 -3
  32. package/dist/export/index.js +3 -3
  33. package/dist/feature-flags/index.d.ts +2 -2
  34. package/dist/gateway/index.js +2 -2
  35. package/dist/gateway/security/index.js +1 -1
  36. package/dist/graph/index.d.ts +3 -3
  37. package/dist/graph/index.js +4 -4
  38. package/dist/{graphql-Dxxpbzr3.d.ts → graphql-AaLJfGzz.d.ts} +1 -1
  39. package/dist/{index-hWpL68Vx.d.ts → index-BKafOO7G.d.ts} +1 -1
  40. package/dist/{index-MsCFY9Ht.d.ts → index-BSlifT21.d.ts} +3 -3
  41. package/dist/{index-B8viwwDM.d.ts → index-CfRZtB99.d.ts} +1 -1
  42. package/dist/{index-CQGCVFmI.d.ts → index-CpXKka7c.d.ts} +5 -2
  43. package/dist/{index-BCelo6F3.d.ts → index-Cx5I3ydM.d.ts} +1 -0
  44. package/dist/{index-Cpr38QiE.d.ts → index-DMlr5R6K.d.ts} +2 -2
  45. package/dist/{index-By4Rxoj1.d.ts → index-Drvw0QPe.d.ts} +1 -1
  46. package/dist/{index-BLWIKXin.d.ts → index-Dvv6irk0.d.ts} +1 -1
  47. package/dist/{index-CUeQCuE5.d.ts → index-_dsCeVat.d.ts} +2 -2
  48. package/dist/index.d.ts +16 -16
  49. package/dist/index.js +15 -15
  50. package/dist/init/index.js +3 -3
  51. package/dist/instrumentation/index.d.ts +3 -3
  52. package/dist/instrumentation/index.js +1 -1
  53. package/dist/logger/index.d.ts +2 -2
  54. package/dist/notifications/index.d.ts +3 -3
  55. package/dist/prisma/index.js +3 -3
  56. package/dist/rbac/index.d.ts +2 -2
  57. package/dist/resource-caps/index.d.ts +2 -2
  58. package/dist/server/index.d.ts +2 -2
  59. package/dist/server/index.js +74 -1
  60. package/dist/server/index.js.map +1 -1
  61. package/dist/telemetry/index.d.ts +4 -4
  62. package/dist/telemetry/index.js +2 -2
  63. package/dist/tracker/index.d.ts +4 -4
  64. package/dist/{types-BAHkj1GE.d.ts → types-Biv0uaJk.d.ts} +17 -1
  65. package/dist/validation/index.js +1 -1
  66. package/package.json +47 -39
  67. package/dist/EventQueueFactory-J2XXPYXH.js +0 -7
  68. package/dist/chunk-AFLPUWVI.js.map +0 -1
  69. package/dist/chunk-CPLFP5JK.js.map +0 -1
  70. package/dist/chunk-UFXHLQ2T.js.map +0 -1
  71. package/dist/chunk-Z32KFAPT.js.map +0 -1
@@ -0,0 +1 @@
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-E5DTAGCA.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,5 +1,5 @@
1
- import { resetGraphEventEmitter, getGraphEventEmitter, createMemoryPublisher, createGraphEventEmitter, createMemoryConsumer, createGraphEventEmitter2, MemoryEventQueue, MemoryEventPublisher, MemoryEventConsumer, MemoryEventBus, GraphEventEmitterImpl } from './chunk-QJN4K7LD.js';
2
- import { RedisStreamsEventPublisher, RedisStreamsEventConsumer, QueueType, EventQueueFactory } from './chunk-UFXHLQ2T.js';
1
+ import { resetGraphEventEmitter, getGraphEventEmitter, createMemoryPublisher, createGraphEventEmitter, createMemoryConsumer, createGraphEventEmitter2, MemoryEventQueue, MemoryEventPublisher, MemoryEventConsumer, MemoryEventBus, GraphEventEmitterImpl } from './chunk-3AEU6G6V.js';
2
+ import { RedisStreamsEventPublisher, RedisStreamsEventConsumer, QueueType, EventQueueFactory } from './chunk-MLBNB5DB.js';
3
3
  import { streamKey, dlqKey, RedisStreamsConnection } from './chunk-LKCBI6B2.js';
4
4
  import { logger } from './chunk-RU266375.js';
5
5
  import { __export, __name } from './chunk-XE4OXN2W.js';
@@ -460,5 +460,5 @@ function createConsumer(stream, consumer) {
460
460
  __name(createConsumer, "createConsumer");
461
461
 
462
462
  export { EventPriority, EventsModule, ModuleEventsService, createConsumer, createModuleEventsService, createPublisher, event_queue_exports };
463
- //# sourceMappingURL=chunk-FYH5IAPR.js.map
464
- //# sourceMappingURL=chunk-FYH5IAPR.js.map
463
+ //# sourceMappingURL=chunk-JRMQ2B3B.js.map
464
+ //# sourceMappingURL=chunk-JRMQ2B3B.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/event-queue/index.ts","../src/event-queue/module-events.ts","../src/event-queue/events.ts"],"names":["createGraphEventEmitter","ModuleEventsService","productSource","subjectPrefix","loggerLabel","publisher","connected","connecting","config","moduleName","charAt","toUpperCase","slice","process","env","EventQueueFactory","createPublisherFromEnv","logger","info","MemoryEventPublisher","ensureConnected","connect","then","publish","subject","payload","data","buildPayload","type","action","id","userId","tenantId","workspaceId","correlationId","metadata","timestamp","Date","toISOString","buildSubject","entityType","normalizedType","replace","_match","p1","offset","toLowerCase","publishCreated","publishUpdated","publishDeleted","publishCustom","publishBulkCreated","_entityType","items","close","disconnect","healthCheck","result","isHealthy","status","healthy","message","error","createModuleEventsService","EventPriority","EventsModule","client","context","createStream","name","subjects","options","debug","mutation","variables","input","maxMessages","maxBytes","maxAge","storageType","replicas","response","query","getStreamInfo","deleteStream","purgeStream","sequence","purgedCount","createConsumer","streamName","consumerName","queueGroup","durableName","startPosition","ackMode","maxDeliver","ackWait","deleteConsumer","ackMessage","nakMessage","getConsumerInfo","createPublisher","stream","consumer","createConsumerFromEnv","MemoryEventConsumer"],"mappings":"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","file":"chunk-FYH5IAPR.js","sourcesContent":["/**\n * Event Queue - Public API\n *\n * This module provides a complete abstraction over event queue systems (NATS, RabbitMQ, Kafka, SQS, etc.)\n * allowing the application to publish and consume events without direct dependency on any specific queue implementation.\n *\n * Usage:\n *\n * // Publishing events (workspaces-backend)\n * import { createPublisher } from './utils/event-queue';\n *\n * const publisher = createPublisher();\n * await publisher.connect();\n *\n * await publisher.publish({\n * subject: 'workspace.created',\n * data: { workspaceId: '123', name: 'My Workspace' },\n * metadata: { userId: 'user-123', source: 'api' }\n * });\n *\n * // Consuming events (workspaces-workers)\n * import { createConsumer } from './core/event-queue';\n *\n * const consumer = createConsumer('WORKSPACE_EVENTS', 'workspace-consumer');\n * await consumer.connect();\n *\n * await consumer.subscribe({\n * subject: 'workspace.*',\n * handler: async (event) => {\n * logger.log('Received event:', event.data);\n * await event.ack();\n * }\n * });\n */\n// Import factory for use in convenience functions\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n// Import implementations for use in convenience functions\nimport { MemoryEventPublisher, MemoryEventConsumer } from './implementations/memory/MemoryEventQueue.js';\n// Import interfaces for type annotations\nimport type { IEventConsumer } from './interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\n\n// Export interfaces\nexport type { IEventQueue } from './interfaces/IEventQueue.js';\nexport type { IEventPublisher, PublishOptions } from './interfaces/IEventPublisher.js';\nexport type { IEventConsumer, ISubscription } from './interfaces/IEventConsumer.js';\n\n// Export types\nexport type {\n EventMessage,\n EventMetadata,\n AcknowledgeableEvent,\n EventHandler,\n StreamConfig,\n SubscriptionOptions,\n ConsumerOptions,\n} from './types/events.js';\n\nexport { QueueType } from './types/config.js';\n\nexport type {\n BaseQueueConfig,\n PublisherConfig,\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from './types/config.js';\n\n// Backwards compatibility alias\nexport type { EventQueueHealthCheckResult as HealthCheckResult } from './types/config.js';\n\n// Export factory\nexport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n// Export Redis Streams implementations\nexport {\n RedisStreamsEventPublisher,\n RedisStreamsEventConsumer,\n RedisStreamsConnection,\n streamKey as redisStreamKey,\n dlqKey as redisDlqKey,\n} from './implementations/redis-streams/index.js';\n\n// Export Memory implementations (for development/testing or fallback)\nexport {\n MemoryEventBus,\n MemoryEventQueue,\n MemoryEventPublisher,\n MemoryEventConsumer,\n createMemoryPublisher,\n createMemoryConsumer,\n createGraphEventEmitter as createMemoryGraphEventEmitter,\n} from './implementations/memory/MemoryEventQueue.js';\n\n// Export Graph Event Emitter (Redis Streams-backed).\nexport {\n GraphEventEmitterImpl,\n getGraphEventEmitter,\n createGraphEventEmitter,\n resetGraphEventEmitter,\n} from './graph-emitter.js';\nexport type { GraphEventEmitter, EntityEventType, EntityEventRbacMetadata } from './graph-emitter.js';\n\n// Export Module Events Service\nexport { ModuleEventsService, createModuleEventsService } from './module-events.js';\nexport type { ModuleEventPayload, BulkEventPayload, ModuleEventsConfig } from './module-events.js';\n\n// Export high-level Events Module (GraphQL-based event publishing)\nexport { EventsModule } from './events.js';\nexport {\n EventPriority,\n type PublishEventOptions,\n type SubscribeOptions,\n type EventMessage as GraphQLEventMessage,\n type PublishResult,\n type StreamInfo,\n} from './events.js';\n\n/**\n * Create an event publisher from environment configuration.\n *\n * Backend resolution:\n * - `REDIS_URL` set → Redis Streams (the only supported backend since\n * the NATS retirement on 2026-05-16).\n * - `REDIS_URL` unset → in-memory (dev/test fallback).\n */\nexport function createPublisher(): IEventPublisher {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createPublisherFromEnv();\n }\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an event consumer from environment configuration.\n */\nexport function createConsumer(stream: string, consumer: string): IEventConsumer {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createConsumerFromEnv(stream, consumer);\n }\n return new MemoryEventConsumer(stream, consumer);\n}\n","/**\n * Module Events Service\n *\n * Generic event publishing service that modules can configure to publish\n * domain-specific events to NATS JetStream.\n *\n * @module event-queue/module-events\n * @category Events\n *\n * @example\n * ```typescript\n * import { createModuleEventsService } from '@burdenoff/be-sdk/event-queue';\n *\n * // Create a configured event service for the tags module\n * const tagsEventsService = createModuleEventsService({\n * moduleName: 'tags',\n * entityTypes: ['Tag', 'Vocabulary', 'Assignment'],\n * });\n *\n * // Publish events\n * await tagsEventsService.publishCreated('Tag', tagId, tagData, userId);\n * await tagsEventsService.publishUpdated('Vocabulary', vocabId, vocabData, userId);\n * ```\n */\nimport { logger } from '../logger/index.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n/**\n * Event payload structure for module events\n */\nexport interface ModuleEventPayload {\n /** Entity ID */\n id: string;\n /** Entity type (e.g., 'UniversalTag', 'UniversalTagVocabulary') */\n type: string;\n /** Action performed */\n action: 'created' | 'updated' | 'deleted' | 'assigned' | 'removed' | string;\n /** Entity data */\n data: Record<string, unknown>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n correlationId?: string;\n };\n}\n\n/**\n * Bulk event payload structure\n */\nexport interface BulkEventPayload {\n /** Items in the bulk operation */\n items: Array<{ id: string; data: Record<string, unknown> }>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n };\n}\n\n/**\n * Configuration for module events service\n */\nexport interface ModuleEventsConfig {\n /** Module name (used as productSource and in subject prefixes) */\n moduleName: string;\n /** Subject prefix override (defaults to moduleName) */\n subjectPrefix?: string;\n /** Custom logger label */\n loggerLabel?: string;\n}\n\n/**\n * Generic Module Events Service\n *\n * Provides a consistent interface for publishing domain events across all modules.\n * Automatically falls back to in-memory publisher when NATS is not configured.\n */\nexport class ModuleEventsService {\n private readonly productSource: string;\n private readonly subjectPrefix: string;\n private readonly loggerLabel: string;\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor(config: ModuleEventsConfig) {\n this.productSource = config.moduleName;\n this.subjectPrefix = config.subjectPrefix || config.moduleName;\n this.loggerLabel =\n config.loggerLabel || `${config.moduleName.charAt(0).toUpperCase()}${config.moduleName.slice(1)}EventsService`;\n\n // Initialize publisher based on environment\n if (process.env['REDIS_URL']) {\n this.publisher = EventQueueFactory.createPublisherFromEnv();\n logger.info(`[${this.loggerLabel}] Using Redis Streams publisher`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info(`[${this.loggerLabel}] Using in-memory publisher (REDIS_URL not configured)`);\n }\n }\n\n /**\n * Ensure publisher is connected before publishing\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info(`[${this.loggerLabel}] Publisher connected`);\n });\n\n await this.connecting;\n }\n\n /**\n * Publish an event to the queue\n */\n private async publish(subject: string, payload: unknown): Promise<void> {\n await this.ensureConnected();\n await this.publisher.publish({\n subject,\n data: payload as Record<string, unknown>,\n });\n }\n\n /**\n * Build event payload\n */\n private buildPayload(\n type: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string,\n correlationId?: string\n ): ModuleEventPayload {\n return {\n id,\n type,\n action,\n data,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n ...(correlationId && { correlationId }),\n },\n };\n }\n\n /**\n * Build subject string\n */\n private buildSubject(entityType: string, action: string): string {\n // Convert entityType from PascalCase to lowercase (e.g., UniversalTag -> tag)\n const normalizedType = entityType\n .replace(/^Universal/, '')\n .replace(/([A-Z])/g, (_match, p1, offset) => (offset > 0 ? '_' : '') + (p1 as string).toLowerCase())\n .replace(/^_/, '');\n return `${this.subjectPrefix}.${normalizedType}.${action}`;\n }\n\n /**\n * Publish entity created event\n */\n async publishCreated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'created', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'created'), payload);\n }\n\n /**\n * Publish entity updated event\n */\n async publishUpdated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'updated', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'updated'), payload);\n }\n\n /**\n * Publish entity deleted event\n */\n async publishDeleted(\n entityType: string,\n id: string,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'deleted', id, {}, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'deleted'), payload);\n }\n\n /**\n * Publish custom action event\n */\n async publishCustom(\n entityType: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, action, id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, action), payload);\n }\n\n /**\n * Publish bulk created event\n */\n async publishBulkCreated(\n _entityType: string,\n items: Array<{ id: string; data: Record<string, unknown> }>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload: BulkEventPayload = {\n items,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n },\n };\n await this.publish(`${this.subjectPrefix}.bulk.created`, payload);\n }\n\n /**\n * Close event queue connection\n */\n async close(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info(`[${this.loggerLabel}] Publisher disconnected`);\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Create a module events service instance\n */\nexport function createModuleEventsService(config: ModuleEventsConfig): ModuleEventsService {\n return new ModuleEventsService(config);\n}\n","/**\n * Events Module\n * Helpers for sending events to the Redis Streams event queue\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum EventPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface PublishEventOptions {\n /** Event subject/topic */\n subject: string;\n /** Event payload */\n data: Record<string, unknown>;\n /** Event priority */\n priority?: EventPriority;\n /** Event metadata */\n metadata?: Record<string, unknown>;\n /** Delay delivery by milliseconds */\n delay?: number;\n /** Message ID (for deduplication) */\n messageId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface SubscribeOptions {\n /** Subject pattern to subscribe to */\n subject: string;\n /** Queue group name */\n queueGroup?: string;\n /** Durable consumer name */\n durableName?: string;\n /** Start from specific position */\n startPosition?: 'first' | 'last' | 'new';\n /** Acknowledge mode */\n ackMode?: 'explicit' | 'auto';\n /** Max messages to deliver */\n maxDeliver?: number;\n /** Acknowledgment timeout in milliseconds */\n ackWait?: number;\n}\n\nexport interface EventMessage {\n id: string;\n subject: string;\n data: Record<string, unknown>;\n priority: EventPriority;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n publishedAt: string;\n publishedBy?: string;\n}\n\nexport interface PublishResult {\n messageId: string;\n subject: string;\n sequence: number;\n timestamp: string;\n}\n\nexport interface StreamInfo {\n name: string;\n subjects: string[];\n messageCount: number;\n byteCount: number;\n firstSequence: number;\n lastSequence: number;\n consumerCount: number;\n}\n\n/**\n * Events Module\n */\nexport class EventsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Create stream\n */\n public async createStream(\n name: string,\n subjects: string[],\n options?: {\n maxMessages?: number;\n maxBytes?: number;\n maxAge?: number;\n storageType?: 'file' | 'memory';\n replicas?: number;\n }\n ): Promise<StreamInfo> {\n logger.debug('[Events] Creating stream', { name, subjects });\n\n const mutation = `\n mutation CreateStream($input: CreateStreamInput!) {\n createStream(input: $input) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const variables = {\n input: {\n name,\n subjects,\n maxMessages: options?.maxMessages,\n maxBytes: options?.maxBytes,\n maxAge: options?.maxAge,\n storageType: options?.storageType || 'file',\n replicas: options?.replicas || 1,\n },\n };\n\n const response = await this.client.query<{ createStream: StreamInfo }>(mutation, variables, this.context);\n\n logger.info('[Events] Stream created', { name });\n\n return response.createStream;\n }\n\n /**\n * Get stream info\n */\n public async getStreamInfo(name: string): Promise<StreamInfo> {\n logger.debug('[Events] Getting stream info', { name });\n\n const query = `\n query GetStreamInfo($name: String!) {\n getStreamInfo(name: $name) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const response = await this.client.query<{ getStreamInfo: StreamInfo }>(query, { name }, this.context);\n\n return response.getStreamInfo;\n }\n\n /**\n * Delete stream\n */\n public async deleteStream(name: string): Promise<boolean> {\n logger.debug('[Events] Deleting stream', { name });\n\n const mutation = `\n mutation DeleteStream($name: String!) {\n deleteStream(name: $name) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { name }, this.context);\n\n logger.info('[Events] Stream deleted', { name });\n\n return true;\n }\n\n /**\n * Purge stream messages\n */\n public async purgeStream(name: string, options?: { subject?: string; sequence?: number }): Promise<number> {\n logger.debug('[Events] Purging stream', { name, options });\n\n const mutation = `\n mutation PurgeStream($name: String!, $subject: String, $sequence: Int) {\n purgeStream(name: $name, subject: $subject, sequence: $sequence) {\n purgedCount\n }\n }\n `;\n\n const response = await this.client.query<{ purgeStream: { purgedCount: number } }>(\n mutation,\n { name, subject: options?.subject, sequence: options?.sequence },\n this.context\n );\n\n logger.info('[Events] Stream purged', { name, purgedCount: response.purgeStream.purgedCount });\n\n return response.purgeStream.purgedCount;\n }\n\n /**\n * Create consumer\n */\n public async createConsumer(\n streamName: string,\n consumerName: string,\n options: SubscribeOptions\n ): Promise<{ name: string; pending: number }> {\n logger.debug('[Events] Creating consumer', { streamName, consumerName });\n\n const mutation = `\n mutation CreateConsumer($input: CreateConsumerInput!) {\n createConsumer(input: $input) {\n name\n pending\n }\n }\n `;\n\n const variables = {\n input: {\n streamName,\n consumerName,\n subject: options.subject,\n queueGroup: options.queueGroup,\n durableName: options.durableName,\n startPosition: options.startPosition || 'last',\n ackMode: options.ackMode || 'explicit',\n maxDeliver: options.maxDeliver || 5,\n ackWait: options.ackWait || 30000,\n },\n };\n\n const response = await this.client.query<{ createConsumer: { name: string; pending: number } }>(\n mutation,\n variables,\n this.context\n );\n\n logger.info('[Events] Consumer created', { consumerName });\n\n return response.createConsumer;\n }\n\n /**\n * Delete consumer\n */\n public async deleteConsumer(streamName: string, consumerName: string): Promise<boolean> {\n logger.debug('[Events] Deleting consumer', { streamName, consumerName });\n\n const mutation = `\n mutation DeleteConsumer($streamName: String!, $consumerName: String!) {\n deleteConsumer(streamName: $streamName, consumerName: $consumerName) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName }, this.context);\n\n logger.info('[Events] Consumer deleted', { consumerName });\n\n return true;\n }\n\n /**\n * Acknowledge message\n */\n public async ackMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation AckMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n ackMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Negative acknowledge message (requeue)\n */\n public async nakMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Negative acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation NakMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n nakMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Get consumer info\n */\n public async getConsumerInfo(\n streamName: string,\n consumerName: string\n ): Promise<{\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n }> {\n logger.debug('[Events] Getting consumer info', { streamName, consumerName });\n\n const query = `\n query GetConsumerInfo($streamName: String!, $consumerName: String!) {\n getConsumerInfo(streamName: $streamName, consumerName: $consumerName) {\n name\n pending\n redelivered\n numAckPending\n }\n }\n `;\n\n const response = await this.client.query<{\n getConsumerInfo: {\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n };\n }>(query, { streamName, consumerName }, this.context);\n\n return response.getConsumerInfo;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/event-queue/index.ts","../src/event-queue/module-events.ts","../src/event-queue/events.ts"],"names":["createGraphEventEmitter","ModuleEventsService","productSource","subjectPrefix","loggerLabel","publisher","connected","connecting","config","moduleName","charAt","toUpperCase","slice","process","env","EventQueueFactory","createPublisherFromEnv","logger","info","MemoryEventPublisher","ensureConnected","connect","then","publish","subject","payload","data","buildPayload","type","action","id","userId","tenantId","workspaceId","correlationId","metadata","timestamp","Date","toISOString","buildSubject","entityType","normalizedType","replace","_match","p1","offset","toLowerCase","publishCreated","publishUpdated","publishDeleted","publishCustom","publishBulkCreated","_entityType","items","close","disconnect","healthCheck","result","isHealthy","status","healthy","message","error","createModuleEventsService","EventPriority","EventsModule","client","context","createStream","name","subjects","options","debug","mutation","variables","input","maxMessages","maxBytes","maxAge","storageType","replicas","response","query","getStreamInfo","deleteStream","purgeStream","sequence","purgedCount","createConsumer","streamName","consumerName","queueGroup","durableName","startPosition","ackMode","maxDeliver","ackWait","deleteConsumer","ackMessage","nakMessage","getConsumerInfo","createPublisher","stream","consumer","createConsumerFromEnv","MemoryEventConsumer"],"mappings":"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","file":"chunk-JRMQ2B3B.js","sourcesContent":["/**\n * Event Queue - Public API\n *\n * This module provides a complete abstraction over event queue systems (NATS, RabbitMQ, Kafka, SQS, etc.)\n * allowing the application to publish and consume events without direct dependency on any specific queue implementation.\n *\n * Usage:\n *\n * // Publishing events (workspaces-backend)\n * import { createPublisher } from './utils/event-queue';\n *\n * const publisher = createPublisher();\n * await publisher.connect();\n *\n * await publisher.publish({\n * subject: 'workspace.created',\n * data: { workspaceId: '123', name: 'My Workspace' },\n * metadata: { userId: 'user-123', source: 'api' }\n * });\n *\n * // Consuming events (workspaces-workers)\n * import { createConsumer } from './core/event-queue';\n *\n * const consumer = createConsumer('WORKSPACE_EVENTS', 'workspace-consumer');\n * await consumer.connect();\n *\n * await consumer.subscribe({\n * subject: 'workspace.*',\n * handler: async (event) => {\n * logger.log('Received event:', event.data);\n * await event.ack();\n * }\n * });\n */\n// Import factory for use in convenience functions\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n// Import implementations for use in convenience functions\nimport { MemoryEventPublisher, MemoryEventConsumer } from './implementations/memory/MemoryEventQueue.js';\n// Import interfaces for type annotations\nimport type { IEventConsumer } from './interfaces/IEventConsumer.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\n\n// Export interfaces\nexport type { IEventQueue } from './interfaces/IEventQueue.js';\nexport type { IEventPublisher, PublishOptions } from './interfaces/IEventPublisher.js';\nexport type { IEventConsumer, ISubscription } from './interfaces/IEventConsumer.js';\n\n// Export types\nexport type {\n EventMessage,\n EventMetadata,\n AcknowledgeableEvent,\n EventHandler,\n StreamConfig,\n SubscriptionOptions,\n ConsumerOptions,\n} from './types/events.js';\n\nexport { QueueType } from './types/config.js';\n\nexport type {\n BaseQueueConfig,\n PublisherConfig,\n ConsumerConfig,\n EventQueueHealthCheckResult,\n QueueStatistics,\n} from './types/config.js';\n\n// Backwards compatibility alias\nexport type { EventQueueHealthCheckResult as HealthCheckResult } from './types/config.js';\n\n// Export factory\nexport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n// Export Redis Streams implementations\nexport {\n RedisStreamsEventPublisher,\n RedisStreamsEventConsumer,\n RedisStreamsConnection,\n streamKey as redisStreamKey,\n dlqKey as redisDlqKey,\n} from './implementations/redis-streams/index.js';\n\n// Export Memory implementations (for development/testing or fallback)\nexport {\n MemoryEventBus,\n MemoryEventQueue,\n MemoryEventPublisher,\n MemoryEventConsumer,\n createMemoryPublisher,\n createMemoryConsumer,\n createGraphEventEmitter as createMemoryGraphEventEmitter,\n} from './implementations/memory/MemoryEventQueue.js';\n\n// Export Graph Event Emitter (Redis Streams-backed).\nexport {\n GraphEventEmitterImpl,\n getGraphEventEmitter,\n createGraphEventEmitter,\n resetGraphEventEmitter,\n} from './graph-emitter.js';\nexport type { GraphEventEmitter, EntityEventType, EntityEventRbacMetadata } from './graph-emitter.js';\n\n// Export Module Events Service\nexport { ModuleEventsService, createModuleEventsService } from './module-events.js';\nexport type { ModuleEventPayload, BulkEventPayload, ModuleEventsConfig } from './module-events.js';\n\n// Export high-level Events Module (GraphQL-based event publishing)\nexport { EventsModule } from './events.js';\nexport {\n EventPriority,\n type PublishEventOptions,\n type SubscribeOptions,\n type EventMessage as GraphQLEventMessage,\n type PublishResult,\n type StreamInfo,\n} from './events.js';\n\n/**\n * Create an event publisher from environment configuration.\n *\n * Backend resolution:\n * - `REDIS_URL` set → Redis Streams (the only supported backend since\n * the NATS retirement on 2026-05-16).\n * - `REDIS_URL` unset → in-memory (dev/test fallback).\n */\nexport function createPublisher(): IEventPublisher {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createPublisherFromEnv();\n }\n return new MemoryEventPublisher();\n}\n\n/**\n * Create an event consumer from environment configuration.\n */\nexport function createConsumer(stream: string, consumer: string): IEventConsumer {\n if (process.env['REDIS_URL']) {\n return EventQueueFactory.createConsumerFromEnv(stream, consumer);\n }\n return new MemoryEventConsumer(stream, consumer);\n}\n","/**\n * Module Events Service\n *\n * Generic event publishing service that modules can configure to publish\n * domain-specific events to NATS JetStream.\n *\n * @module event-queue/module-events\n * @category Events\n *\n * @example\n * ```typescript\n * import { createModuleEventsService } from '@burdenoff/be-sdk/event-queue';\n *\n * // Create a configured event service for the tags module\n * const tagsEventsService = createModuleEventsService({\n * moduleName: 'tags',\n * entityTypes: ['Tag', 'Vocabulary', 'Assignment'],\n * });\n *\n * // Publish events\n * await tagsEventsService.publishCreated('Tag', tagId, tagData, userId);\n * await tagsEventsService.publishUpdated('Vocabulary', vocabId, vocabData, userId);\n * ```\n */\nimport { logger } from '../logger/index.js';\nimport type { IEventPublisher } from './interfaces/IEventPublisher.js';\nimport { MemoryEventPublisher } from './implementations/memory/MemoryEventQueue.js';\nimport { EventQueueFactory } from './factory/EventQueueFactory.js';\n\n/**\n * Event payload structure for module events\n */\nexport interface ModuleEventPayload {\n /** Entity ID */\n id: string;\n /** Entity type (e.g., 'UniversalTag', 'UniversalTagVocabulary') */\n type: string;\n /** Action performed */\n action: 'created' | 'updated' | 'deleted' | 'assigned' | 'removed' | string;\n /** Entity data */\n data: Record<string, unknown>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n correlationId?: string;\n };\n}\n\n/**\n * Bulk event payload structure\n */\nexport interface BulkEventPayload {\n /** Items in the bulk operation */\n items: Array<{ id: string; data: Record<string, unknown> }>;\n /** Event metadata */\n metadata: {\n tenantId?: string;\n workspaceId?: string;\n userId: string;\n timestamp: string;\n productSource: string;\n };\n}\n\n/**\n * Configuration for module events service\n */\nexport interface ModuleEventsConfig {\n /** Module name (used as productSource and in subject prefixes) */\n moduleName: string;\n /** Subject prefix override (defaults to moduleName) */\n subjectPrefix?: string;\n /** Custom logger label */\n loggerLabel?: string;\n}\n\n/**\n * Generic Module Events Service\n *\n * Provides a consistent interface for publishing domain events across all modules.\n * Automatically falls back to in-memory publisher when NATS is not configured.\n */\nexport class ModuleEventsService {\n private readonly productSource: string;\n private readonly subjectPrefix: string;\n private readonly loggerLabel: string;\n private publisher: IEventPublisher;\n private connected = false;\n private connecting: Promise<void> | null = null;\n\n constructor(config: ModuleEventsConfig) {\n this.productSource = config.moduleName;\n this.subjectPrefix = config.subjectPrefix || config.moduleName;\n this.loggerLabel =\n config.loggerLabel || `${config.moduleName.charAt(0).toUpperCase()}${config.moduleName.slice(1)}EventsService`;\n\n // Initialize publisher based on environment\n if (process.env['REDIS_URL']) {\n this.publisher = EventQueueFactory.createPublisherFromEnv();\n logger.info(`[${this.loggerLabel}] Using Redis Streams publisher`);\n } else {\n this.publisher = new MemoryEventPublisher();\n logger.info(`[${this.loggerLabel}] Using in-memory publisher (REDIS_URL not configured)`);\n }\n }\n\n /**\n * Ensure publisher is connected before publishing\n */\n private async ensureConnected(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n if (this.connecting) {\n await this.connecting;\n return;\n }\n\n this.connecting = this.publisher.connect().then(() => {\n this.connected = true;\n this.connecting = null;\n logger.info(`[${this.loggerLabel}] Publisher connected`);\n });\n\n await this.connecting;\n }\n\n /**\n * Publish an event to the queue\n */\n private async publish(subject: string, payload: unknown): Promise<void> {\n await this.ensureConnected();\n await this.publisher.publish({\n subject,\n data: payload as Record<string, unknown>,\n });\n }\n\n /**\n * Build event payload\n */\n private buildPayload(\n type: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string,\n correlationId?: string\n ): ModuleEventPayload {\n return {\n id,\n type,\n action,\n data,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n ...(correlationId && { correlationId }),\n },\n };\n }\n\n /**\n * Build subject string\n */\n private buildSubject(entityType: string, action: string): string {\n // Convert entityType from PascalCase to lowercase (e.g., UniversalTag -> tag)\n const normalizedType = entityType\n .replace(/^Universal/, '')\n .replace(/([A-Z])/g, (_match, p1, offset) => (offset > 0 ? '_' : '') + (p1 as string).toLowerCase())\n .replace(/^_/, '');\n return `${this.subjectPrefix}.${normalizedType}.${action}`;\n }\n\n /**\n * Publish entity created event\n */\n async publishCreated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'created', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'created'), payload);\n }\n\n /**\n * Publish entity updated event\n */\n async publishUpdated(\n entityType: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'updated', id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'updated'), payload);\n }\n\n /**\n * Publish entity deleted event\n */\n async publishDeleted(\n entityType: string,\n id: string,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, 'deleted', id, {}, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, 'deleted'), payload);\n }\n\n /**\n * Publish custom action event\n */\n async publishCustom(\n entityType: string,\n action: string,\n id: string,\n data: Record<string, unknown>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload = this.buildPayload(entityType, action, id, data, userId, tenantId, workspaceId);\n await this.publish(this.buildSubject(entityType, action), payload);\n }\n\n /**\n * Publish bulk created event\n */\n async publishBulkCreated(\n _entityType: string,\n items: Array<{ id: string; data: Record<string, unknown> }>,\n userId: string,\n tenantId?: string,\n workspaceId?: string\n ): Promise<void> {\n const payload: BulkEventPayload = {\n items,\n metadata: {\n tenantId,\n workspaceId,\n userId,\n timestamp: new Date().toISOString(),\n productSource: this.productSource,\n },\n };\n await this.publish(`${this.subjectPrefix}.bulk.created`, payload);\n }\n\n /**\n * Close event queue connection\n */\n async close(): Promise<void> {\n if (this.connected) {\n await this.publisher.disconnect();\n this.connected = false;\n logger.info(`[${this.loggerLabel}] Publisher disconnected`);\n }\n }\n\n /**\n * Get health check status\n */\n async healthCheck(): Promise<{ healthy: boolean; message: string }> {\n const result = await this.publisher.healthCheck();\n const isHealthy = result.status === 'healthy';\n return {\n healthy: isHealthy,\n message: result.error || (isHealthy ? 'Healthy' : 'Unhealthy'),\n };\n }\n}\n\n/**\n * Create a module events service instance\n */\nexport function createModuleEventsService(config: ModuleEventsConfig): ModuleEventsService {\n return new ModuleEventsService(config);\n}\n","/**\n * Events Module\n * Helpers for sending events to the Redis Streams event queue\n */\n\nimport type { BurdenoffGraphQLClient } from '../client/graphql.js';\nimport type { SDKContext } from '../types/index.js';\nimport { logger } from '../logger/index.js';\n\nexport enum EventPriority {\n LOW = 'low',\n NORMAL = 'normal',\n HIGH = 'high',\n CRITICAL = 'critical',\n}\n\nexport interface PublishEventOptions {\n /** Event subject/topic */\n subject: string;\n /** Event payload */\n data: Record<string, unknown>;\n /** Event priority */\n priority?: EventPriority;\n /** Event metadata */\n metadata?: Record<string, unknown>;\n /** Delay delivery by milliseconds */\n delay?: number;\n /** Message ID (for deduplication) */\n messageId?: string;\n /** Workspace context */\n workspaceId?: string;\n /** Organization context */\n organizationId?: string;\n}\n\nexport interface SubscribeOptions {\n /** Subject pattern to subscribe to */\n subject: string;\n /** Queue group name */\n queueGroup?: string;\n /** Durable consumer name */\n durableName?: string;\n /** Start from specific position */\n startPosition?: 'first' | 'last' | 'new';\n /** Acknowledge mode */\n ackMode?: 'explicit' | 'auto';\n /** Max messages to deliver */\n maxDeliver?: number;\n /** Acknowledgment timeout in milliseconds */\n ackWait?: number;\n}\n\nexport interface EventMessage {\n id: string;\n subject: string;\n data: Record<string, unknown>;\n priority: EventPriority;\n metadata?: Record<string, unknown>;\n workspaceId?: string;\n organizationId?: string;\n publishedAt: string;\n publishedBy?: string;\n}\n\nexport interface PublishResult {\n messageId: string;\n subject: string;\n sequence: number;\n timestamp: string;\n}\n\nexport interface StreamInfo {\n name: string;\n subjects: string[];\n messageCount: number;\n byteCount: number;\n firstSequence: number;\n lastSequence: number;\n consumerCount: number;\n}\n\n/**\n * Events Module\n */\nexport class EventsModule {\n constructor(\n private client: BurdenoffGraphQLClient,\n private context: SDKContext\n ) {}\n\n /**\n * Create stream\n */\n public async createStream(\n name: string,\n subjects: string[],\n options?: {\n maxMessages?: number;\n maxBytes?: number;\n maxAge?: number;\n storageType?: 'file' | 'memory';\n replicas?: number;\n }\n ): Promise<StreamInfo> {\n logger.debug('[Events] Creating stream', { name, subjects });\n\n const mutation = `\n mutation CreateStream($input: CreateStreamInput!) {\n createStream(input: $input) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const variables = {\n input: {\n name,\n subjects,\n maxMessages: options?.maxMessages,\n maxBytes: options?.maxBytes,\n maxAge: options?.maxAge,\n storageType: options?.storageType || 'file',\n replicas: options?.replicas || 1,\n },\n };\n\n const response = await this.client.query<{ createStream: StreamInfo }>(mutation, variables, this.context);\n\n logger.info('[Events] Stream created', { name });\n\n return response.createStream;\n }\n\n /**\n * Get stream info\n */\n public async getStreamInfo(name: string): Promise<StreamInfo> {\n logger.debug('[Events] Getting stream info', { name });\n\n const query = `\n query GetStreamInfo($name: String!) {\n getStreamInfo(name: $name) {\n name\n subjects\n messageCount\n byteCount\n firstSequence\n lastSequence\n consumerCount\n }\n }\n `;\n\n const response = await this.client.query<{ getStreamInfo: StreamInfo }>(query, { name }, this.context);\n\n return response.getStreamInfo;\n }\n\n /**\n * Delete stream\n */\n public async deleteStream(name: string): Promise<boolean> {\n logger.debug('[Events] Deleting stream', { name });\n\n const mutation = `\n mutation DeleteStream($name: String!) {\n deleteStream(name: $name) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { name }, this.context);\n\n logger.info('[Events] Stream deleted', { name });\n\n return true;\n }\n\n /**\n * Purge stream messages\n */\n public async purgeStream(name: string, options?: { subject?: string; sequence?: number }): Promise<number> {\n logger.debug('[Events] Purging stream', { name, options });\n\n const mutation = `\n mutation PurgeStream($name: String!, $subject: String, $sequence: Int) {\n purgeStream(name: $name, subject: $subject, sequence: $sequence) {\n purgedCount\n }\n }\n `;\n\n const response = await this.client.query<{ purgeStream: { purgedCount: number } }>(\n mutation,\n { name, subject: options?.subject, sequence: options?.sequence },\n this.context\n );\n\n logger.info('[Events] Stream purged', { name, purgedCount: response.purgeStream.purgedCount });\n\n return response.purgeStream.purgedCount;\n }\n\n /**\n * Create consumer\n */\n public async createConsumer(\n streamName: string,\n consumerName: string,\n options: SubscribeOptions\n ): Promise<{ name: string; pending: number }> {\n logger.debug('[Events] Creating consumer', { streamName, consumerName });\n\n const mutation = `\n mutation CreateConsumer($input: CreateConsumerInput!) {\n createConsumer(input: $input) {\n name\n pending\n }\n }\n `;\n\n const variables = {\n input: {\n streamName,\n consumerName,\n subject: options.subject,\n queueGroup: options.queueGroup,\n durableName: options.durableName,\n startPosition: options.startPosition || 'last',\n ackMode: options.ackMode || 'explicit',\n maxDeliver: options.maxDeliver || 5,\n ackWait: options.ackWait || 30000,\n },\n };\n\n const response = await this.client.query<{ createConsumer: { name: string; pending: number } }>(\n mutation,\n variables,\n this.context\n );\n\n logger.info('[Events] Consumer created', { consumerName });\n\n return response.createConsumer;\n }\n\n /**\n * Delete consumer\n */\n public async deleteConsumer(streamName: string, consumerName: string): Promise<boolean> {\n logger.debug('[Events] Deleting consumer', { streamName, consumerName });\n\n const mutation = `\n mutation DeleteConsumer($streamName: String!, $consumerName: String!) {\n deleteConsumer(streamName: $streamName, consumerName: $consumerName) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName }, this.context);\n\n logger.info('[Events] Consumer deleted', { consumerName });\n\n return true;\n }\n\n /**\n * Acknowledge message\n */\n public async ackMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation AckMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n ackMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Negative acknowledge message (requeue)\n */\n public async nakMessage(streamName: string, consumerName: string, sequence: number): Promise<boolean> {\n logger.debug('[Events] Negative acknowledging message', { streamName, consumerName, sequence });\n\n const mutation = `\n mutation NakMessage($streamName: String!, $consumerName: String!, $sequence: Int!) {\n nakMessage(streamName: $streamName, consumerName: $consumerName, sequence: $sequence) {\n success\n }\n }\n `;\n\n await this.client.query(mutation, { streamName, consumerName, sequence }, this.context);\n\n return true;\n }\n\n /**\n * Get consumer info\n */\n public async getConsumerInfo(\n streamName: string,\n consumerName: string\n ): Promise<{\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n }> {\n logger.debug('[Events] Getting consumer info', { streamName, consumerName });\n\n const query = `\n query GetConsumerInfo($streamName: String!, $consumerName: String!) {\n getConsumerInfo(streamName: $streamName, consumerName: $consumerName) {\n name\n pending\n redelivered\n numAckPending\n }\n }\n `;\n\n const response = await this.client.query<{\n getConsumerInfo: {\n name: string;\n pending: number;\n redelivered: number;\n numAckPending: number;\n };\n }>(query, { streamName, consumerName }, this.context);\n\n return response.getConsumerInfo;\n }\n}\n"]}
@@ -1375,5 +1375,5 @@ var buildSecurityPlugins = /* @__PURE__ */ __name(async (options) => {
1375
1375
  }, "buildSecurityPlugins");
1376
1376
 
1377
1377
  export { DEFAULT_ARMOR_CONFIG, DEFAULT_COST_MAP, DEFAULT_TIERS, MemoryValkey, __resetMetricsForTest, __setSecurityValkeyForTest, buildSecurityPlugins, checkRateLimit, createArmorPlugins, createOperationTimeoutPlugin, createOtelPlugin, createQueryComplexityPlugin, createRateLimitPlugin, getMetrics, getSecurityValkey, initializeMetrics, initializeOtel, initializeSecurityValkey, mergeCostMap, resolveActor, resolveSecurityOptionsFromEnv, resolveTiersFromEnv, scrapeMetrics, security_exports, shutdownOtel };
1378
- //# sourceMappingURL=chunk-AIBMTE56.js.map
1379
- //# sourceMappingURL=chunk-AIBMTE56.js.map
1378
+ //# sourceMappingURL=chunk-KXY4RSYI.js.map
1379
+ //# sourceMappingURL=chunk-KXY4RSYI.js.map