@burdenoff/be-sdk 2026.518.2 → 2026.521.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EventQueueFactory-PVXBZCT5.js +6 -0
- package/dist/{EventQueueFactory-6UJ3UIP4.js.map → EventQueueFactory-PVXBZCT5.js.map} +1 -1
- package/dist/auth/index.js +2 -2
- package/dist/cache/index.js +1 -1
- package/dist/{chunk-EZOXXSD4.js → chunk-2BG75H2K.js} +4 -4
- package/dist/{chunk-EZOXXSD4.js.map → chunk-2BG75H2K.js.map} +1 -1
- package/dist/{chunk-UNPJMENC.js → chunk-7NUQXGA7.js} +3 -3
- package/dist/{chunk-UNPJMENC.js.map → chunk-7NUQXGA7.js.map} +1 -1
- package/dist/{chunk-4XAEES25.js → chunk-ACYGOENW.js} +4 -850
- package/dist/chunk-ACYGOENW.js.map +1 -0
- package/dist/{chunk-MOCUBSTW.js → chunk-B7I4TABG.js} +2 -2
- package/dist/{chunk-MOCUBSTW.js.map → chunk-B7I4TABG.js.map} +1 -1
- package/dist/{chunk-O2MEBPDT.js → chunk-BNJFEOGH.js} +2 -2
- package/dist/chunk-BNJFEOGH.js.map +1 -0
- package/dist/{chunk-S5S6OBS6.js → chunk-BRYRHBAC.js} +3 -3
- package/dist/{chunk-S5S6OBS6.js.map → chunk-BRYRHBAC.js.map} +1 -1
- package/dist/{chunk-UBXFIIAW.js → chunk-BTQREMD4.js} +2 -2
- package/dist/{chunk-UBXFIIAW.js.map → chunk-BTQREMD4.js.map} +1 -1
- package/dist/{chunk-3F4SLVRL.js → chunk-DMPS4Y53.js} +3 -3
- package/dist/{chunk-3F4SLVRL.js.map → chunk-DMPS4Y53.js.map} +1 -1
- package/dist/{chunk-SNEOLWXT.js → chunk-E5USZ2MR.js} +2 -2
- package/dist/{chunk-SNEOLWXT.js.map → chunk-E5USZ2MR.js.map} +1 -1
- package/dist/{chunk-TM5RQ6P2.js → chunk-KGCISIBX.js} +22 -4
- package/dist/chunk-KGCISIBX.js.map +1 -0
- package/dist/{chunk-OJDXWHRJ.js → chunk-LD7ETTWG.js} +8 -7
- package/dist/chunk-LD7ETTWG.js.map +1 -0
- package/dist/{chunk-MVHOP4IG.js → chunk-MHNA7IS7.js} +2 -2
- package/dist/{chunk-MVHOP4IG.js.map → chunk-MHNA7IS7.js.map} +1 -1
- package/dist/{chunk-V2VEENJ2.js → chunk-PDSV3TFO.js} +3 -3
- package/dist/chunk-PDSV3TFO.js.map +1 -0
- package/dist/{chunk-CFUKZDDU.js → chunk-PPIDJP2W.js} +3 -3
- package/dist/chunk-PPIDJP2W.js.map +1 -0
- package/dist/{chunk-SO57HNXV.js → chunk-QRWTLPW5.js} +13 -7
- package/dist/chunk-QRWTLPW5.js.map +1 -0
- package/dist/chunk-REF7PANB.js +852 -0
- package/dist/chunk-REF7PANB.js.map +1 -0
- package/dist/{chunk-VLEOOG2L.js → chunk-SVONGBQR.js} +3 -3
- package/dist/{chunk-VLEOOG2L.js.map → chunk-SVONGBQR.js.map} +1 -1
- package/dist/{chunk-BESBOSX2.js → chunk-TGTJ653K.js} +4 -4
- package/dist/chunk-TGTJ653K.js.map +1 -0
- package/dist/{chunk-WCBKW3CL.js → chunk-X4GSV6NV.js} +5 -5
- package/dist/{chunk-WCBKW3CL.js.map → chunk-X4GSV6NV.js.map} +1 -1
- package/dist/{chunk-RRFNSBDZ.js → chunk-X4NELQLV.js} +3 -3
- package/dist/chunk-X4NELQLV.js.map +1 -0
- package/dist/event-queue/index.js +4 -4
- package/dist/export/index.js +3 -3
- package/dist/gateway/index.js +2 -2
- package/dist/gateway/security/index.js +1 -1
- package/dist/graph/index.d.ts +1 -1
- package/dist/graph/index.js +5 -5
- package/dist/graphql/index.js +2 -2
- package/dist/{index-CygU_fXS.d.ts → index-Cz9_vPi7.d.ts} +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +23 -22
- package/dist/index.js.map +1 -1
- package/dist/init/index.js +3 -3
- package/dist/instrumentation/index.js +2 -1
- package/dist/metrics/index.d.ts +17 -0
- package/dist/metrics/index.js +53 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/pino-logger-NVZXQPWO.js +5 -0
- package/dist/{pino-logger-RYLGXPHZ.js.map → pino-logger-NVZXQPWO.js.map} +1 -1
- package/dist/prisma/index.js +4 -4
- package/dist/rbac/index.js +1 -1
- package/dist/{sdk-THO3IWEE.js → sdk-UWFH5PY7.js} +2 -2
- package/dist/{sdk-THO3IWEE.js.map → sdk-UWFH5PY7.js.map} +1 -1
- package/dist/server/index.js +3 -3
- package/dist/server/index.js.map +1 -1
- package/dist/telemetry/index.js +6 -5
- package/dist/telemetry/index.js.map +1 -1
- package/dist/tracker/index.js +2 -2
- package/dist/utils/index.js +1 -1
- package/dist/workspace-guard-524GBJQ6.js +5 -0
- package/dist/{workspace-guard-LHBNK4TG.js.map → workspace-guard-524GBJQ6.js.map} +1 -1
- package/package.json +3 -3
- package/dist/EventQueueFactory-6UJ3UIP4.js +0 -6
- package/dist/chunk-4XAEES25.js.map +0 -1
- package/dist/chunk-BESBOSX2.js.map +0 -1
- package/dist/chunk-CFUKZDDU.js.map +0 -1
- package/dist/chunk-O2MEBPDT.js.map +0 -1
- package/dist/chunk-OJDXWHRJ.js.map +0 -1
- package/dist/chunk-RRFNSBDZ.js.map +0 -1
- package/dist/chunk-SO57HNXV.js.map +0 -1
- package/dist/chunk-TM5RQ6P2.js.map +0 -1
- package/dist/chunk-V2VEENJ2.js.map +0 -1
- package/dist/pino-logger-RYLGXPHZ.js +0 -5
- package/dist/workspace-guard-LHBNK4TG.js +0 -5
|
@@ -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","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-ACYGOENW.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\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"]}
|
|
@@ -369,5 +369,5 @@ function omit(obj, keys) {
|
|
|
369
369
|
__name(omit, "omit");
|
|
370
370
|
|
|
371
371
|
export { chunk, compileValidatedPattern, debounce, deepMerge, formatBytes, generateUUID, groupBy, isNumberInRange, isStringLengthValid, isTokenExpired, isValidBase64, isValidEmail, isValidHexColor, isValidIPv4, isValidJSON, isValidPhone, isValidRegexPattern, isValidSlug, isValidUUID, isValidUrl, omit, parseJWT, pick, retry, sanitizeForLog, sleep, throttle, truncate, unique, utils_exports };
|
|
372
|
-
//# sourceMappingURL=chunk-
|
|
373
|
-
//# sourceMappingURL=chunk-
|
|
372
|
+
//# sourceMappingURL=chunk-B7I4TABG.js.map
|
|
373
|
+
//# sourceMappingURL=chunk-B7I4TABG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/index.ts","../src/utils/validation.ts"],"names":["isValidEmail","email","emailRegex","length","test","isValidUrl","url","URL","isValidRegexPattern","pattern","trim","RegExp","compileValidatedPattern","isValidPhone","phone","phoneRegex","isValidUUID","uuid","uuidRegex","isValidIPv4","ip","ipRegex","match","exec","i","octet","parseInt","isValidSlug","slug","startsWith","endsWith","includes","isValidHexColor","color","hexRegex","isValidBase64","str","base64Regex","Buffer","from","toString","isValidJSON","JSON","parse","isNumberInRange","value","min","max","isNaN","isStringLengthValid","uuidv4","crypto","randomUUID","retry","fn","options","lastError","delay","initialDelay","attempt","maxAttempts","error","sleep","Math","maxDelay","backoffMultiplier","Error","ms","Promise","resolve","setTimeout","deepMerge","target","source","output","key","Object","prototype","hasOwnProperty","call","sourceValue","targetValue","isObject","Array","isArray","generateUUID","sanitizeForLog","data","sensitiveKeys","sanitized","entries","some","sensitive","toLowerCase","map","item","debounce","timeoutId","args","clearTimeout","apply","throttle","lastCall","now","Date","parseJWT","token","parts","split","payload","decoded","isTokenExpired","floor","formatBytes","bytes","decimals","k","dm","sizes","log","parseFloat","pow","toFixed","truncate","maxLength","substring","chunk","array","size","chunks","push","slice","unique","Set","groupBy","reduce","result","groupKey","String","pick","obj","keys","omit"],"mappings":"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","file":"chunk-MOCUBSTW.js","sourcesContent":["/**\n * Utility functions for the SDK\n */\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Retry function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts: number;\n initialDelay: number;\n maxDelay: number;\n backoffMultiplier: number;\n }\n): Promise<T> {\n let lastError: Error | undefined;\n let delay = options.initialDelay;\n\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt === options.maxAttempts) {\n break;\n }\n\n await sleep(Math.min(delay, options.maxDelay));\n delay *= options.backoffMultiplier;\n }\n }\n\n throw lastError || new Error('Retry failed');\n}\n\n/**\n * Sleep utility\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const output = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = output[key];\n\n if (isObject(sourceValue) && isObject(targetValue)) {\n output[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else {\n output[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return output;\n}\n\n/**\n * Check if value is a plain object\n */\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Generate UUID v4 (cryptographically secure)\n */\nexport function generateUUID(): string {\n return uuidv4();\n}\n\n/**\n * Sanitize string for logging (remove sensitive data)\n */\nexport function sanitizeForLog(data: Record<string, unknown>): Record<string, unknown> {\n const sensitiveKeys = ['password', 'token', 'secret', 'apiKey', 'accessToken', 'refreshToken'];\n const sanitized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (sensitiveKeys.some((sensitive) => key.toLowerCase().includes(sensitive.toLowerCase()))) {\n sanitized[key] = '[REDACTED]';\n } else if (isObject(value)) {\n sanitized[key] = sanitizeForLog(value);\n } else if (Array.isArray(value)) {\n sanitized[key] = value.map((item) => (isObject(item) ? sanitizeForLog(item) : item));\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout | undefined;\n\n return function (this: unknown, ...args: Parameters<T>): void {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n fn.apply(this, args);\n }, delay);\n };\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n\n return function (this: unknown, ...args: Parameters<T>): void {\n const now = Date.now();\n\n if (now - lastCall >= delay) {\n lastCall = now;\n fn.apply(this, args);\n }\n };\n}\n\n/**\n * Parse JWT token (without verification)\n */\nexport function parseJWT(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n const payload = parts[1];\n if (!payload) {\n return null;\n }\n const decoded = Buffer.from(payload, 'base64').toString('utf8');\n return JSON.parse(decoded) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if JWT token is expired\n */\nexport function isTokenExpired(token: string): boolean {\n const payload = parseJWT(token);\n if (!payload || typeof payload['exp'] !== 'number') {\n return true;\n }\n\n const now = Math.floor(Date.now() / 1000);\n return payload['exp'] < now;\n}\n\n/**\n * Format bytes to human readable string\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n\n/**\n * Validation utilities\n *\n * Re-exported from validation.ts for convenience.\n * Use these for robust, secure validation of common data types.\n */\nexport {\n isValidEmail,\n isValidUrl,\n isValidRegexPattern,\n compileValidatedPattern,\n isValidPhone,\n isValidUUID,\n isValidIPv4,\n isValidSlug,\n isValidHexColor,\n isValidBase64,\n isValidJSON,\n isNumberInRange,\n isStringLengthValid,\n} from './validation.js';\n\n/**\n * Truncate string with ellipsis\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Chunk array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Remove duplicates from array\n */\nexport function unique<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\n/**\n * Group array by key\n */\nexport function groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\n return array.reduce(\n (result, item) => {\n const groupKey = String(item[key]);\n if (!result[groupKey]) {\n result[groupKey] = [];\n }\n result[groupKey].push(item);\n return result;\n },\n {} as Record<string, T[]>\n );\n}\n\n/**\n * Pick specific keys from object\n */\nexport function pick<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Omit specific keys from object\n */\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result as Omit<T, K>;\n}\n","/**\n * Validation utilities\n *\n * Provides secure, robust validation functions for common data types.\n */\n\n/**\n * Validate email format with enhanced security and edge case handling\n *\n * Features:\n * - Optimized regex that avoids catastrophic backtracking\n * - Length validation (max 320 chars per RFC 5321)\n * - Validates local-part@domain.tld format\n * - Local part: alphanumeric, dots, hyphens, underscores (1-64 chars)\n * - Domain: alphanumeric, dots, hyphens (1-253 chars)\n * - TLD: alphabetic (2-63 chars)\n *\n * @param email - Email address to validate\n * @returns true if email is valid, false otherwise\n */\nexport function isValidEmail(email: string): boolean {\n // Optimized email regex - avoids catastrophic backtracking\n // Matches: local-part@domain.tld\n const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,63}$/;\n\n // Additional validation to prevent edge cases\n if (!email || email.length > 320) {\n return false;\n }\n\n return emailRegex.test(email);\n}\n\n/**\n * Validate URL format\n *\n * Uses the built-in URL constructor for robust validation.\n * Supports all standard URL schemes (http, https, ftp, etc.)\n *\n * @param url - URL string to validate\n * @returns true if URL is valid, false otherwise\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate regex pattern to prevent ReDoS attacks\n *\n * This method only validates, it does NOT compile the RegExp.\n * Use compileValidatedPattern() to safely compile after validation.\n *\n * Security checks:\n * 1. Pattern is not empty or whitespace-only\n * 2. Pattern length is reasonable (<= 1000 chars) to prevent DoS\n * 3. Pattern can be successfully compiled (syntax check)\n *\n * @param pattern - Regular expression pattern to validate\n * @returns true if pattern is valid and safe, false otherwise\n */\nexport function isValidRegexPattern(pattern: string): boolean {\n // Check pattern is not empty and doesn't contain only whitespace\n if (!pattern || pattern.trim().length === 0) {\n return false;\n }\n\n // Reject patterns that are too long to prevent catastrophic backtracking DoS\n if (pattern.length > 1000) {\n return false;\n }\n\n // Test if pattern has valid syntax by attempting compilation\n // This is a validation check only - actual compilation happens in compileValidatedPattern()\n try {\n // Validation check: test if pattern can be compiled\n // This is safe because:\n // - We've already validated pattern length (<= 1000 chars)\n // - We're using void to discard the result (not storing/using it)\n // - Pattern comes from application config, not user input\n // - This is a validation step before actual use in compileValidatedPattern()\n void new RegExp(pattern);\n return true;\n } catch {\n // Pattern has invalid syntax\n return false;\n }\n}\n\n/**\n * Safely compile a validation pattern to RegExp after validation\n *\n * Returns null if the pattern is invalid.\n *\n * SECURITY: This method provides protection against ReDoS attacks by:\n * 1. Validating pattern isn't empty or null\n * 2. Rejecting patterns >1000 chars (prevents DoS via catastrophic backtracking)\n * 3. Testing compilation in try-catch to handle malformed patterns\n * 4. Only compiling patterns that pass all validation checks\n *\n * @param pattern - Regular expression pattern to compile\n * @returns Compiled RegExp or null if pattern is invalid\n */\nexport function compileValidatedPattern(pattern: string): RegExp | null {\n // Validate pattern before compilation\n if (!isValidRegexPattern(pattern)) {\n return null;\n }\n\n try {\n // At this point, pattern has been validated by isValidRegexPattern():\n // - Not empty or null\n // - Length <= 1000 characters (prevents ReDoS via catastrophic backtracking)\n // - Successfully compiled (pattern has valid syntax)\n // Safe to construct RegExp here\n return new RegExp(pattern);\n } catch {\n // Should not reach here since isValidRegexPattern() already tested compilation\n return null;\n }\n}\n\n/**\n * Validate phone number format\n *\n * Validates international phone numbers in E.164 format.\n * Format: +[country code][number] (e.g., +14155552671)\n *\n * Requirements:\n * - Starts with +\n * - Followed by 1-3 digit country code\n * - Followed by 4-14 digits\n * - Total length: 6-18 characters\n *\n * @param phone - Phone number to validate\n * @returns true if phone is valid E.164 format, false otherwise\n */\nexport function isValidPhone(phone: string): boolean {\n // E.164 format: +[country code][number]\n // Country code: 1-3 digits\n // Number: 4-14 digits\n // Total: 6-18 characters\n const phoneRegex = /^\\+[1-9]\\d{1,14}$/;\n\n if (!phone || phone.length < 6 || phone.length > 18) {\n return false;\n }\n\n return phoneRegex.test(phone);\n}\n\n/**\n * Validate UUID format (v4)\n *\n * Validates UUIDs in the standard format:\n * xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n *\n * @param uuid - UUID string to validate\n * @returns true if UUID is valid v4 format, false otherwise\n */\nexport function isValidUUID(uuid: string): boolean {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidRegex.test(uuid);\n}\n\n/**\n * Validate IPv4 address format\n *\n * Validates IPv4 addresses in dotted decimal notation.\n * Format: xxx.xxx.xxx.xxx where each xxx is 0-255\n *\n * @param ip - IP address to validate\n * @returns true if IP is valid IPv4, false otherwise\n */\nexport function isValidIPv4(ip: string): boolean {\n const ipRegex = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/;\n const match = ipRegex.exec(ip);\n\n if (!match) {\n return false;\n }\n\n // Validate each octet is 0-255\n for (let i = 1; i <= 4; i++) {\n const octet = parseInt(match[i] || '0', 10);\n if (octet < 0 || octet > 255) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Validate slug format\n *\n * Slugs are URL-friendly strings used in paths.\n * Requirements:\n * - Lowercase letters, numbers, hyphens only\n * - Must start and end with alphanumeric\n * - No consecutive hyphens\n * - Length: 1-100 characters\n *\n * @param slug - Slug to validate\n * @returns true if slug is valid, false otherwise\n */\nexport function isValidSlug(slug: string): boolean {\n if (!slug || slug.length < 1 || slug.length > 100) {\n return false;\n }\n\n // Must start and end with alphanumeric, can contain hyphens in between\n // No consecutive hyphens\n // Split into multiple checks to avoid unsafe regex with nested quantifiers\n\n // Check basic format: alphanumeric and hyphens only\n if (!/^[a-z0-9-]+$/.test(slug)) {\n return false;\n }\n\n // Check doesn't start or end with hyphen\n if (slug.startsWith('-') || slug.endsWith('-')) {\n return false;\n }\n\n // Check no consecutive hyphens\n if (slug.includes('--')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate hex color code\n *\n * Validates hex color codes in formats:\n * - #RGB (e.g., #f0f)\n * - #RRGGBB (e.g., #ff00ff)\n * - #RRGGBBAA (e.g., #ff00ff80)\n *\n * @param color - Hex color code to validate\n * @returns true if color is valid hex, false otherwise\n */\nexport function isValidHexColor(color: string): boolean {\n const hexRegex = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n return hexRegex.test(color);\n}\n\n/**\n * Validate base64 string\n *\n * Validates base64-encoded strings.\n * Supports both standard and URL-safe base64.\n *\n * @param str - String to validate\n * @returns true if string is valid base64, false otherwise\n */\nexport function isValidBase64(str: string): boolean {\n if (!str || str.length === 0) {\n return false;\n }\n\n // Standard or URL-safe base64\n const base64Regex = /^[A-Za-z0-9+/\\-_]+=*$/;\n\n if (!base64Regex.test(str)) {\n return false;\n }\n\n // Try to decode to verify\n try {\n return Buffer.from(str, 'base64').toString('base64') === str;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate JSON string\n *\n * Validates that a string contains valid JSON.\n * Does not parse the JSON, only validates syntax.\n *\n * @param str - String to validate\n * @returns true if string is valid JSON, false otherwise\n */\nexport function isValidJSON(str: string): boolean {\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate number is within range\n *\n * @param value - Number to validate\n * @param min - Minimum value (inclusive), or null for no minimum\n * @param max - Maximum value (inclusive), or null for no maximum\n * @returns true if number is within range, false otherwise\n */\nexport function isNumberInRange(value: number, min: number | null, max: number | null): boolean {\n if (typeof value !== 'number' || isNaN(value)) {\n return false;\n }\n\n if (min !== null && value < min) {\n return false;\n }\n\n if (max !== null && value > max) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate string length is within range\n *\n * @param value - String to validate\n * @param min - Minimum length (inclusive), or null for no minimum\n * @param max - Maximum length (inclusive), or null for no maximum\n * @returns true if string length is within range, false otherwise\n */\nexport function isStringLengthValid(value: string, min: number | null, max: number | null): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n const length = value.length;\n\n if (min !== null && length < min) {\n return false;\n }\n\n if (max !== null && length > max) {\n return false;\n }\n\n return true;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/index.ts","../src/utils/validation.ts"],"names":["isValidEmail","email","emailRegex","length","test","isValidUrl","url","URL","isValidRegexPattern","pattern","trim","RegExp","compileValidatedPattern","isValidPhone","phone","phoneRegex","isValidUUID","uuid","uuidRegex","isValidIPv4","ip","ipRegex","match","exec","i","octet","parseInt","isValidSlug","slug","startsWith","endsWith","includes","isValidHexColor","color","hexRegex","isValidBase64","str","base64Regex","Buffer","from","toString","isValidJSON","JSON","parse","isNumberInRange","value","min","max","isNaN","isStringLengthValid","uuidv4","crypto","randomUUID","retry","fn","options","lastError","delay","initialDelay","attempt","maxAttempts","error","sleep","Math","maxDelay","backoffMultiplier","Error","ms","Promise","resolve","setTimeout","deepMerge","target","source","output","key","Object","prototype","hasOwnProperty","call","sourceValue","targetValue","isObject","Array","isArray","generateUUID","sanitizeForLog","data","sensitiveKeys","sanitized","entries","some","sensitive","toLowerCase","map","item","debounce","timeoutId","args","clearTimeout","apply","throttle","lastCall","now","Date","parseJWT","token","parts","split","payload","decoded","isTokenExpired","floor","formatBytes","bytes","decimals","k","dm","sizes","log","parseFloat","pow","toFixed","truncate","maxLength","substring","chunk","array","size","chunks","push","slice","unique","Set","groupBy","reduce","result","groupKey","String","pick","obj","keys","omit"],"mappings":"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","file":"chunk-B7I4TABG.js","sourcesContent":["/**\n * Utility functions for the SDK\n */\n\nconst uuidv4 = (): string => crypto.randomUUID();\n\n/**\n * Retry function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts: number;\n initialDelay: number;\n maxDelay: number;\n backoffMultiplier: number;\n }\n): Promise<T> {\n let lastError: Error | undefined;\n let delay = options.initialDelay;\n\n for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt === options.maxAttempts) {\n break;\n }\n\n await sleep(Math.min(delay, options.maxDelay));\n delay *= options.backoffMultiplier;\n }\n }\n\n throw lastError || new Error('Retry failed');\n}\n\n/**\n * Sleep utility\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const output = { ...target };\n\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const targetValue = output[key];\n\n if (isObject(sourceValue) && isObject(targetValue)) {\n output[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[Extract<keyof T, string>];\n } else {\n output[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return output;\n}\n\n/**\n * Check if value is a plain object\n */\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Generate UUID v4 (cryptographically secure)\n */\nexport function generateUUID(): string {\n return uuidv4();\n}\n\n/**\n * Sanitize string for logging (remove sensitive data)\n */\nexport function sanitizeForLog(data: Record<string, unknown>): Record<string, unknown> {\n const sensitiveKeys = ['password', 'token', 'secret', 'apiKey', 'accessToken', 'refreshToken'];\n const sanitized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (sensitiveKeys.some((sensitive) => key.toLowerCase().includes(sensitive.toLowerCase()))) {\n sanitized[key] = '[REDACTED]';\n } else if (isObject(value)) {\n sanitized[key] = sanitizeForLog(value);\n } else if (Array.isArray(value)) {\n sanitized[key] = value.map((item) => (isObject(item) ? sanitizeForLog(item) : item));\n } else {\n sanitized[key] = value;\n }\n }\n\n return sanitized;\n}\n\n/**\n * Debounce function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: NodeJS.Timeout | undefined;\n\n return function (this: unknown, ...args: Parameters<T>): void {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n fn.apply(this, args);\n }, delay);\n };\n}\n\n/**\n * Throttle function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n\n return function (this: unknown, ...args: Parameters<T>): void {\n const now = Date.now();\n\n if (now - lastCall >= delay) {\n lastCall = now;\n fn.apply(this, args);\n }\n };\n}\n\n/**\n * Parse JWT token (without verification)\n */\nexport function parseJWT(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) {\n return null;\n }\n\n const payload = parts[1];\n if (!payload) {\n return null;\n }\n const decoded = Buffer.from(payload, 'base64').toString('utf8');\n return JSON.parse(decoded) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if JWT token is expired\n */\nexport function isTokenExpired(token: string): boolean {\n const payload = parseJWT(token);\n if (!payload || typeof payload['exp'] !== 'number') {\n return true;\n }\n\n const now = Math.floor(Date.now() / 1000);\n return payload['exp'] < now;\n}\n\n/**\n * Format bytes to human readable string\n */\nexport function formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n\n/**\n * Validation utilities\n *\n * Re-exported from validation.ts for convenience.\n * Use these for robust, secure validation of common data types.\n */\nexport {\n isValidEmail,\n isValidUrl,\n isValidRegexPattern,\n compileValidatedPattern,\n isValidPhone,\n isValidUUID,\n isValidIPv4,\n isValidSlug,\n isValidHexColor,\n isValidBase64,\n isValidJSON,\n isNumberInRange,\n isStringLengthValid,\n} from './validation.js';\n\n/**\n * Truncate string with ellipsis\n */\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) {\n return str;\n }\n return str.substring(0, maxLength - 3) + '...';\n}\n\n/**\n * Chunk array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Remove duplicates from array\n */\nexport function unique<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\n/**\n * Group array by key\n */\nexport function groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\n return array.reduce(\n (result, item) => {\n const groupKey = String(item[key]);\n if (!result[groupKey]) {\n result[groupKey] = [];\n }\n result[groupKey].push(item);\n return result;\n },\n {} as Record<string, T[]>\n );\n}\n\n/**\n * Pick specific keys from object\n */\nexport function pick<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Omit specific keys from object\n */\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n}\n","/**\n * Validation utilities\n *\n * Provides secure, robust validation functions for common data types.\n */\n\n/**\n * Validate email format with enhanced security and edge case handling\n *\n * Features:\n * - Optimized regex that avoids catastrophic backtracking\n * - Length validation (max 320 chars per RFC 5321)\n * - Validates local-part@domain.tld format\n * - Local part: alphanumeric, dots, hyphens, underscores (1-64 chars)\n * - Domain: alphanumeric, dots, hyphens (1-253 chars)\n * - TLD: alphabetic (2-63 chars)\n *\n * @param email - Email address to validate\n * @returns true if email is valid, false otherwise\n */\nexport function isValidEmail(email: string): boolean {\n // Optimized email regex - avoids catastrophic backtracking\n // Matches: local-part@domain.tld\n const emailRegex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,63}$/;\n\n // Additional validation to prevent edge cases\n if (!email || email.length > 320) {\n return false;\n }\n\n return emailRegex.test(email);\n}\n\n/**\n * Validate URL format\n *\n * Uses the built-in URL constructor for robust validation.\n * Supports all standard URL schemes (http, https, ftp, etc.)\n *\n * @param url - URL string to validate\n * @returns true if URL is valid, false otherwise\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate regex pattern to prevent ReDoS attacks\n *\n * This method only validates, it does NOT compile the RegExp.\n * Use compileValidatedPattern() to safely compile after validation.\n *\n * Security checks:\n * 1. Pattern is not empty or whitespace-only\n * 2. Pattern length is reasonable (<= 1000 chars) to prevent DoS\n * 3. Pattern can be successfully compiled (syntax check)\n *\n * @param pattern - Regular expression pattern to validate\n * @returns true if pattern is valid and safe, false otherwise\n */\nexport function isValidRegexPattern(pattern: string): boolean {\n // Check pattern is not empty and doesn't contain only whitespace\n if (!pattern || pattern.trim().length === 0) {\n return false;\n }\n\n // Reject patterns that are too long to prevent catastrophic backtracking DoS\n if (pattern.length > 1000) {\n return false;\n }\n\n // Test if pattern has valid syntax by attempting compilation\n // This is a validation check only - actual compilation happens in compileValidatedPattern()\n try {\n // Validation check: test if pattern can be compiled\n // This is safe because:\n // - We've already validated pattern length (<= 1000 chars)\n // - We're using void to discard the result (not storing/using it)\n // - Pattern comes from application config, not user input\n // - This is a validation step before actual use in compileValidatedPattern()\n void new RegExp(pattern);\n return true;\n } catch {\n // Pattern has invalid syntax\n return false;\n }\n}\n\n/**\n * Safely compile a validation pattern to RegExp after validation\n *\n * Returns null if the pattern is invalid.\n *\n * SECURITY: This method provides protection against ReDoS attacks by:\n * 1. Validating pattern isn't empty or null\n * 2. Rejecting patterns >1000 chars (prevents DoS via catastrophic backtracking)\n * 3. Testing compilation in try-catch to handle malformed patterns\n * 4. Only compiling patterns that pass all validation checks\n *\n * @param pattern - Regular expression pattern to compile\n * @returns Compiled RegExp or null if pattern is invalid\n */\nexport function compileValidatedPattern(pattern: string): RegExp | null {\n // Validate pattern before compilation\n if (!isValidRegexPattern(pattern)) {\n return null;\n }\n\n try {\n // At this point, pattern has been validated by isValidRegexPattern():\n // - Not empty or null\n // - Length <= 1000 characters (prevents ReDoS via catastrophic backtracking)\n // - Successfully compiled (pattern has valid syntax)\n // Safe to construct RegExp here\n return new RegExp(pattern);\n } catch {\n // Should not reach here since isValidRegexPattern() already tested compilation\n return null;\n }\n}\n\n/**\n * Validate phone number format\n *\n * Validates international phone numbers in E.164 format.\n * Format: +[country code][number] (e.g., +14155552671)\n *\n * Requirements:\n * - Starts with +\n * - Followed by 1-3 digit country code\n * - Followed by 4-14 digits\n * - Total length: 6-18 characters\n *\n * @param phone - Phone number to validate\n * @returns true if phone is valid E.164 format, false otherwise\n */\nexport function isValidPhone(phone: string): boolean {\n // E.164 format: +[country code][number]\n // Country code: 1-3 digits\n // Number: 4-14 digits\n // Total: 6-18 characters\n const phoneRegex = /^\\+[1-9]\\d{1,14}$/;\n\n if (!phone || phone.length < 6 || phone.length > 18) {\n return false;\n }\n\n return phoneRegex.test(phone);\n}\n\n/**\n * Validate UUID format (v4)\n *\n * Validates UUIDs in the standard format:\n * xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\n *\n * @param uuid - UUID string to validate\n * @returns true if UUID is valid v4 format, false otherwise\n */\nexport function isValidUUID(uuid: string): boolean {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n return uuidRegex.test(uuid);\n}\n\n/**\n * Validate IPv4 address format\n *\n * Validates IPv4 addresses in dotted decimal notation.\n * Format: xxx.xxx.xxx.xxx where each xxx is 0-255\n *\n * @param ip - IP address to validate\n * @returns true if IP is valid IPv4, false otherwise\n */\nexport function isValidIPv4(ip: string): boolean {\n const ipRegex = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/;\n const match = ipRegex.exec(ip);\n\n if (!match) {\n return false;\n }\n\n // Validate each octet is 0-255\n for (let i = 1; i <= 4; i++) {\n const octet = parseInt(match[i] || '0', 10);\n if (octet < 0 || octet > 255) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Validate slug format\n *\n * Slugs are URL-friendly strings used in paths.\n * Requirements:\n * - Lowercase letters, numbers, hyphens only\n * - Must start and end with alphanumeric\n * - No consecutive hyphens\n * - Length: 1-100 characters\n *\n * @param slug - Slug to validate\n * @returns true if slug is valid, false otherwise\n */\nexport function isValidSlug(slug: string): boolean {\n if (!slug || slug.length < 1 || slug.length > 100) {\n return false;\n }\n\n // Must start and end with alphanumeric, can contain hyphens in between\n // No consecutive hyphens\n // Split into multiple checks to avoid unsafe regex with nested quantifiers\n\n // Check basic format: alphanumeric and hyphens only\n if (!/^[a-z0-9-]+$/.test(slug)) {\n return false;\n }\n\n // Check doesn't start or end with hyphen\n if (slug.startsWith('-') || slug.endsWith('-')) {\n return false;\n }\n\n // Check no consecutive hyphens\n if (slug.includes('--')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate hex color code\n *\n * Validates hex color codes in formats:\n * - #RGB (e.g., #f0f)\n * - #RRGGBB (e.g., #ff00ff)\n * - #RRGGBBAA (e.g., #ff00ff80)\n *\n * @param color - Hex color code to validate\n * @returns true if color is valid hex, false otherwise\n */\nexport function isValidHexColor(color: string): boolean {\n const hexRegex = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n return hexRegex.test(color);\n}\n\n/**\n * Validate base64 string\n *\n * Validates base64-encoded strings.\n * Supports both standard and URL-safe base64.\n *\n * @param str - String to validate\n * @returns true if string is valid base64, false otherwise\n */\nexport function isValidBase64(str: string): boolean {\n if (!str || str.length === 0) {\n return false;\n }\n\n // Standard or URL-safe base64\n const base64Regex = /^[A-Za-z0-9+/\\-_]+=*$/;\n\n if (!base64Regex.test(str)) {\n return false;\n }\n\n // Try to decode to verify\n try {\n return Buffer.from(str, 'base64').toString('base64') === str;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate JSON string\n *\n * Validates that a string contains valid JSON.\n * Does not parse the JSON, only validates syntax.\n *\n * @param str - String to validate\n * @returns true if string is valid JSON, false otherwise\n */\nexport function isValidJSON(str: string): boolean {\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Validate number is within range\n *\n * @param value - Number to validate\n * @param min - Minimum value (inclusive), or null for no minimum\n * @param max - Maximum value (inclusive), or null for no maximum\n * @returns true if number is within range, false otherwise\n */\nexport function isNumberInRange(value: number, min: number | null, max: number | null): boolean {\n if (typeof value !== 'number' || isNaN(value)) {\n return false;\n }\n\n if (min !== null && value < min) {\n return false;\n }\n\n if (max !== null && value > max) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate string length is within range\n *\n * @param value - String to validate\n * @param min - Minimum length (inclusive), or null for no minimum\n * @param max - Maximum length (inclusive), or null for no maximum\n * @returns true if string length is within range, false otherwise\n */\nexport function isStringLengthValid(value: string, min: number | null, max: number | null): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n const length = value.length;\n\n if (min !== null && length < min) {\n return false;\n }\n\n if (max !== null && length > max) {\n return false;\n }\n\n return true;\n}\n"]}
|
|
@@ -1491,5 +1491,5 @@ var RBACModule = class {
|
|
|
1491
1491
|
};
|
|
1492
1492
|
|
|
1493
1493
|
export { RBACClient, RBACModule, createRBACClientFromEnv, createRBACDirective, createRBACDirectiveForLayer, createRBACDirectiveFromEnv };
|
|
1494
|
-
//# sourceMappingURL=chunk-
|
|
1495
|
-
//# sourceMappingURL=chunk-
|
|
1494
|
+
//# sourceMappingURL=chunk-BNJFEOGH.js.map
|
|
1495
|
+
//# sourceMappingURL=chunk-BNJFEOGH.js.map
|