autotel-edge 3.16.8 → 3.16.9

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.
@@ -5,7 +5,7 @@ import { ParentBasedSampler, AlwaysOnSampler } from '@opentelemetry/sdk-trace-ba
5
5
  import { createContextKey, context } from '@opentelemetry/api';
6
6
 
7
7
  // src/core/exporter.ts
8
- var PACKAGE_VERSION = "3.16.8";
8
+ var PACKAGE_VERSION = "3.16.9";
9
9
  var defaultHeaders = {
10
10
  accept: "application/json",
11
11
  "content-type": "application/json",
@@ -306,5 +306,5 @@ function createInitialiser(config) {
306
306
  }
307
307
 
308
308
  export { OTLPExporter, createInitialiser, getActiveConfig, parseConfig, setConfig };
309
- //# sourceMappingURL=chunk-ILPGMTMU.js.map
310
- //# sourceMappingURL=chunk-ILPGMTMU.js.map
309
+ //# sourceMappingURL=chunk-K23QP4PD.js.map
310
+ //# sourceMappingURL=chunk-K23QP4PD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/exporter.ts","../src/types.ts","../src/core/spanprocessor.ts","../src/core/config.ts"],"names":["api_context"],"mappings":"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","file":"chunk-ILPGMTMU.js","sourcesContent":["/**\n * Lightweight OTLP exporter for edge environments\n * Ported and adapted from @microlabs/\n *\n * This exporter is much smaller than the standard @opentelemetry/exporter-trace-otlp-http\n * because it uses fetch() directly instead of Node.js http/https modules.\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport { OTLPExporterError } from '@opentelemetry/otlp-exporter-base';\nimport { JsonTraceSerializer } from '@opentelemetry/otlp-transformer';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { OTLPExporterConfig } from '../types';\n\n// Version is injected at build time via tsup define\n// This avoids runtime filesystem access which isn't available in edge environments\nconst PACKAGE_VERSION = process.env.AUTOTEL_EDGE_VERSION || '0.1.1';\n\nconst defaultHeaders: Record<string, string> = {\n accept: 'application/json',\n 'content-type': 'application/json',\n 'user-agent': `autotel-edge v${PACKAGE_VERSION}`,\n};\n\n/**\n * Minimal OTLP exporter using fetch()\n */\nexport class OTLPExporter implements SpanExporter {\n private headers: Record<string, string>;\n private url: string;\n\n constructor(config: OTLPExporterConfig) {\n this.url = config.url;\n this.headers = Object.assign({}, defaultHeaders, config.headers);\n }\n\n export(items: any[], resultCallback: (result: ExportResult) => void): void {\n this._export(items)\n .then(() => {\n resultCallback({ code: ExportResultCode.SUCCESS });\n })\n .catch((error) => {\n resultCallback({ code: ExportResultCode.FAILED, error });\n });\n }\n\n private _export(items: any[]): Promise<unknown> {\n return new Promise<void>((resolve, reject) => {\n try {\n this.send(items, resolve, reject);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n send(\n items: any[],\n onSuccess: () => void,\n onError: (error: OTLPExporterError) => void,\n ): void {\n const decoder = new TextDecoder();\n const exportMessage = JsonTraceSerializer.serializeRequest(items);\n\n const body = decoder.decode(exportMessage);\n const params: RequestInit = {\n method: 'POST',\n headers: this.headers,\n body,\n };\n\n fetch(this.url, params)\n .then((response) => {\n if (response.ok) {\n onSuccess();\n } else {\n onError(\n new OTLPExporterError(\n `Exporter received a statusCode: ${response.status}`,\n ),\n );\n }\n })\n .catch((error) => {\n onError(\n new OTLPExporterError(\n `Exception during export: ${error.toString()}`,\n error.code,\n error.stack,\n ),\n );\n });\n }\n\n async shutdown(): Promise<void> {\n // No-op for edge environments\n }\n}\n","/**\n * Shared types for autotel-edge\n */\n\nimport type {\n Attributes,\n Context,\n Span,\n SpanOptions,\n TextMapPropagator,\n} from '@opentelemetry/api';\nimport type {\n ReadableSpan,\n Sampler,\n SpanExporter,\n SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\n\n// Re-export commonly used types\n\n\n/**\n * Extended SpanOptions with per-span sampler support\n */\nexport interface ExtendedSpanOptions extends SpanOptions {\n sampler?: Sampler;\n}\n\n/**\n * Trigger types for edge handlers\n * Can be a Request or any vendor-specific trigger type\n */\nexport type Trigger =\n | Request\n | DOConstructorTrigger\n | WorkflowTrigger\n | 'do-alarm'\n | unknown;\n\nexport interface DOConstructorTrigger {\n id: string;\n name?: string;\n}\n\nexport interface WorkflowTrigger {\n type: 'workflow';\n name: string;\n}\n\n/**\n * Config types\n */\nexport interface OTLPExporterConfig {\n url: string;\n headers?: Record<string, string>;\n}\n\nexport type ExporterConfig = OTLPExporterConfig | SpanExporter;\n\nexport interface ServiceConfig {\n name: string;\n namespace?: string;\n version?: string;\n}\n\nexport interface ParentRatioSamplingConfig {\n acceptRemote?: boolean;\n ratio: number;\n}\n\ntype HeadSamplerConf = Sampler | ParentRatioSamplingConfig;\n\nexport interface SamplingConfig<HS extends HeadSamplerConf = HeadSamplerConf> {\n headSampler?: HS;\n tailSampler?: TailSampleFn;\n}\n\nexport interface InstrumentationOptions {\n instrumentGlobalFetch?: boolean;\n instrumentGlobalCache?: boolean;\n /**\n * Disable instrumentation entirely (useful for local development)\n * When enabled, the handler is returned as-is without any instrumentation\n * @default false\n */\n disabled?: boolean;\n}\n\n/**\n * Utility types\n */\nexport type OrPromise<T> = T | Promise<T>;\n\n/**\n * Adapter event types\n */\nexport type FunnelStepStatus =\n | 'started'\n | 'completed'\n | 'abandoned'\n | 'failed'\n | (string & {});\n\nexport type OutcomeStatus =\n | 'success'\n | 'failure'\n | 'partial'\n | (string & {});\n\nexport interface EdgeEventBase {\n [key: string]: unknown;\n service: string;\n timestamp: number;\n attributes: Record<string, unknown>;\n traceId?: string;\n spanId?: string;\n correlationId?: string;\n name: string; // Normalized event name for easy access\n}\n\nexport interface EdgeTrackEvent extends EdgeEventBase {\n type: 'event';\n event: string;\n}\n\nexport interface EdgeFunnelStepEvent extends EdgeEventBase {\n type: 'funnel-step';\n funnel: string;\n status: FunnelStepStatus;\n}\n\nexport interface EdgeOutcomeEvent extends EdgeEventBase {\n type: 'outcome';\n operation: string;\n outcome: OutcomeStatus;\n}\n\nexport interface EdgeValueEvent extends EdgeEventBase {\n type: 'value';\n metric: string;\n value: number;\n}\n\nexport type EdgeEvent =\n | EdgeTrackEvent\n | EdgeFunnelStepEvent\n | EdgeOutcomeEvent\n | EdgeValueEvent;\n\nexport type EdgeSubscriber = (event: EdgeEvent) => OrPromise<void>;\n\nexport interface FetcherConfig {\n includeTraceContext?: boolean | ((request: Request) => boolean);\n}\n\nexport interface RouteServiceConfig {\n service: string;\n}\n\nexport interface PostProcessParams {\n /**\n * The request object that was passed to the fetch handler.\n */\n request: Request;\n /**\n * The generated response object.\n */\n response: Response;\n /**\n * A readable version of the span object that can be used to access the span's attributes and events.\n */\n readable: ReadableSpan;\n}\n\nexport interface FetchHandlerConfig {\n /**\n * Whether to enable context propagation for incoming requests to `fetch`.\n * This enables or disables distributed tracing from W3C Trace Context headers.\n * @default true\n */\n acceptTraceContext?: boolean | ((request: Request) => boolean);\n /**\n * Allows further customization of the generated span, based on the request/response data.\n */\n postProcess?: (span: Span, ctx: PostProcessParams) => void;\n /**\n * Route patterns to include for fetch handler instrumentation.\n * Supports glob patterns like '/api/**'.\n * If not set, all routes are included.\n */\n include?: string[];\n /**\n * Route patterns to exclude from fetch handler instrumentation.\n * Supports glob patterns like '/health' and '/_internal/**'.\n * Exclusions take precedence over inclusions.\n */\n exclude?: string[];\n /**\n * Route-specific service mapping.\n * The first matching pattern wins based on object iteration order.\n */\n routes?: Record<string, RouteServiceConfig>;\n}\n\nexport interface HandlerConfig {\n fetch?: FetchHandlerConfig;\n}\n\nexport interface DataSafetyConfig {\n /** Redact query parameters from URL attributes (default: false) */\n redactQueryParams?: boolean;\n /** Control D1 SQL statement capture: 'full' (default), 'obfuscated', or 'off' */\n captureDbStatement?: 'off' | 'obfuscated' | 'full';\n /** Only capture these email headers (lowercase). When set, other headers are excluded. */\n emailHeaderAllowlist?: string[];\n}\n\ninterface EdgeConfigBase {\n service: ServiceConfig;\n handlers?: HandlerConfig;\n fetch?: FetcherConfig;\n postProcessor?: PostProcessorFn;\n sampling?: SamplingConfig;\n propagator?: TextMapPropagator;\n instrumentation?: InstrumentationOptions;\n subscribers?: EdgeSubscriber[];\n /** Opt-in data safety controls for sensitive attribute capture */\n dataSafety?: DataSafetyConfig;\n}\n\ninterface EdgeConfigExporter extends EdgeConfigBase {\n exporter: ExporterConfig;\n}\n\ninterface EdgeConfigSpanProcessors extends EdgeConfigBase {\n spanProcessors: SpanProcessor | SpanProcessor[];\n}\n\nexport type EdgeConfig = EdgeConfigExporter | EdgeConfigSpanProcessors;\n\nexport function isSpanProcessorConfig(\n config: EdgeConfig,\n): config is EdgeConfigSpanProcessors {\n return !!(config as EdgeConfigSpanProcessors).spanProcessors;\n}\n\nexport interface ResolvedEdgeConfig extends EdgeConfigBase {\n handlers: Required<HandlerConfig>;\n fetch: Required<FetcherConfig>;\n postProcessor: PostProcessorFn;\n sampling: Required<SamplingConfig<Sampler>>;\n spanProcessors: SpanProcessor[];\n propagator: TextMapPropagator;\n instrumentation: InstrumentationOptions;\n subscribers: EdgeSubscriber[];\n}\n\n/**\n * Function types\n */\nexport type ResolveConfigFn<Env = any> = (\n env: Env,\n trigger: Trigger,\n) => EdgeConfig;\nexport type ConfigurationOption = EdgeConfig | ResolveConfigFn;\n\nexport type PostProcessorFn = (spans: ReadableSpan[]) => ReadableSpan[];\nexport type TailSampleFn = (traceInfo: LocalTrace) => boolean;\n\nexport interface LocalTrace {\n traceId: string;\n spans: ReadableSpan[];\n localRootSpan: ReadableSpan;\n}\n\n/**\n * Span processor with flush support\n */\nexport type TraceFlushableSpanProcessor = SpanProcessor & {\n forceFlush: (traceId?: string) => Promise<void>;\n};\n\n/**\n * Handler instrumentation\n */\nexport interface InitialSpanInfo {\n name: string;\n options: SpanOptions;\n context?: Context;\n}\n\nexport interface HandlerInstrumentation<T extends Trigger, R extends any> {\n getInitialSpanInfo: (trigger: T) => InitialSpanInfo;\n getAttributesFromResult?: (result: Awaited<R>) => Attributes;\n instrumentTrigger?: (trigger: T) => T;\n executionSucces?: (span: Span, trigger: T, result: Awaited<R>) => void;\n executionFailed?: (span: Span, trigger: T, error?: any) => void;\n}\n\n/**\n * Utility types\n */\n\nexport {type Attributes, type Context, type Span, type SpanOptions} from '@opentelemetry/api';\nexport {type ReadableSpan} from '@opentelemetry/sdk-trace-base';\n","/**\n * Span processor with flush and tail sampling support\n */\n\nimport type { Context } from '@opentelemetry/api';\nimport type {\n ReadableSpan,\n Span,\n SpanExporter,\n SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport type { PostProcessorFn, TailSampleFn, LocalTrace } from '../types';\n\n/**\n * Span processor that supports flush by trace ID and tail sampling\n */\nexport class SpanProcessorWithFlush implements SpanProcessor {\n private exporter: SpanExporter;\n private postProcessor?: PostProcessorFn;\n private spans: Map<string, ReadableSpan[]> = new Map();\n\n constructor(exporter: SpanExporter, postProcessor?: PostProcessorFn) {\n this.exporter = exporter;\n this.postProcessor = postProcessor;\n }\n\n onStart(_span: Span, _parentContext: Context): void {\n // No-op for now\n }\n\n onEnd(span: ReadableSpan): void {\n const traceId = span.spanContext().traceId;\n\n if (!this.spans.has(traceId)) {\n this.spans.set(traceId, []);\n }\n\n this.spans.get(traceId)!.push(span);\n }\n\n /**\n * Force flush spans for a specific trace\n */\n async forceFlush(traceId?: string): Promise<void> {\n if (traceId) {\n const spans = this.spans.get(traceId);\n if (spans && spans.length > 0) {\n await this.exportSpans(spans);\n this.spans.delete(traceId);\n }\n } else {\n // Flush all traces\n const promises: Promise<void>[] = [];\n for (const [id, spans] of this.spans.entries()) {\n promises.push(this.exportSpans(spans));\n this.spans.delete(id);\n }\n await Promise.all(promises);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.forceFlush();\n if (this.exporter) {\n await this.exporter.shutdown();\n }\n }\n\n /**\n * Export spans with post-processing\n * Errors are caught and logged but don't throw to prevent worker instability\n */\n private async exportSpans(spans: ReadableSpan[]): Promise<void> {\n if (spans.length === 0) return;\n if (!this.exporter) return; // No exporter configured (e.g., in tests)\n\n let processedSpans = spans;\n\n if (this.postProcessor) {\n try {\n processedSpans = this.postProcessor(spans);\n } catch (error) {\n // Post-processor errors should not prevent export\n console.error('[autotel-edge] Post-processor error:', error);\n // Continue with original spans\n processedSpans = spans;\n }\n }\n\n return new Promise((resolve) => {\n this.exporter.export(processedSpans, (result) => {\n if (result.code === 0) {\n // SUCCESS\n resolve();\n } else {\n // Log but don't reject - exporter failures shouldn't crash the worker\n console.error(\n '[autotel-edge] Exporter error:',\n result.error?.message || 'Unknown error',\n );\n resolve(); // Resolve instead of reject to prevent unhandled promise rejection\n }\n });\n });\n }\n}\n\n/**\n * Span processor that supports tail sampling decisions\n */\nexport class TailSamplingSpanProcessor implements SpanProcessor {\n private wrapped: SpanProcessorWithFlush;\n private tailSampler?: TailSampleFn;\n private traces: Map<string, LocalTrace> = new Map();\n\n constructor(\n exporter: SpanExporter,\n postProcessor?: PostProcessorFn,\n tailSampler?: TailSampleFn,\n ) {\n this.wrapped = new SpanProcessorWithFlush(exporter, postProcessor);\n this.tailSampler = tailSampler;\n }\n\n onStart(span: Span, parentContext: Context): void {\n this.wrapped.onStart(span, parentContext);\n }\n\n onEnd(span: ReadableSpan): void {\n const traceId = span.spanContext().traceId;\n const spanId = span.spanContext().spanId;\n const parentSpanId = 'parentSpanId' in span ? span.parentSpanId : undefined;\n\n // Initialize trace if not exists\n if (!this.traces.has(traceId)) {\n this.traces.set(traceId, {\n traceId,\n spans: [],\n localRootSpan: undefined as any, // Will be set when we identify the local root\n });\n }\n\n const trace = this.traces.get(traceId)!;\n\n // Determine if this span is a local root by checking if its parent is in buffered spans\n // A span is a local root if:\n // 1. It has no parentSpanId (definitive root)\n // 2. Its parentSpanId doesn't match any already-buffered span (remote parent = distributed trace entry)\n const hasLocalParent = parentSpanId &&\n trace.spans.some(s => s.spanContext().spanId === parentSpanId);\n\n // Set localRootSpan if this is the local root (no local parent found in buffer)\n if (!hasLocalParent) {\n trace.localRootSpan = span;\n }\n\n trace.spans.push(span); // Buffer the span AFTER checking parent relationships\n\n // Auto-flush decision: only auto-flush for normal traces (no parentSpanId at all)\n // For distributed traces (parentSpanId present), we rely on explicit forceFlush() from instrument.ts\n // This ensures we don't trigger before all spans have been buffered\n const isDefinitiveRoot = !parentSpanId;\n const shouldAutoFlush = isDefinitiveRoot && trace.localRootSpan &&\n trace.localRootSpan.spanContext().spanId === spanId;\n\n if (shouldAutoFlush) {\n if (this.tailSampler) {\n const shouldKeep = this.tailSampler(trace);\n\n if (shouldKeep) {\n // Export ALL buffered spans in the trace\n for (const bufferedSpan of trace.spans) {\n this.wrapped.onEnd(bufferedSpan);\n }\n // Force flush to actually export the spans\n void this.wrapped.forceFlush(traceId);\n }\n // If not keeping, just drop all spans (don't export)\n } else {\n // No tail sampler, export all buffered spans\n for (const bufferedSpan of trace.spans) {\n this.wrapped.onEnd(bufferedSpan);\n }\n // Force flush to actually export the spans\n void this.wrapped.forceFlush(traceId);\n }\n\n // Clean up trace after decision\n this.traces.delete(traceId);\n }\n // If not local root span, just buffer it - don't export yet\n }\n\n async forceFlush(traceId?: string): Promise<void> {\n if (traceId) {\n // Make tail sampling decision for this specific trace before flushing\n const trace = this.traces.get(traceId);\n if (trace) {\n // Ensure localRootSpan is set (fallback to first span if not)\n // This handles distributed traces where no span has undefined parentSpanId\n if (!trace.localRootSpan && trace.spans.length > 0) {\n trace.localRootSpan = trace.spans[0];\n }\n\n if (this.tailSampler) {\n const shouldKeep = this.tailSampler(trace);\n\n if (shouldKeep) {\n // Export ALL buffered spans in the trace\n for (const bufferedSpan of trace.spans) {\n this.wrapped.onEnd(bufferedSpan);\n }\n }\n } else {\n // No tail sampler, export all buffered spans\n for (const bufferedSpan of trace.spans) {\n this.wrapped.onEnd(bufferedSpan);\n }\n }\n\n // Clean up trace after decision\n this.traces.delete(traceId);\n }\n }\n return this.wrapped.forceFlush(traceId);\n }\n\n async shutdown(): Promise<void> {\n this.traces.clear();\n return this.wrapped.shutdown();\n }\n}\n","/**\n * Configuration system for autotel-edge\n */\n\nimport { W3CTraceContextPropagator } from '@opentelemetry/core';\nimport { ParentBasedSampler, AlwaysOnSampler } from '@opentelemetry/sdk-trace-base';\nimport { context as api_context, createContextKey, type Context } from '@opentelemetry/api';\nimport type {\n EdgeConfig,\n ResolvedEdgeConfig,\n ConfigurationOption,\n Trigger,\n ParentRatioSamplingConfig,\n} from '../types';\nimport { isSpanProcessorConfig } from '../types';\nimport { OTLPExporter } from './exporter';\nimport { TailSamplingSpanProcessor } from './spanprocessor';\n\n/**\n * Type for config initialization function\n */\nexport type Initialiser = (env: any, trigger: Trigger) => ResolvedEdgeConfig;\n\n/**\n * Context key for storing config (isolates config per-request)\n */\nconst CONFIG_KEY = createContextKey('autotel-edge-config');\n\n/**\n * Get the currently active config from context\n *\n * This reads the config from the active context, ensuring each request\n * has its own isolated config even when multiple requests are in-flight.\n */\nexport function getActiveConfig(): ResolvedEdgeConfig | null {\n const value = api_context.active().getValue(CONFIG_KEY) as\n | ResolvedEdgeConfig\n | null\n | undefined;\n return value ?? null;\n}\n\n/**\n * Set the active config in context\n *\n * Returns a new context with the config stored. This context should be\n * used with api_context.with() to ensure the config is isolated per-request.\n *\n * @example\n * ```typescript\n * const config = parseConfig({ service: { name: 'my-service' } });\n * const context = setConfig(config);\n *\n * api_context.with(context, () => {\n * // Config is available here via getActiveConfig()\n * });\n * ```\n */\nexport function setConfig(config: ResolvedEdgeConfig): Context {\n return api_context.active().setValue(CONFIG_KEY, config);\n}\n\n/**\n * Parse and validate configuration\n */\nexport function parseConfig(config: EdgeConfig): ResolvedEdgeConfig {\n // Parse head sampler\n const headSampler =\n config.sampling?.headSampler ??\n new ParentBasedSampler({\n root: new AlwaysOnSampler(),\n });\n\n const parsedHeadSampler =\n typeof headSampler === 'object' && 'ratio' in headSampler\n ? createParentRatioSampler(headSampler)\n : headSampler;\n\n // Parse tail sampler (default: keep sampled or error traces)\n const tailSampler =\n config.sampling?.tailSampler ??\n ((traceInfo) => {\n const localRootSpan = traceInfo.localRootSpan;\n const ctx = localRootSpan.spanContext();\n // Keep if sampled or if root span has error\n return (ctx.traceFlags & 1) === 1 || localRootSpan.status.code === 2; // SAMPLED flag | ERROR status\n });\n\n // Parse exporter - use TailSamplingSpanProcessor when tail sampler is present\n const spanProcessors = isSpanProcessorConfig(config)\n ? Array.isArray(config.spanProcessors)\n ? config.spanProcessors\n : [config.spanProcessors]\n : [\n // Use TailSamplingSpanProcessor to enable tail sampling\n new TailSamplingSpanProcessor(\n typeof config.exporter === 'object' && 'url' in config.exporter\n ? new OTLPExporter(config.exporter)\n : config.exporter,\n config.postProcessor,\n tailSampler, // Wire up the tail sampler!\n ),\n ];\n\n // Build resolved config\n const resolved: ResolvedEdgeConfig = {\n service: config.service,\n handlers: {\n fetch: config.handlers?.fetch ?? {},\n },\n fetch: {\n includeTraceContext: config.fetch?.includeTraceContext ?? true,\n },\n postProcessor: config.postProcessor ?? ((spans) => spans),\n sampling: {\n headSampler: parsedHeadSampler,\n tailSampler,\n },\n spanProcessors,\n propagator: config.propagator ?? new W3CTraceContextPropagator(),\n instrumentation: {\n instrumentGlobalFetch: config.instrumentation?.instrumentGlobalFetch ?? true,\n instrumentGlobalCache: config.instrumentation?.instrumentGlobalCache ?? false,\n disabled: config.instrumentation?.disabled ?? false,\n },\n subscribers: config.subscribers ?? [],\n dataSafety: config.dataSafety,\n };\n\n return resolved;\n}\n\n/**\n * Create a parent-based ratio sampler\n */\nfunction createParentRatioSampler(config: ParentRatioSamplingConfig) {\n const { ratio, acceptRemote = true } = config;\n\n // Simple ratio sampler\n const ratioSampler = {\n shouldSample: () => ({\n decision: Math.random() < ratio ? 1 : 0, // RECORD_AND_SAMPLED : NOT_RECORD\n attributes: {},\n }),\n toString: () => `ParentRatioSampler{ratio=${ratio}}`,\n };\n\n if (acceptRemote) {\n return new ParentBasedSampler({ root: ratioSampler as any });\n }\n\n return ratioSampler;\n}\n\n/**\n * Create a config initializer function\n */\nexport function createInitialiser(config: ConfigurationOption): Initialiser {\n if (typeof config === 'function') {\n return (env, trigger) => {\n const conf = parseConfig(config(env, trigger));\n return conf;\n };\n } else {\n const parsed = parseConfig(config);\n return () => parsed;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/exporter.ts","../src/types.ts","../src/core/spanprocessor.ts","../src/core/config.ts"],"names":["api_context"],"mappings":"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","file":"chunk-K23QP4PD.js","sourcesContent":["/**\n * Lightweight OTLP exporter for edge environments\n * Ported and adapted from @microlabs/\n *\n * This exporter is much smaller than the standard @opentelemetry/exporter-trace-otlp-http\n * because it uses fetch() directly instead of Node.js http/https modules.\n */\n\nimport type { ExportResult } from '@opentelemetry/core';\nimport { ExportResultCode } from '@opentelemetry/core';\nimport { OTLPExporterError } from '@opentelemetry/otlp-exporter-base';\nimport { JsonTraceSerializer } from '@opentelemetry/otlp-transformer';\nimport type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { OTLPExporterConfig } from '../types';\n\n// Version is injected at build time via tsup define\n// This avoids runtime filesystem access which isn't available in edge environments\nconst PACKAGE_VERSION = process.env.AUTOTEL_EDGE_VERSION || '0.1.1';\n\nconst defaultHeaders: Record<string, string> = {\n accept: 'application/json',\n 'content-type': 'application/json',\n 'user-agent': `autotel-edge v${PACKAGE_VERSION}`,\n};\n\n/**\n * Minimal OTLP exporter using fetch()\n */\nexport class OTLPExporter implements SpanExporter {\n private headers: Record<string, string>;\n private url: string;\n\n constructor(config: OTLPExporterConfig) {\n this.url = config.url;\n this.headers = Object.assign({}, defaultHeaders, config.headers);\n }\n\n export(items: any[], resultCallback: (result: ExportResult) => void): void {\n this._export(items)\n .then(() => {\n resultCallback({ code: ExportResultCode.SUCCESS });\n })\n .catch((error) => {\n resultCallback({ code: ExportResultCode.FAILED, error });\n });\n }\n\n private _export(items: any[]): Promise<unknown> {\n return new Promise<void>((resolve, reject) => {\n try {\n this.send(items, resolve, reject);\n } catch (error) {\n reject(error);\n }\n });\n }\n\n send(\n items: any[],\n onSuccess: () => void,\n onError: (error: OTLPExporterError) => void,\n ): void {\n const decoder = new TextDecoder();\n const exportMessage = JsonTraceSerializer.serializeRequest(items);\n\n const body = decoder.decode(exportMessage);\n const params: RequestInit = {\n method: 'POST',\n headers: this.headers,\n body,\n };\n\n fetch(this.url, params)\n .then((response) => {\n if (response.ok) {\n onSuccess();\n } else {\n onError(\n new OTLPExporterError(\n `Exporter received a statusCode: ${response.status}`,\n ),\n );\n }\n })\n .catch((error) => {\n onError(\n new OTLPExporterError(\n `Exception during export: ${error.toString()}`,\n error.code,\n error.stack,\n ),\n );\n });\n }\n\n async shutdown(): Promise<void> {\n // No-op for edge environments\n }\n}\n","/**\n * Shared types for autotel-edge\n */\n\nimport type {\n Attributes,\n Context,\n Span,\n SpanOptions,\n TextMapPropagator,\n} from '@opentelemetry/api';\nimport type {\n ReadableSpan,\n Sampler,\n SpanExporter,\n SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\n\n// Re-export commonly used types\n\n\n/**\n * Extended SpanOptions with per-span sampler support\n */\nexport interface ExtendedSpanOptions extends SpanOptions {\n sampler?: Sampler;\n}\n\n/**\n * Trigger types for edge handlers\n * Can be a Request or any vendor-specific trigger type\n */\nexport type Trigger =\n | Request\n | DOConstructorTrigger\n | WorkflowTrigger\n | 'do-alarm'\n | unknown;\n\nexport interface DOConstructorTrigger {\n id: string;\n name?: string;\n}\n\nexport interface WorkflowTrigger {\n type: 'workflow';\n name: string;\n}\n\n/**\n * Config types\n */\nexport interface OTLPExporterConfig {\n url: string;\n headers?: Record<string, string>;\n}\n\nexport type ExporterConfig = OTLPExporterConfig | SpanExporter;\n\nexport interface ServiceConfig {\n name: string;\n namespace?: string;\n version?: string;\n}\n\nexport interface ParentRatioSamplingConfig {\n acceptRemote?: boolean;\n ratio: number;\n}\n\ntype HeadSamplerConf = Sampler | ParentRatioSamplingConfig;\n\nexport interface SamplingConfig<HS extends HeadSamplerConf = HeadSamplerConf> {\n headSampler?: HS;\n tailSampler?: TailSampleFn;\n}\n\nexport interface InstrumentationOptions {\n instrumentGlobalFetch?: boolean;\n instrumentGlobalCache?: boolean;\n /**\n * Disable instrumentation entirely (useful for local development)\n * When enabled, the handler is returned as-is without any instrumentation\n * @default false\n */\n disabled?: boolean;\n}\n\n/**\n * Utility types\n */\nexport type OrPromise<T> = T | Promise<T>;\n\n/**\n * Adapter event types\n */\nexport type FunnelStepStatus =\n | 'started'\n | 'completed'\n | 'abandoned'\n | 'failed'\n | (string & {});\n\nexport type OutcomeStatus =\n | 'success'\n | 'failure'\n | 'partial'\n | (string & {});\n\nexport interface EdgeEventBase {\n [key: string]: unknown;\n service: string;\n timestamp: number;\n attributes: Record<string, unknown>;\n traceId?: string;\n spanId?: string;\n correlationId?: string;\n name: string; // Normalized event name for easy access\n}\n\nexport interface EdgeTrackEvent extends EdgeEventBase {\n type: 'event';\n event: string;\n}\n\nexport interface EdgeFunnelStepEvent extends EdgeEventBase {\n type: 'funnel-step';\n funnel: string;\n status: FunnelStepStatus;\n}\n\nexport interface EdgeOutcomeEvent extends EdgeEventBase {\n type: 'outcome';\n operation: string;\n outcome: OutcomeStatus;\n}\n\nexport interface EdgeValueEvent extends EdgeEventBase {\n type: 'value';\n metric: string;\n value: number;\n}\n\nexport type EdgeEvent =\n | EdgeTrackEvent\n | EdgeFunnelStepEvent\n | EdgeOutcomeEvent\n | EdgeValueEvent;\n\nexport type EdgeSubscriber = (event: EdgeEvent) => OrPromise<void>;\n\nexport interface FetcherConfig {\n includeTraceContext?: boolean | ((request: Request) => boolean);\n}\n\nexport interface RouteServiceConfig {\n service: string;\n}\n\nexport interface PostProcessParams {\n /**\n * The request object that was passed to the fetch handler.\n */\n request: Request;\n /**\n * The generated response object.\n */\n response: Response;\n /**\n * A readable version of the span object that can be used to access the span's attributes and events.\n */\n readable: ReadableSpan;\n}\n\nexport interface FetchHandlerConfig {\n /**\n * Whether to enable context propagation for incoming requests to `fetch`.\n * This enables or disables distributed tracing from W3C Trace Context headers.\n * @default true\n */\n acceptTraceContext?: boolean | ((request: Request) => boolean);\n /**\n * Allows further customization of the generated span, based on the request/response data.\n */\n postProcess?: (span: Span, ctx: PostProcessParams) => void;\n /**\n * Route patterns to include for fetch handler instrumentation.\n * Supports glob patterns like '/api/**'.\n * If not set, all routes are included.\n */\n include?: string[];\n /**\n * Route patterns to exclude from fetch handler instrumentation.\n * Supports glob patterns like '/health' and '/_internal/**'.\n * Exclusions take precedence over inclusions.\n */\n exclude?: string[];\n /**\n * Route-specific service mapping.\n * The first matching pattern wins based on object iteration order.\n */\n routes?: Record<string, RouteServiceConfig>;\n}\n\nexport interface HandlerConfig {\n fetch?: FetchHandlerConfig;\n}\n\nexport interface DataSafetyConfig {\n /** Redact query parameters from URL attributes (default: false) */\n redactQueryParams?: boolean;\n /** Control D1 SQL statement capture: 'full' (default), 'obfuscated', or 'off' */\n captureDbStatement?: 'off' | 'obfuscated' | 'full';\n /** Only capture these email headers (lowercase). When set, other headers are excluded. */\n emailHeaderAllowlist?: string[];\n}\n\ninterface EdgeConfigBase {\n service: ServiceConfig;\n handlers?: HandlerConfig;\n fetch?: FetcherConfig;\n postProcessor?: PostProcessorFn;\n sampling?: SamplingConfig;\n propagator?: TextMapPropagator;\n instrumentation?: InstrumentationOptions;\n subscribers?: EdgeSubscriber[];\n /** Opt-in data safety controls for sensitive attribute capture */\n dataSafety?: DataSafetyConfig;\n}\n\ninterface EdgeConfigExporter extends EdgeConfigBase {\n exporter: ExporterConfig;\n}\n\ninterface EdgeConfigSpanProcessors extends EdgeConfigBase {\n spanProcessors: SpanProcessor | SpanProcessor[];\n}\n\nexport type EdgeConfig = EdgeConfigExporter | EdgeConfigSpanProcessors;\n\nexport function isSpanProcessorConfig(\n config: EdgeConfig,\n): config is EdgeConfigSpanProcessors {\n return !!(config as EdgeConfigSpanProcessors).spanProcessors;\n}\n\nexport interface ResolvedEdgeConfig extends EdgeConfigBase {\n handlers: Required<HandlerConfig>;\n fetch: Required<FetcherConfig>;\n postProcessor: PostProcessorFn;\n sampling: Required<SamplingConfig<Sampler>>;\n spanProcessors: SpanProcessor[];\n propagator: TextMapPropagator;\n instrumentation: InstrumentationOptions;\n subscribers: EdgeSubscriber[];\n}\n\n/**\n * Function types\n */\nexport type ResolveConfigFn<Env = any> = (\n env: Env,\n trigger: Trigger,\n) => EdgeConfig;\nexport type ConfigurationOption = EdgeConfig | ResolveConfigFn;\n\nexport type PostProcessorFn = (spans: ReadableSpan[]) => ReadableSpan[];\nexport type TailSampleFn = (traceInfo: LocalTrace) => boolean;\n\nexport interface LocalTrace {\n traceId: string;\n spans: ReadableSpan[];\n localRootSpan: ReadableSpan;\n}\n\n/**\n * Span processor with flush support\n */\nexport type TraceFlushableSpanProcessor = SpanProcessor & {\n forceFlush: (traceId?: string) => Promise<void>;\n};\n\n/**\n * Handler instrumentation\n */\nexport interface InitialSpanInfo {\n name: string;\n options: SpanOptions;\n context?: Context;\n}\n\nexport interface HandlerInstrumentation<T extends Trigger, R extends any> {\n getInitialSpanInfo: (trigger: T) => InitialSpanInfo;\n getAttributesFromResult?: (result: Awaited<R>) => Attributes;\n instrumentTrigger?: (trigger: T) => T;\n executionSucces?: (span: Span, trigger: T, result: Awaited<R>) => void;\n executionFailed?: (span: Span, trigger: T, error?: any) => void;\n}\n\n/**\n * Utility types\n */\n\nexport {type Attributes, type Context, type Span, type SpanOptions} from '@opentelemetry/api';\nexport {type ReadableSpan} from '@opentelemetry/sdk-trace-base';\n","/**\n * Span processor with flush and tail sampling support\n */\n\nimport type { Context } from '@opentelemetry/api';\nimport type {\n ReadableSpan,\n Span,\n SpanExporter,\n SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport type { PostProcessorFn, TailSampleFn, LocalTrace } from '../types';\n\n/**\n * Span processor that supports flush by trace ID and tail sampling\n */\nexport class SpanProcessorWithFlush implements SpanProcessor {\n private exporter: SpanExporter;\n private postProcessor?: PostProcessorFn;\n private spans: Map<string, ReadableSpan[]> = new Map();\n\n constructor(exporter: SpanExporter, postProcessor?: PostProcessorFn) {\n this.exporter = exporter;\n this.postProcessor = postProcessor;\n }\n\n onStart(_span: Span, _parentContext: Context): void {\n // No-op for now\n }\n\n onEnd(span: ReadableSpan): void {\n const traceId = span.spanContext().traceId;\n\n if (!this.spans.has(traceId)) {\n this.spans.set(traceId, []);\n }\n\n this.spans.get(traceId)!.push(span);\n }\n\n /**\n * Force flush spans for a specific trace\n */\n async forceFlush(traceId?: string): Promise<void> {\n if (traceId) {\n const spans = this.spans.get(traceId);\n if (spans && spans.length > 0) {\n await this.exportSpans(spans);\n this.spans.delete(traceId);\n }\n } else {\n // Flush all traces\n const promises: Promise<void>[] = [];\n for (const [id, spans] of this.spans.entries()) {\n promises.push(this.exportSpans(spans));\n this.spans.delete(id);\n }\n await Promise.all(promises);\n }\n }\n\n async shutdown(): Promise<void> {\n await this.forceFlush();\n if (this.exporter) {\n await this.exporter.shutdown();\n }\n }\n\n /**\n * Export spans with post-processing\n * Errors are caught and logged but don't throw to prevent worker instability\n */\n private async exportSpans(spans: ReadableSpan[]): Promise<void> {\n if (spans.length === 0) return;\n if (!this.exporter) return; // No exporter configured (e.g., in tests)\n\n let processedSpans = spans;\n\n if (this.postProcessor) {\n try {\n processedSpans = this.postProcessor(spans);\n } catch (error) {\n // Post-processor errors should not prevent export\n console.error('[autotel-edge] Post-processor error:', error);\n // Continue with original spans\n processedSpans = spans;\n }\n }\n\n return new Promise((resolve) => {\n this.exporter.export(processedSpans, (result) => {\n if (result.code === 0) {\n // SUCCESS\n resolve();\n } else {\n // Log but don't reject - exporter failures shouldn't crash the worker\n console.error(\n '[autotel-edge] Exporter error:',\n result.error?.message || 'Unknown error',\n );\n resolve(); // Resolve instead of reject to prevent unhandled promise rejection\n }\n });\n });\n }\n}\n\n/**\n * Span processor that supports tail sampling decisions\n */\nexport class TailSamplingSpanProcessor implements SpanProcessor {\n private wrapped: SpanProcessorWithFlush;\n private tailSampler?: TailSampleFn;\n private traces: Map<string, LocalTrace> = new Map();\n\n constructor(\n exporter: SpanExporter,\n postProcessor?: PostProcessorFn,\n tailSampler?: TailSampleFn,\n ) {\n this.wrapped = new SpanProcessorWithFlush(exporter, postProcessor);\n this.tailSampler = tailSampler;\n }\n\n onStart(span: Span, parentContext: Context): void {\n this.wrapped.onStart(span, parentContext);\n }\n\n onEnd(span: ReadableSpan): void {\n const traceId = span.spanContext().traceId;\n const spanId = span.spanContext().spanId;\n const parentSpanId = 'parentSpanId' in span ? span.parentSpanId : undefined;\n\n // Initialize trace if not exists\n if (!this.traces.has(traceId)) {\n this.traces.set(traceId, {\n traceId,\n spans: [],\n localRootSpan: undefined as any, // Will be set when we identify the local root\n });\n }\n\n const trace = this.traces.get(traceId)!;\n\n // Determine if this span is a local root by checking if its parent is in buffered spans\n // A span is a local root if:\n // 1. It has no parentSpanId (definitive root)\n // 2. Its parentSpanId doesn't match any already-buffered span (remote parent = distributed trace entry)\n const hasLocalParent = parentSpanId &&\n trace.spans.some(s => s.spanContext().spanId === parentSpanId);\n\n // Set localRootSpan if this is the local root (no local parent found in buffer)\n if (!hasLocalParent) {\n trace.localRootSpan = span;\n }\n\n trace.spans.push(span); // Buffer the span AFTER checking parent relationships\n\n // Auto-flush decision: only auto-flush for normal traces (no parentSpanId at all)\n // For distributed traces (parentSpanId present), we rely on explicit forceFlush() from instrument.ts\n // This ensures we don't trigger before all spans have been buffered\n const isDefinitiveRoot = !parentSpanId;\n const shouldAutoFlush = isDefinitiveRoot && trace.localRootSpan &&\n trace.localRootSpan.spanContext().spanId === spanId;\n\n if (shouldAutoFlush) {\n if (this.tailSampler) {\n const shouldKeep = this.tailSampler(trace);\n\n if (shouldKeep) {\n // Export ALL buffered spans in the trace\n for (const bufferedSpan of trace.spans) {\n this.wrapped.onEnd(bufferedSpan);\n }\n // Force flush to actually export the spans\n void this.wrapped.forceFlush(traceId);\n }\n // If not keeping, just drop all spans (don't export)\n } else {\n // No tail sampler, export all buffered spans\n for (const bufferedSpan of trace.spans) {\n this.wrapped.onEnd(bufferedSpan);\n }\n // Force flush to actually export the spans\n void this.wrapped.forceFlush(traceId);\n }\n\n // Clean up trace after decision\n this.traces.delete(traceId);\n }\n // If not local root span, just buffer it - don't export yet\n }\n\n async forceFlush(traceId?: string): Promise<void> {\n if (traceId) {\n // Make tail sampling decision for this specific trace before flushing\n const trace = this.traces.get(traceId);\n if (trace) {\n // Ensure localRootSpan is set (fallback to first span if not)\n // This handles distributed traces where no span has undefined parentSpanId\n if (!trace.localRootSpan && trace.spans.length > 0) {\n trace.localRootSpan = trace.spans[0];\n }\n\n if (this.tailSampler) {\n const shouldKeep = this.tailSampler(trace);\n\n if (shouldKeep) {\n // Export ALL buffered spans in the trace\n for (const bufferedSpan of trace.spans) {\n this.wrapped.onEnd(bufferedSpan);\n }\n }\n } else {\n // No tail sampler, export all buffered spans\n for (const bufferedSpan of trace.spans) {\n this.wrapped.onEnd(bufferedSpan);\n }\n }\n\n // Clean up trace after decision\n this.traces.delete(traceId);\n }\n }\n return this.wrapped.forceFlush(traceId);\n }\n\n async shutdown(): Promise<void> {\n this.traces.clear();\n return this.wrapped.shutdown();\n }\n}\n","/**\n * Configuration system for autotel-edge\n */\n\nimport { W3CTraceContextPropagator } from '@opentelemetry/core';\nimport { ParentBasedSampler, AlwaysOnSampler } from '@opentelemetry/sdk-trace-base';\nimport { context as api_context, createContextKey, type Context } from '@opentelemetry/api';\nimport type {\n EdgeConfig,\n ResolvedEdgeConfig,\n ConfigurationOption,\n Trigger,\n ParentRatioSamplingConfig,\n} from '../types';\nimport { isSpanProcessorConfig } from '../types';\nimport { OTLPExporter } from './exporter';\nimport { TailSamplingSpanProcessor } from './spanprocessor';\n\n/**\n * Type for config initialization function\n */\nexport type Initialiser = (env: any, trigger: Trigger) => ResolvedEdgeConfig;\n\n/**\n * Context key for storing config (isolates config per-request)\n */\nconst CONFIG_KEY = createContextKey('autotel-edge-config');\n\n/**\n * Get the currently active config from context\n *\n * This reads the config from the active context, ensuring each request\n * has its own isolated config even when multiple requests are in-flight.\n */\nexport function getActiveConfig(): ResolvedEdgeConfig | null {\n const value = api_context.active().getValue(CONFIG_KEY) as\n | ResolvedEdgeConfig\n | null\n | undefined;\n return value ?? null;\n}\n\n/**\n * Set the active config in context\n *\n * Returns a new context with the config stored. This context should be\n * used with api_context.with() to ensure the config is isolated per-request.\n *\n * @example\n * ```typescript\n * const config = parseConfig({ service: { name: 'my-service' } });\n * const context = setConfig(config);\n *\n * api_context.with(context, () => {\n * // Config is available here via getActiveConfig()\n * });\n * ```\n */\nexport function setConfig(config: ResolvedEdgeConfig): Context {\n return api_context.active().setValue(CONFIG_KEY, config);\n}\n\n/**\n * Parse and validate configuration\n */\nexport function parseConfig(config: EdgeConfig): ResolvedEdgeConfig {\n // Parse head sampler\n const headSampler =\n config.sampling?.headSampler ??\n new ParentBasedSampler({\n root: new AlwaysOnSampler(),\n });\n\n const parsedHeadSampler =\n typeof headSampler === 'object' && 'ratio' in headSampler\n ? createParentRatioSampler(headSampler)\n : headSampler;\n\n // Parse tail sampler (default: keep sampled or error traces)\n const tailSampler =\n config.sampling?.tailSampler ??\n ((traceInfo) => {\n const localRootSpan = traceInfo.localRootSpan;\n const ctx = localRootSpan.spanContext();\n // Keep if sampled or if root span has error\n return (ctx.traceFlags & 1) === 1 || localRootSpan.status.code === 2; // SAMPLED flag | ERROR status\n });\n\n // Parse exporter - use TailSamplingSpanProcessor when tail sampler is present\n const spanProcessors = isSpanProcessorConfig(config)\n ? Array.isArray(config.spanProcessors)\n ? config.spanProcessors\n : [config.spanProcessors]\n : [\n // Use TailSamplingSpanProcessor to enable tail sampling\n new TailSamplingSpanProcessor(\n typeof config.exporter === 'object' && 'url' in config.exporter\n ? new OTLPExporter(config.exporter)\n : config.exporter,\n config.postProcessor,\n tailSampler, // Wire up the tail sampler!\n ),\n ];\n\n // Build resolved config\n const resolved: ResolvedEdgeConfig = {\n service: config.service,\n handlers: {\n fetch: config.handlers?.fetch ?? {},\n },\n fetch: {\n includeTraceContext: config.fetch?.includeTraceContext ?? true,\n },\n postProcessor: config.postProcessor ?? ((spans) => spans),\n sampling: {\n headSampler: parsedHeadSampler,\n tailSampler,\n },\n spanProcessors,\n propagator: config.propagator ?? new W3CTraceContextPropagator(),\n instrumentation: {\n instrumentGlobalFetch: config.instrumentation?.instrumentGlobalFetch ?? true,\n instrumentGlobalCache: config.instrumentation?.instrumentGlobalCache ?? false,\n disabled: config.instrumentation?.disabled ?? false,\n },\n subscribers: config.subscribers ?? [],\n dataSafety: config.dataSafety,\n };\n\n return resolved;\n}\n\n/**\n * Create a parent-based ratio sampler\n */\nfunction createParentRatioSampler(config: ParentRatioSamplingConfig) {\n const { ratio, acceptRemote = true } = config;\n\n // Simple ratio sampler\n const ratioSampler = {\n shouldSample: () => ({\n decision: Math.random() < ratio ? 1 : 0, // RECORD_AND_SAMPLED : NOT_RECORD\n attributes: {},\n }),\n toString: () => `ParentRatioSampler{ratio=${ratio}}`,\n };\n\n if (acceptRemote) {\n return new ParentBasedSampler({ root: ratioSampler as any });\n }\n\n return ratioSampler;\n}\n\n/**\n * Create a config initializer function\n */\nexport function createInitialiser(config: ConfigurationOption): Initialiser {\n if (typeof config === 'function') {\n return (env, trigger) => {\n const conf = parseConfig(config(env, trigger));\n return conf;\n };\n } else {\n const parsed = parseConfig(config);\n return () => parsed;\n }\n}\n"]}
package/dist/events.js CHANGED
@@ -1,4 +1,4 @@
1
- import { getActiveConfig } from './chunk-ILPGMTMU.js';
1
+ import { getActiveConfig } from './chunk-K23QP4PD.js';
2
2
  import { trace } from '@opentelemetry/api';
3
3
 
4
4
  var DEFAULT_SERVICE_NAME = "edge-service";
package/dist/index.d.ts CHANGED
@@ -290,6 +290,8 @@ interface SpanOptions {
290
290
  name: string;
291
291
  attributes?: Record<string, string | number | boolean>;
292
292
  }
293
+ declare function span<T = unknown>(name: string, fn: (span: Span) => T): T;
294
+ declare function span<T = unknown>(name: string, fn: (span: Span) => Promise<T>): Promise<T>;
293
295
  declare function span<T = unknown>(options: SpanOptions, fn: (span: Span) => T): T;
294
296
  declare function span<T = unknown>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T>;
295
297
 
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { OTLPExporter, createInitialiser, getActiveConfig, parseConfig, setConfig } from './chunk-ILPGMTMU.js';
1
+ export { OTLPExporter, createInitialiser, getActiveConfig, parseConfig, setConfig } from './chunk-K23QP4PD.js';
2
2
  import { setSpanName, createTraceContext } from './chunk-AL7ZD64M.js';
3
3
  export { getExecutionLogger } from './chunk-AL7ZD64M.js';
4
4
  export { parseError } from './chunk-M7Z4P5MC.js';
@@ -863,7 +863,8 @@ function instrument(options) {
863
863
  }
864
864
  return instrumented;
865
865
  }
866
- function span(options, fn) {
866
+ function span(nameOrOptions, fn) {
867
+ const options = typeof nameOrOptions === "string" ? { name: nameOrOptions } : nameOrOptions;
867
868
  const tracer = trace.getTracer("autotel-edge");
868
869
  const execute = (span2) => {
869
870
  setSpanName(span2, options.name);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/span.ts","../src/core/tracer.ts","../src/core/context.ts","../src/core/provider.ts","../src/core/buffer.ts","../src/functional.ts","../src/composition.ts","../src/plugin-runner.ts","../src/middleware-toolkit.ts"],"names":["context","api_context","sanitizeAttributes","span","trace","wrappedFunction","otelTrace","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Lightweight Span implementation for edge environments\n */\n\nimport type {\n Attributes,\n AttributeValue,\n Exception,\n HrTime,\n Link,\n Span,\n SpanContext,\n SpanKind,\n SpanStatus,\n SpanStatusCode,\n TimeInput,\n} from '@opentelemetry/api';\nimport {\n hrTimeDuration,\n type InstrumentationScope,\n isAttributeValue,\n isTimeInput,\n sanitizeAttributes,\n} from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport { SEMATTRS_EXCEPTION_MESSAGE, SEMATTRS_EXCEPTION_STACKTRACE, SEMATTRS_EXCEPTION_TYPE } from '@opentelemetry/semantic-conventions';\n\ntype OnSpanEnd = (span: Span) => void;\n\ninterface SpanInit {\n attributes: unknown;\n name: string;\n onEnd: OnSpanEnd;\n resource: Resource;\n spanContext: SpanContext;\n parentSpanContext?: SpanContext;\n links?: Link[];\n parentSpanId?: string;\n spanKind?: SpanKind;\n startTime?: TimeInput;\n}\n\nfunction transformExceptionAttributes(exception: Exception): Attributes {\n const attributes: Attributes = {};\n if (typeof exception === 'string') {\n attributes[SEMATTRS_EXCEPTION_MESSAGE] = exception;\n } else {\n if (exception.code) {\n attributes[SEMATTRS_EXCEPTION_TYPE] = exception.code.toString();\n } else if (exception.name) {\n attributes[SEMATTRS_EXCEPTION_TYPE] = exception.name;\n }\n if (exception.message) {\n attributes[SEMATTRS_EXCEPTION_MESSAGE] = exception.message;\n }\n if (exception.stack) {\n attributes[SEMATTRS_EXCEPTION_STACKTRACE] = exception.stack;\n }\n }\n return attributes;\n}\n\nfunction millisToHr(millis: number): HrTime {\n return [Math.trunc(millis / 1000), (millis % 1000) * 1e6];\n}\n\nfunction getHrTime(input?: TimeInput): HrTime {\n const now = Date.now();\n if (!input) {\n return millisToHr(now);\n } else if (input instanceof Date) {\n return millisToHr(input.getTime());\n } else if (typeof input === 'number') {\n return millisToHr(input);\n } else if (Array.isArray(input)) {\n return input;\n }\n\n const v: never = input;\n throw new Error(`unreachable value: ${JSON.stringify(v)}`);\n}\n\n// Previously exported from OTel, now private\nfunction isAttributeKey(key: unknown): key is string {\n return typeof key === 'string' && key.length > 0;\n}\n\n/**\n * Lightweight Span implementation for edge runtimes\n */\nexport class SpanImpl implements Span, ReadableSpan {\n name: string;\n private readonly _spanContext: SpanContext;\n private readonly onEnd: OnSpanEnd;\n readonly parentSpanId?: string;\n readonly parentSpanContext?: SpanContext | undefined;\n readonly kind: SpanKind;\n readonly attributes: Attributes;\n status: SpanStatus = {\n code: 0 as SpanStatusCode, // SpanStatusCode.UNSET\n };\n endTime: HrTime = [0, 0];\n private _duration: HrTime = [0, 0];\n readonly startTime: HrTime;\n readonly events: TimedEvent[] = [];\n readonly links: Link[];\n readonly resource: Resource;\n instrumentationScope: InstrumentationScope = {\n name: 'autotel-edge',\n };\n private _ended: boolean = false;\n private _droppedAttributesCount: number = 0;\n private _droppedEventsCount: number = 0;\n private _droppedLinksCount: number = 0;\n\n constructor(init: SpanInit) {\n this.name = init.name;\n this._spanContext = init.spanContext;\n this.parentSpanId = init.parentSpanId;\n this.parentSpanContext = init.parentSpanContext;\n this.kind = init.spanKind || (0 as SpanKind); // SpanKind.INTERNAL\n this.attributes = sanitizeAttributes(init.attributes);\n this.startTime = getHrTime(init.startTime);\n this.links = init.links || [];\n this.resource = init.resource;\n this.onEnd = init.onEnd;\n }\n\n addLink(link: Link): this {\n this.links.push(link);\n return this;\n }\n\n addLinks(links: Link[]): this {\n this.links.push(...links);\n return this;\n }\n\n spanContext(): SpanContext {\n return this._spanContext;\n }\n\n setAttribute(key: string, value?: AttributeValue): this {\n if (isAttributeKey(key) && isAttributeValue(value)) {\n this.attributes[key] = value;\n }\n return this;\n }\n\n setAttributes(attributes: Attributes): this {\n for (const [key, value] of Object.entries(attributes)) {\n this.setAttribute(key, value);\n }\n return this;\n }\n\n addEvent(\n name: string,\n attributesOrStartTime?: Attributes | TimeInput,\n startTime?: TimeInput,\n ): this {\n if (isTimeInput(attributesOrStartTime)) {\n startTime = attributesOrStartTime;\n attributesOrStartTime = undefined;\n }\n\n const attributes = sanitizeAttributes(attributesOrStartTime);\n const time = getHrTime(startTime);\n this.events.push({ name, attributes, time });\n return this;\n }\n\n setStatus(status: SpanStatus): this {\n this.status = status;\n return this;\n }\n\n updateName(name: string): this {\n this.name = name;\n return this;\n }\n\n end(endTime?: TimeInput): void {\n if (this._ended) {\n return;\n }\n this._ended = true;\n this.endTime = getHrTime(endTime);\n this._duration = hrTimeDuration(this.startTime, this.endTime);\n this.onEnd(this);\n }\n\n isRecording(): boolean {\n return !this._ended;\n }\n\n recordException(exception: Exception, time?: TimeInput): void {\n const attributes = transformExceptionAttributes(exception);\n this.addEvent('exception', attributes, time);\n }\n\n get duration(): HrTime {\n return this._duration;\n }\n\n get ended(): boolean {\n return this._ended;\n }\n\n get droppedAttributesCount(): number {\n return this._droppedAttributesCount;\n }\n\n get droppedEventsCount(): number {\n return this._droppedEventsCount;\n }\n\n get droppedLinksCount(): number {\n return this._droppedLinksCount;\n }\n}\n","/**\n * Lightweight WorkerTracer for edge environments\n */\n\nimport type {\n Attributes,\n Tracer,\n Span,\n SpanKind,\n SpanOptions,\n Context,\n} from '@opentelemetry/api';\nimport {\n context as api_context,\n trace,\n type SpanContext,\n} from '@opentelemetry/api';\nimport { sanitizeAttributes } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport {\n type SpanProcessor,\n RandomIdGenerator,\n type ReadableSpan,\n SamplingDecision,\n} from '@opentelemetry/sdk-trace-base';\n\nimport { SpanImpl } from './span';\nimport type { TraceFlushableSpanProcessor } from '../types';\n\nconst NewTraceFlags = {\n RANDOM_TRACE_ID_SET: 2,\n RANDOM_TRACE_ID_UNSET: 0,\n} as const;\n\ntype NewTraceFlagValues =\n | typeof NewTraceFlags.RANDOM_TRACE_ID_SET\n | typeof NewTraceFlags.RANDOM_TRACE_ID_UNSET;\n\nconst idGenerator: RandomIdGenerator = new RandomIdGenerator();\n\nlet withNextSpanAttributes: Attributes;\n\nfunction getFlagAt(flagSequence: number, position: number): number {\n return ((flagSequence >> (position - 1)) & 1) * position;\n}\n\n/**\n * WorkerTracer - Lightweight tracer for edge environments\n */\nexport class WorkerTracer implements Tracer {\n private readonly spanProcessors: TraceFlushableSpanProcessor[];\n private readonly resource: Resource;\n private headSampler: any; // Will be set via setHeadSampler\n\n constructor(spanProcessors: SpanProcessor[], resource: Resource) {\n this.spanProcessors = spanProcessors as TraceFlushableSpanProcessor[];\n this.resource = resource;\n }\n\n /**\n * Set the head sampler (called from config)\n */\n setHeadSampler(sampler: any): void {\n this.headSampler = sampler;\n }\n\n /**\n * Force flush spans for a specific trace\n */\n async forceFlush(traceId?: string) {\n const promises = this.spanProcessors.map(async (spanProcessor) => {\n await spanProcessor.forceFlush(traceId);\n });\n await Promise.allSettled(promises);\n }\n\n /**\n * Add extra resource attributes\n */\n addToResource(extra: Resource) {\n this.resource.merge(extra);\n }\n\n /**\n * Start a new span\n */\n startSpan(\n name: string,\n options: SpanOptions = {},\n context = api_context.active(),\n ): Span {\n if (options.root) {\n context = trace.deleteSpan(context);\n }\n\n if (!this.headSampler) {\n throw new Error(\n 'Head sampler not configured. This is a bug in the instrumentation logic',\n );\n }\n\n const parentSpanContext = trace.getSpan(context)?.spanContext();\n const { traceId, randomTraceFlag } = getTraceInfo(parentSpanContext);\n\n const spanKind = options.kind || (0 as SpanKind); // SpanKind.INTERNAL\n const sanitisedAttrs = sanitizeAttributes(options.attributes);\n\n // Use per-span sampler if provided, otherwise use head sampler\n const optionsWithSampler = options as any;\n const sampler = optionsWithSampler.sampler || this.headSampler;\n\n const samplingDecision = sampler.shouldSample(\n context,\n traceId,\n name,\n spanKind,\n sanitisedAttrs,\n [],\n );\n const { decision, traceState, attributes: attrs } = samplingDecision;\n\n const attributes = Object.assign(\n {},\n options.attributes,\n attrs,\n withNextSpanAttributes,\n );\n withNextSpanAttributes = {};\n\n const spanId = idGenerator.generateSpanId();\n const parentSpanId = parentSpanContext?.spanId;\n\n const sampleFlag =\n decision === SamplingDecision.RECORD_AND_SAMPLED ? 1 : 0; // TraceFlags.SAMPLED : TraceFlags.NONE\n const traceFlags = sampleFlag + randomTraceFlag;\n const spanContext: SpanContext = { traceId, spanId, traceFlags, traceState };\n\n const span = new SpanImpl({\n attributes: sanitizeAttributes(attributes),\n name,\n onEnd: (span) => {\n for (const sp of this.spanProcessors) {\n sp.onEnd(span as unknown as ReadableSpan);\n }\n },\n resource: this.resource,\n spanContext,\n parentSpanContext,\n parentSpanId,\n spanKind,\n startTime: options.startTime,\n });\n\n for (const sp of this.spanProcessors) {\n //@ts-ignore - OTel type quirk\n sp.onStart(span, context);\n }\n\n return span;\n }\n\n /**\n * Start an active span (with automatic context management)\n */\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n ...args: unknown[]\n ): ReturnType<F> {\n const options = args.length > 1 ? (args[0] as SpanOptions) : undefined;\n const parentContext =\n args.length > 2 ? (args[1] as Context) : api_context.active();\n const fn = args.at(-1) as F;\n\n const span = this.startSpan(name, options, parentContext);\n const contextWithSpanSet = trace.setSpan(parentContext, span);\n\n return api_context.with(contextWithSpanSet, fn, undefined, span);\n }\n}\n\n/**\n * Set attributes for the next span created\n */\nexport function withNextSpan(attrs: Attributes) {\n withNextSpanAttributes = Object.assign({}, withNextSpanAttributes, attrs);\n}\n\nfunction getTraceInfo(parentSpanContext?: SpanContext): {\n traceId: string;\n randomTraceFlag: NewTraceFlagValues;\n} {\n if (parentSpanContext && trace.isSpanContextValid(parentSpanContext)) {\n const { traceId, traceFlags } = parentSpanContext;\n return { traceId, randomTraceFlag: getFlagAt(traceFlags, 2) as NewTraceFlagValues };\n } else {\n return {\n traceId: idGenerator.generateTraceId(),\n randomTraceFlag: NewTraceFlags.RANDOM_TRACE_ID_SET,\n };\n }\n}\n","/**\n * AsyncLocalStorage-based context manager for edge environments\n *\n * Copyright The OpenTelemetry Authors\n * Licensed under the Apache License, Version 2.0\n */\n\nimport type { ContextManager, Context } from '@opentelemetry/api';\nimport { ROOT_CONTEXT } from '@opentelemetry/api';\n\n//@ts-ignore - node:async_hooks available in CF Workers with nodejs_compat\nimport { AsyncLocalStorage } from 'node:async_hooks';\n//@ts-ignore\nimport { EventEmitter } from 'node:events';\n\ntype Func<T> = (...args: unknown[]) => T;\n\n/**\n * Store a map for each event of all original listeners and their \"patched\"\n * version. So when a listener is removed by the user, the corresponding\n * patched function will be also removed.\n */\ninterface PatchMap {\n [name: string]: WeakMap<Func<void>, Func<void>>;\n}\n\nconst ADD_LISTENER_METHODS = [\n 'addListener' as const,\n 'on' as const,\n 'once' as const,\n 'prependListener' as const,\n 'prependOnceListener' as const,\n];\n\nabstract class AbstractAsyncHooksContextManager implements ContextManager {\n abstract active(): Context;\n\n abstract with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F>;\n\n abstract enable(): this;\n\n abstract disable(): this;\n\n /**\n * Binds a context to the target function or event emitter\n */\n bind<T>(context: Context, target: T): T {\n if (target instanceof EventEmitter) {\n return this._bindEventEmitter(context, target);\n }\n\n if (typeof target === 'function') {\n return this._bindFunction(context, target);\n }\n return target;\n }\n\n private _bindFunction<T extends Function>(context: Context, target: T): T {\n const manager = this;\n const contextWrapper = function (this: never, ...args: unknown[]) {\n return manager.with(context, () => target.apply(this, args));\n };\n Object.defineProperty(contextWrapper, 'length', {\n enumerable: false,\n configurable: true,\n writable: false,\n value: target.length,\n });\n return contextWrapper as any;\n }\n\n /**\n * By default, EventEmitter calls callbacks with their context, which we do\n * not want. Instead we bind a specific context to all callbacks.\n */\n private _bindEventEmitter<T extends EventEmitter>(\n context: Context,\n ee: T,\n ): T {\n const map = this._getPatchMap(ee);\n if (map !== undefined) return ee;\n this._createPatchMap(ee);\n\n // Patch methods that add a listener to propagate context\n for (const methodName of ADD_LISTENER_METHODS) {\n if (ee[methodName] === undefined) continue;\n ee[methodName] = this._patchAddListener(ee, ee[methodName], context);\n }\n\n // Patch methods that remove a listener\n if (typeof ee.removeListener === 'function') {\n ee.removeListener = this._patchRemoveListener(ee, ee.removeListener);\n }\n if (typeof ee.off === 'function') {\n ee.off = this._patchRemoveListener(ee, ee.off);\n }\n\n // Patch method that removes all listeners\n if (typeof ee.removeAllListeners === 'function') {\n ee.removeAllListeners = this._patchRemoveAllListeners(\n ee,\n ee.removeAllListeners,\n );\n }\n return ee;\n }\n\n private _patchRemoveListener(ee: EventEmitter, original: Function) {\n const contextManager = this;\n return function (this: never, event: string, listener: Func<void>) {\n const events = contextManager._getPatchMap(ee)?.[event];\n if (events === undefined) {\n return original.call(this, event, listener);\n }\n const patchedListener = events.get(listener);\n return original.call(this, event, patchedListener || listener);\n };\n }\n\n private _patchRemoveAllListeners(ee: EventEmitter, original: Function) {\n const contextManager = this;\n return function (this: never, event: string) {\n const map = contextManager._getPatchMap(ee);\n if (map !== undefined) {\n if (arguments.length === 0) {\n contextManager._createPatchMap(ee);\n } else if (map[event] !== undefined) {\n delete map[event];\n }\n }\n return Reflect.apply(original, this, arguments);\n };\n }\n\n private _patchAddListener(\n ee: EventEmitter,\n original: Function,\n context: Context,\n ) {\n const contextManager = this;\n return function (this: never, event: string, listener: Func<void>) {\n /**\n * This check prevents double-wrapping the listener.\n * The implementation for ee.once wraps the listener and calls ee.on.\n * Without this check, we would wrap that wrapped listener.\n */\n if (contextManager._wrapped) {\n return original.call(this, event, listener);\n }\n let map = contextManager._getPatchMap(ee);\n if (map === undefined) {\n map = contextManager._createPatchMap(ee);\n }\n let listeners = map[event];\n if (listeners === undefined) {\n listeners = new WeakMap();\n map[event] = listeners;\n }\n const patchedListener = contextManager.bind(context, listener);\n // Store a weak reference of the user listener to ours\n listeners.set(listener, patchedListener);\n\n contextManager._wrapped = true;\n try {\n return original.call(this, event, patchedListener);\n } finally {\n contextManager._wrapped = false;\n }\n };\n }\n\n private _createPatchMap(ee: EventEmitter): PatchMap {\n const map = Object.create(null);\n (ee as any)[this._kOtListeners] = map;\n return map;\n }\n\n private _getPatchMap(ee: EventEmitter): PatchMap | undefined {\n return (ee as never)[this._kOtListeners];\n }\n\n private readonly _kOtListeners = Symbol('OtListeners');\n private _wrapped = false;\n}\n\n/**\n * AsyncLocalStorage-based context manager for edge runtimes\n */\nexport class AsyncLocalStorageContextManager extends AbstractAsyncHooksContextManager {\n private _asyncLocalStorage: AsyncLocalStorage<Context>;\n\n constructor() {\n super();\n this._asyncLocalStorage = new AsyncLocalStorage();\n }\n\n active(): Context {\n return this._asyncLocalStorage.getStore() ?? ROOT_CONTEXT;\n }\n\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n const cb = thisArg == null ? fn : fn.bind(thisArg);\n return this._asyncLocalStorage.run(context, cb as never, ...args);\n }\n\n enable(): this {\n return this;\n }\n\n disable(): this {\n this._asyncLocalStorage.disable();\n return this;\n }\n}\n","/**\n * Tracer provider for edge environments\n */\n\nimport { trace } from '@opentelemetry/api';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { SpanProcessor, TracerConfig } from '@opentelemetry/sdk-trace-base';\nimport { WorkerTracer } from './tracer';\nimport { AsyncLocalStorageContextManager } from './context';\n\n/**\n * WorkerTracerProvider - Registers tracer globally\n */\nexport class WorkerTracerProvider {\n private tracer: WorkerTracer;\n private contextManager: AsyncLocalStorageContextManager;\n\n constructor(spanProcessors: SpanProcessor[], resource: Resource) {\n this.tracer = new WorkerTracer(spanProcessors, resource);\n this.contextManager = new AsyncLocalStorageContextManager();\n }\n\n /**\n * Get the tracer instance\n */\n getTracer(_name: string, _version?: string, _config?: TracerConfig): WorkerTracer {\n return this.tracer;\n }\n\n /**\n * Register this provider as the global tracer\n */\n register(): void {\n // Enable context manager\n this.contextManager.enable();\n\n // Set tracer provider\n const provider = {\n getTracer: (_name: string, _version?: string) => this.tracer,\n };\n\n // @ts-ignore - OTel types\n trace.setGlobalTracerProvider(provider);\n }\n}\n","/**\n * Buffer polyfill for edge environments\n *\n * Cloudflare Workers and other edge runtimes need the Buffer global\n * for OpenTelemetry OTLP serialization.\n */\n\n//@ts-ignore - node:buffer available in CF Workers with nodejs_compat\nimport { Buffer } from 'node:buffer';\n\n//@ts-ignore\nglobalThis.Buffer = Buffer;\n\n\n\nexport {Buffer} from 'node:buffer';","/**\n * Functional API for autotel-edge\n *\n * Provides zero-boilerplate tracing helpers that mirror the Node.js runtime\n * implementation while staying optimized for edge environments.\n */\n\nimport {\n trace as otelTrace,\n SpanStatusCode,\n type Span,\n type AttributeValue,\n} from '@opentelemetry/api';\nimport type { Sampler } from '@opentelemetry/sdk-trace-base';\nimport type { TraceContext } from './core/trace-context';\nimport { createTraceContext, setSpanName } from './core/trace-context';\n\n// Re-export for convenience\nexport type { TraceContext } from './core/trace-context';\n\ntype AnyFn = (...args: any[]) => any;\n\nconst TRACE_FACTORY_MARK = '__autotelEdgeTraceFactory';\nconst INSTRUMENTED_MARK = '__autotelEdgeInstrumented';\nconst FACTORY_NAME_HINTS: Record<string, true> = {\n ctx: true,\n _ctx: true,\n context: true,\n tracecontext: true,\n tracectx: true,\n};\n\nconst SINGLE_LINE_COMMENT_REGEX = /\\/\\/.*$/gm;\nconst MULTI_LINE_COMMENT_REGEX = /\\/\\*[\\s\\S]*?\\*\\//gm;\nconst PARAM_TOKEN_SANITIZE_REGEX = new RegExp(String.raw`[{}\\[\\]\\s]`, 'g');\n\ninterface TraceFactoryMarked {\n [TRACE_FACTORY_MARK]?: true;\n}\n\nfunction markAsTraceFactory(fn: AnyFn): void {\n try {\n Object.defineProperty(fn, TRACE_FACTORY_MARK, {\n value: true,\n configurable: true,\n });\n } catch {\n (fn as TraceFactoryMarked)[TRACE_FACTORY_MARK] = true;\n }\n}\n\nfunction hasFactoryMark(fn: AnyFn): boolean {\n return Boolean((fn as TraceFactoryMarked)[TRACE_FACTORY_MARK]);\n}\n\nfunction sanitizeParameterToken(token: string): string {\n const [firstToken] = token.split('=');\n return (firstToken ?? '').replaceAll(PARAM_TOKEN_SANITIZE_REGEX, '').trim();\n}\n\nfunction getFirstParameterToken(fn: AnyFn): string | null {\n let source = Function.prototype.toString.call(fn);\n source = source\n .replaceAll(MULTI_LINE_COMMENT_REGEX, '')\n .replaceAll(SINGLE_LINE_COMMENT_REGEX, '')\n .trim();\n\n const arrowMatch = source.match(/^(?:async\\s*)?(?:\\(([^)]*)\\)|([^=()]+))\\s*=>/);\n if (arrowMatch) {\n const params = (arrowMatch[1] ?? arrowMatch[2] ?? '').split(',');\n const first = params[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n return null;\n }\n\n const functionMatch = source.match(/^[^(]*\\(([^)]*)\\)/);\n if (functionMatch) {\n const params = functionMatch[1]?.split(',');\n const first = params?.[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n }\n\n return null;\n}\n\nfunction looksLikeTraceFactory(fn: AnyFn): boolean {\n if (hasFactoryMark(fn)) {\n return true;\n }\n\n if (fn.length === 0) {\n return false;\n }\n\n const firstParam = getFirstParameterToken(fn);\n if (!firstParam) {\n return false;\n }\n\n const normalized = firstParam.toLowerCase();\n if (\n Object.hasOwn(FACTORY_NAME_HINTS, normalized) ||\n normalized.startsWith('ctx') ||\n normalized.startsWith('_ctx') ||\n normalized.startsWith('trace')\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if a function that takes ctx returns another function (factory pattern)\n * vs returning a value directly (immediate execution pattern)\n */\nfunction isFactoryReturningFunction(\n fnWithCtx: (ctx: TraceContext) => unknown,\n): boolean {\n try {\n const result = fnWithCtx(createDummyCtx());\n return typeof result === 'function';\n } catch {\n // If the function throws when called with dummy ctx, assume it's immediate execution\n // since factory functions typically just return a function and don't execute logic\n return false;\n }\n}\n\nfunction isTraceFactoryFunction<TArgs extends any[], TReturn>(\n fn:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): fn is (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (typeof fn !== 'function') {\n return false;\n }\n\n if (hasFactoryMark(fn as AnyFn)) {\n return true;\n }\n\n if (looksLikeTraceFactory(fn as AnyFn)) {\n markAsTraceFactory(fn as AnyFn);\n return true;\n }\n\n return false;\n}\n\nfunction ensureTraceFactory<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (isTraceFactoryFunction(fnOrFactory)) {\n return fnOrFactory;\n }\n\n const plainFn = fnOrFactory as (...args: TArgs) => TReturn | Promise<TReturn>;\n const factory = (ctx: TraceContext) => {\n void ctx;\n return plainFn;\n };\n markAsTraceFactory(factory);\n return factory;\n}\n\ntype ExtractFunctionSignature<T> = T extends (ctx: TraceContext) => infer F\n ? F extends (...args: infer Args) => infer Return\n ? (...args: Args) => Return\n : never\n : never;\n\ntype WrappedFunction<TArgs extends any[], TReturn> = (...args: TArgs) => TReturn | Promise<TReturn>;\n\n/**\n * trace function options\n */\nexport interface traceOptions<TArgs extends any[] = any[], TReturn = any> {\n name?: string;\n serviceName?: string;\n sampler?: Sampler;\n attributesFromArgs?: (args: TArgs) => Record<string, unknown>;\n attributesFromResult?: (result: TReturn) => Record<string, unknown>;\n attributes?: Record<string, unknown>;\n}\n\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\nfunction createDummyCtx(): TraceContext {\n return {\n traceId: '',\n spanId: '',\n correlationId: '',\n setAttribute: () => {},\n setAttributes: () => {},\n setStatus: () => {},\n recordException: () => {},\n addEvent: () => {},\n addLink: () => {},\n addLinks: () => {},\n updateName: () => {},\n isRecording: () => false,\n } as TraceContext;\n}\n\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\ntype InstrumentableFunction<TArgs extends any[] = any[], TReturn = any> = ((\n ...args: TArgs\n) => TReturn | Promise<TReturn>) & {\n displayName?: string;\n name?: string;\n};\n\nfunction inferFunctionName<TArgs extends any[] = any[], TReturn = any>(\n fn: InstrumentableFunction<TArgs, TReturn>,\n): string | undefined {\n const displayName = (fn as { displayName?: string }).displayName;\n if (displayName) {\n return displayName;\n }\n\n if (fn.name && fn.name !== 'anonymous') {\n return fn.name;\n }\n\n const source = Function.prototype.toString.call(fn);\n const match = source.match(/function\\s+([^(\\s]+)/);\n if (match && match[1] && match[1] !== 'anonymous') {\n return match[1];\n }\n\n return undefined;\n}\n\nfunction getSpanName<TArgs extends any[], TReturn>(\n options: traceOptions<TArgs, TReturn>,\n fn: InstrumentableFunction<TArgs, TReturn>,\n variableName?: string,\n): string {\n if (options.name) {\n return options.name;\n }\n\n let fnName = variableName ?? inferFunctionName(fn);\n fnName = fnName || 'anonymous';\n\n if (options.serviceName) {\n return `${options.serviceName}.${fnName}`;\n }\n\n if (fnName && fnName !== 'anonymous') {\n return fnName;\n }\n\n return 'unknown';\n}\n\nfunction isAsyncFunction(fn: unknown): boolean {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n\nfunction wrapWithTracingAsync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => Promise<TReturn> {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = async function wrappedFunction(this: unknown, ...args: TArgs): Promise<TReturn> {\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, async (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = await actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_MARK] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapWithTracingSync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => TReturn {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = function wrappedFunction(this: unknown, ...args: TArgs): TReturn {\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result as TReturn);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_MARK] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapFactoryWithTracing<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const factory = ensureTraceFactory(fnOrFactory);\n const sampleFn = factory(createDummyCtx());\n const useAsyncWrapper = isAsyncFunction(sampleFn);\n\n if (useAsyncWrapper) {\n return wrapWithTracingAsync(\n factory as (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n }\n\n return wrapWithTracingSync(\n factory as (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Execute a function immediately within a trace span\n * Used for the immediate execution pattern: trace((ctx) => result)\n */\nfunction executeImmediately<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn | Promise<TReturn>,\n options: traceOptions<any[], any>,\n): TReturn | Promise<TReturn> {\n const tracer = otelTrace.getTracer('@autotel/edge');\n const spanName = options.name || 'anonymous';\n\n return tracer.startActiveSpan(spanName, (span) => {\n try {\n setSpanName(span, spanName);\n const ctxValue = createTraceContext(span);\n\n const onSuccess = (result: TReturn) => {\n span.setStatus({ code: SpanStatusCode.OK });\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value as AttributeValue);\n }\n }\n span.end();\n return result;\n };\n\n const onError = (error: unknown): never => {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.type',\n error instanceof Error ? error.constructor.name : 'Error');\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n };\n\n const result = fn(ctxValue);\n\n // Check if result is a Promise\n if (result instanceof Promise) {\n return result.then(onSuccess, onError);\n }\n\n return onSuccess(result);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n }\n });\n}\n\n// Sync overloads - Factory pattern with explicit return type helps TypeScript infer\n// Overload 1a: Plain sync function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => TReturn,\n): () => TReturn;\n// Overload 1b: Plain sync function (auto-inferred name)\nexport function trace<TArgs extends any[], TReturn = any>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 1c: Factory sync function with no args returning explicit type (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => TReturn,\n): () => TReturn;\n// Overload 1d: Immediate execution - sync function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n// Overload 1e: Factory sync function - use conditional type to extract signature (MUST come before generic)\n// This overload is more specific and helps TypeScript infer types from factory functions\nexport function trace<TFactory extends (ctx: TraceContext) => (...args: any[]) => any>(\n fnFactory: TFactory,\n): ExtractFunctionSignature<TFactory>;\n// Overload 1f: Generic factory sync function (fallback)\nexport function trace<TArgs extends any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2a: Name + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2b: Name + immediate execution sync with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 2c: Name + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3a: Options + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3b: Options + immediate execution sync with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 3c: Options + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Async overloads\n// Overload 4a: Plain async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4b: Plain async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 4c: Immediate execution - async function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n// Overload 4d: Factory async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4e: Factory async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5a: Name + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5b: Name + immediate execution async with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 5c: Name + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6a: Options + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6b: Options + immediate execution async with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 6c: Options + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Implementation\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnOrNameOrOptions:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>)\n | string\n | traceOptions<TArgs, TReturn>,\n maybeFn?:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>),\n): WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn> {\n // Handle: trace(fn) - single argument\n if (typeof fnOrNameOrOptions === 'function') {\n // Check if it's immediate execution pattern: (ctx) => result\n if (\n looksLikeTraceFactory(fnOrNameOrOptions as AnyFn) &&\n !isFactoryReturningFunction(fnOrNameOrOptions as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern\n return executeImmediately(\n fnOrNameOrOptions as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n {},\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n // Factory pattern or plain function\n return wrapFactoryWithTracing(\n fnOrNameOrOptions as (...args: TArgs) => TReturn,\n {} as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(name, fn) or trace(options, fn) - two arguments\n if (typeof fnOrNameOrOptions === 'string') {\n if (!maybeFn) {\n throw new Error('trace(name, fn): fn is required');\n }\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with name\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n { name: fnOrNameOrOptions },\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n { name: fnOrNameOrOptions } as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(options, fn)\n if (!maybeFn) {\n throw new Error('trace(options, fn): fn is required');\n }\n\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with options\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n fnOrNameOrOptions as traceOptions<any[], any>,\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n fnOrNameOrOptions as traceOptions<TArgs, TReturn>,\n );\n}\n\nexport function withTracing<TArgs extends any[] = any[], TReturn = any>(\n options: Omit<traceOptions<TArgs, TReturn>, 'name'>,\n) {\n return (\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>)\n ): WrappedFunction<TArgs, TReturn> => wrapFactoryWithTracing(fnOrFactory, options as traceOptions<TArgs, TReturn>);\n}\n\nfunction shouldSkip(key: string, fn: Function, skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[]): boolean {\n if (key.startsWith('_')) {\n return true;\n }\n\n if (!skip || skip.length === 0) {\n return false;\n }\n\n for (const pattern of skip) {\n if (typeof pattern === 'string' && key === pattern) {\n return true;\n }\n if (pattern instanceof RegExp && pattern.test(key)) {\n return true;\n }\n if (typeof pattern === 'function' && pattern(key, fn)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport interface InstrumentOptions extends traceOptions {\n functions: Record<string, any>;\n overrides?: Record<string, Partial<traceOptions>>;\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[];\n}\n\nexport function instrument<T extends Record<string, any>>(\n options: InstrumentOptions,\n): T {\n const { functions, ...tracingOptions } = options;\n const instrumented: Record<string, any> = {};\n\n for (const key of Object.keys(functions)) {\n const fn = functions[key];\n\n if (typeof fn !== 'function') {\n instrumented[key] = fn;\n continue;\n }\n\n if (shouldSkip(key, fn, tracingOptions.skip)) {\n instrumented[key] = fn;\n continue;\n }\n\n const fnOptions: traceOptions = {\n ...tracingOptions,\n ...tracingOptions.overrides?.[key],\n name: tracingOptions.overrides?.[key]?.name ?? tracingOptions.name,\n };\n\n const boundFn = fn.bind(functions);\n const fnFactory = (_ctx: TraceContext) => boundFn as AnyFn;\n\n instrumented[key] = wrapFactoryWithTracing(fnFactory, fnOptions, key);\n }\n\n return instrumented as T;\n}\n\nexport interface SpanOptions {\n name: string;\n attributes?: Record<string, string | number | boolean>;\n}\n\nexport function span<T = unknown>(options: SpanOptions, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n const tracer = otelTrace.getTracer('autotel-edge');\n\n const execute = (span: Span) => {\n setSpanName(span, options.name);\n\n try {\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value);\n }\n }\n\n const result = fn(span);\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return value;\n })\n .catch((error) => {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n });\n }\n\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n };\n\n const result = tracer.startActiveSpan(options.name, execute);\n\n if (result instanceof Promise) {\n return result;\n }\n\n return result as T;\n}\n","/**\n * Composition helpers for building autotel pipelines from small, testable parts.\n *\n * The motivation is the same as for any pipeline library: you can author\n * subscribers, post-processors and span processors as standalone units and\n * stitch them together at config-construction time without inventing ad-hoc\n * wrappers in every package.\n *\n * None of these helpers change runtime behaviour by themselves — they only\n * combine functions / processors that already work in isolation.\n */\nimport type { Span } from '@opentelemetry/api';\nimport type { ReadableSpan as SdkReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type {\n EdgeConfig,\n EdgeEvent,\n EdgeSubscriber,\n PostProcessorFn,\n ReadableSpan as EdgeReadableSpan,\n ResolveConfigFn,\n} from './types';\n\ntype Awaitable<T> = T | Promise<T>;\n\n/**\n * Identity helper for authoring an autotel configuration once with full\n * type-checking. Mirrors `defineConfig` patterns in tools like Vite / Vitest.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'autotel-edge'\n *\n * export const otelConfig = defineConfig({\n * service: { name: 'checkout' },\n * exporter: { url: process.env.OTLP_URL! },\n * })\n * ```\n */\nexport function defineConfig<T extends EdgeConfig | ResolveConfigFn>(config: T): T {\n return config;\n}\n\n/**\n * Run a list of subscribers in registration order. Errors thrown by an\n * individual subscriber are caught and logged so a buggy subscriber never\n * blocks the others — important because `subscribers` is the primary\n * extensibility point for in-process side effects.\n */\nexport function composeSubscribers(\n subscribers: Array<EdgeSubscriber>,\n options: { name?: string } = {},\n): EdgeSubscriber {\n const label = options.name ?? 'compose-subscribers';\n return async (event: EdgeEvent) => {\n for (const subscriber of subscribers) {\n try {\n await subscriber(event);\n } catch (err) {\n console.error(`[autotel-edge/${label}] subscriber failed:`, err);\n }\n }\n };\n}\n\n/**\n * Chain post-processors so each one sees the output of the previous one.\n * This matches the standard OTel post-processor contract: take spans, return\n * spans (possibly filtered, redacted, or annotated).\n */\nexport function composePostProcessors(\n processors: Array<PostProcessorFn>,\n): PostProcessorFn {\n return (spans: EdgeReadableSpan[]) => {\n let current = spans;\n for (const processor of processors) {\n try {\n current = processor(current);\n } catch (err) {\n console.error('[autotel-edge/compose-post-processors] failed:', err);\n }\n }\n return current;\n };\n}\n\n/**\n * Fan out span lifecycle events to multiple span processors. Any single\n * processor's failure is isolated so it cannot break the others.\n *\n * Useful when you want to attach, say, a sampling processor + a custom\n * attribute redactor + the default batch processor without having to author a\n * single processor that knows about all three.\n */\nexport function composeSpanProcessors(processors: SpanProcessor[]): SpanProcessor {\n const safe = (label: string, fn: () => Awaitable<void>) =>\n Promise.resolve()\n .then(fn)\n .catch((err) => {\n console.error(`[autotel-edge/compose-span-processors:${label}]`, err);\n });\n\n return {\n onStart(span: Span, parentContext) {\n for (const processor of processors) {\n try {\n processor.onStart(span as unknown as SdkReadableSpan & Span, parentContext);\n } catch (err) {\n console.error('[autotel-edge/compose-span-processors:onStart]', err);\n }\n }\n },\n onEnd(span: SdkReadableSpan) {\n for (const processor of processors) {\n try {\n processor.onEnd(span);\n } catch (err) {\n console.error('[autotel-edge/compose-span-processors:onEnd]', err);\n }\n }\n },\n async forceFlush() {\n await Promise.allSettled(\n processors.map((p) => safe('forceFlush', () => p.forceFlush())),\n );\n },\n async shutdown() {\n await Promise.allSettled(\n processors.map((p) => safe('shutdown', () => p.shutdown())),\n );\n },\n } as SpanProcessor;\n}\n","export type Awaitable<T> = T | Promise<T>;\n\nexport interface PluginHookContexts<\n TSetup = unknown,\n TEnrich = unknown,\n TDrain = unknown,\n TKeep = unknown,\n TRequestStart = unknown,\n TRequestFinish = unknown,\n TClientLog = unknown,\n TLogger = unknown,\n> {\n setup: TSetup;\n enrich: TEnrich;\n drain: TDrain;\n keep: TKeep;\n requestStart: TRequestStart;\n requestFinish: TRequestFinish;\n clientLog: TClientLog;\n logger: TLogger;\n}\n\nexport type DefaultPluginContexts = PluginHookContexts;\n\nexport interface EdgePlugin<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n> {\n name: string;\n setup?: (ctx: Ctx['setup']) => Awaitable<void>;\n enrich?: (ctx: Ctx['enrich']) => Awaitable<void>;\n drain?: (ctx: Ctx['drain']) => Awaitable<void>;\n keep?: (ctx: Ctx['keep']) => Awaitable<void>;\n onRequestStart?: (ctx: Ctx['requestStart']) => void;\n onRequestFinish?: (ctx: Ctx['requestFinish']) => void;\n onClientLog?: (ctx: Ctx['clientLog']) => void;\n extendLogger?: (logger: Ctx['logger']) => void;\n}\n\nexport interface PluginRunner<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n> {\n readonly plugins: readonly EdgePlugin<Ctx>[];\n readonly hasEnrich: boolean;\n readonly hasDrain: boolean;\n readonly hasKeep: boolean;\n readonly hasRequestLifecycle: boolean;\n readonly hasClientLog: boolean;\n readonly hasExtendLogger: boolean;\n applyExtendLogger: (logger: Ctx['logger']) => void;\n runOnRequestStart: (ctx: Ctx['requestStart']) => void;\n runOnRequestFinish: (ctx: Ctx['requestFinish']) => void;\n runOnClientLog: (ctx: Ctx['clientLog']) => void;\n runSetup: (ctx: Ctx['setup']) => Promise<void>;\n runEnrich: (ctx: Ctx['enrich']) => Promise<void>;\n runDrain: (ctx: Ctx['drain']) => Promise<void>;\n runKeep: (ctx: Ctx['keep']) => Promise<void>;\n}\n\nexport interface PluginRunnerOptions {\n logger?: Pick<Console, 'error'>;\n}\n\nfunction logPluginError(\n logger: Pick<Console, 'error'>,\n name: string,\n hook: string,\n error: unknown,\n): void {\n logger.error(`[autotel-edge/${name}] ${hook} failed:`, error);\n}\n\nexport function definePlugin<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n>(plugin: EdgePlugin<Ctx>): EdgePlugin<Ctx> {\n return plugin;\n}\n\nexport function createPluginRunner<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n>(\n plugins: EdgePlugin<Ctx>[] = [],\n options: PluginRunnerOptions = {},\n): PluginRunner<Ctx> {\n const errorLogger = options.logger ?? console;\n const byName = new Map<string, EdgePlugin<Ctx>>();\n\n // De-duplicate by plugin name while preserving registration order semantics.\n // The last plugin with a given name wins.\n for (const plugin of plugins) {\n byName.set(plugin.name, plugin);\n }\n\n const list = Array.from(byName.values());\n\n const hasEnrich = list.some((p) => typeof p.enrich === 'function');\n const hasDrain = list.some((p) => typeof p.drain === 'function');\n const hasKeep = list.some((p) => typeof p.keep === 'function');\n const hasRequestLifecycle = list.some(\n (p) =>\n typeof p.onRequestStart === 'function' ||\n typeof p.onRequestFinish === 'function',\n );\n const hasClientLog = list.some((p) => typeof p.onClientLog === 'function');\n const hasExtendLogger = list.some(\n (p) => typeof p.extendLogger === 'function',\n );\n\n return {\n plugins: list,\n hasEnrich,\n hasDrain,\n hasKeep,\n hasRequestLifecycle,\n hasClientLog,\n hasExtendLogger,\n\n applyExtendLogger(logger) {\n for (const plugin of list) {\n if (!plugin.extendLogger) continue;\n try {\n plugin.extendLogger(logger);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'extendLogger', err);\n }\n }\n },\n\n runOnRequestStart(ctx) {\n for (const plugin of list) {\n if (!plugin.onRequestStart) continue;\n try {\n plugin.onRequestStart(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onRequestStart', err);\n }\n }\n },\n\n runOnRequestFinish(ctx) {\n for (const plugin of list) {\n if (!plugin.onRequestFinish) continue;\n try {\n plugin.onRequestFinish(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onRequestFinish', err);\n }\n }\n },\n\n runOnClientLog(ctx) {\n for (const plugin of list) {\n if (!plugin.onClientLog) continue;\n try {\n plugin.onClientLog(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onClientLog', err);\n }\n }\n },\n\n async runSetup(ctx) {\n for (const plugin of list) {\n if (!plugin.setup) continue;\n try {\n await plugin.setup(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'setup', err);\n }\n }\n },\n\n async runEnrich(ctx) {\n for (const plugin of list) {\n if (!plugin.enrich) continue;\n try {\n await plugin.enrich(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'enrich', err);\n }\n }\n },\n\n async runDrain(ctx) {\n const drains = list.filter((p) => typeof p.drain === 'function');\n if (drains.length === 0) return;\n\n await Promise.allSettled(\n drains.map(async (plugin) => {\n try {\n await plugin.drain!(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'drain', err);\n }\n }),\n );\n },\n\n async runKeep(ctx) {\n for (const plugin of list) {\n if (!plugin.keep) continue;\n try {\n await plugin.keep(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'keep', err);\n }\n }\n },\n };\n}\n\nconst emptyRunner = createPluginRunner([]);\n\nexport function getEmptyPluginRunner(): PluginRunner {\n return emptyRunner;\n}\n","import type { RouteServiceConfig } from './types';\n\nexport type Awaitable<T> = T | Promise<T>;\n\nexport function matchesRoutePattern(path: string, pattern: string): boolean {\n const regexPattern = pattern\n .replaceAll(/[.+^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n .replaceAll('**', '{{GLOBSTAR}}')\n .replaceAll('*', '[^/]*')\n .replaceAll('{{GLOBSTAR}}', '.*')\n .replaceAll('?', '[^/]');\n return new RegExp(`^${regexPattern}$`).test(path);\n}\n\nexport interface RouteFilterOptions {\n include?: string[];\n exclude?: string[];\n}\n\nexport function shouldInstrumentPath(\n path: string,\n options: RouteFilterOptions = {},\n): boolean {\n const { include, exclude } = options;\n\n if (exclude && exclude.some((pattern) => matchesRoutePattern(path, pattern))) {\n return false;\n }\n\n if (!include || include.length === 0) {\n return true;\n }\n\n return include.some((pattern) => matchesRoutePattern(path, pattern));\n}\n\nexport function getServiceForPath(\n path: string,\n routes?: Record<string, RouteServiceConfig>,\n): string | undefined {\n if (!routes) return undefined;\n\n for (const [pattern, config] of Object.entries(routes)) {\n if (matchesRoutePattern(path, pattern)) {\n return config.service;\n }\n }\n\n return undefined;\n}\n\nexport interface MiddlewareFinishContext<TEvent, TRequest = unknown> {\n event: TEvent;\n request: TRequest;\n status?: number;\n}\n\nexport interface MiddlewarePipelineOptions<TEvent, TRequest = unknown> {\n enrichers?: Array<\n (ctx: MiddlewareFinishContext<TEvent, TRequest>) => Awaitable<void>\n >;\n drains?: Array<\n (ctx: MiddlewareFinishContext<TEvent, TRequest>) => Awaitable<void>\n >;\n logger?: Pick<Console, 'error'>;\n}\n\nexport async function runMiddlewareFinishPipeline<TEvent, TRequest = unknown>(\n ctx: MiddlewareFinishContext<TEvent, TRequest>,\n options: MiddlewarePipelineOptions<TEvent, TRequest> = {},\n): Promise<void> {\n const logger = options.logger ?? console;\n\n for (const enrich of options.enrichers ?? []) {\n try {\n await enrich(ctx);\n } catch (err) {\n logger.error('[autotel-edge/middleware] enricher failed:', err);\n }\n }\n\n const drains = options.drains ?? [];\n if (drains.length === 0) return;\n\n await Promise.allSettled(\n drains.map(async (drain) => {\n try {\n await drain(ctx);\n } catch (err) {\n logger.error('[autotel-edge/middleware] drain failed:', err);\n }\n }),\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/core/span.ts","../src/core/tracer.ts","../src/core/context.ts","../src/core/provider.ts","../src/core/buffer.ts","../src/functional.ts","../src/composition.ts","../src/plugin-runner.ts","../src/middleware-toolkit.ts"],"names":["context","api_context","sanitizeAttributes","span","trace","wrappedFunction","otelTrace","result"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Lightweight Span implementation for edge environments\n */\n\nimport type {\n Attributes,\n AttributeValue,\n Exception,\n HrTime,\n Link,\n Span,\n SpanContext,\n SpanKind,\n SpanStatus,\n SpanStatusCode,\n TimeInput,\n} from '@opentelemetry/api';\nimport {\n hrTimeDuration,\n type InstrumentationScope,\n isAttributeValue,\n isTimeInput,\n sanitizeAttributes,\n} from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base';\nimport { SEMATTRS_EXCEPTION_MESSAGE, SEMATTRS_EXCEPTION_STACKTRACE, SEMATTRS_EXCEPTION_TYPE } from '@opentelemetry/semantic-conventions';\n\ntype OnSpanEnd = (span: Span) => void;\n\ninterface SpanInit {\n attributes: unknown;\n name: string;\n onEnd: OnSpanEnd;\n resource: Resource;\n spanContext: SpanContext;\n parentSpanContext?: SpanContext;\n links?: Link[];\n parentSpanId?: string;\n spanKind?: SpanKind;\n startTime?: TimeInput;\n}\n\nfunction transformExceptionAttributes(exception: Exception): Attributes {\n const attributes: Attributes = {};\n if (typeof exception === 'string') {\n attributes[SEMATTRS_EXCEPTION_MESSAGE] = exception;\n } else {\n if (exception.code) {\n attributes[SEMATTRS_EXCEPTION_TYPE] = exception.code.toString();\n } else if (exception.name) {\n attributes[SEMATTRS_EXCEPTION_TYPE] = exception.name;\n }\n if (exception.message) {\n attributes[SEMATTRS_EXCEPTION_MESSAGE] = exception.message;\n }\n if (exception.stack) {\n attributes[SEMATTRS_EXCEPTION_STACKTRACE] = exception.stack;\n }\n }\n return attributes;\n}\n\nfunction millisToHr(millis: number): HrTime {\n return [Math.trunc(millis / 1000), (millis % 1000) * 1e6];\n}\n\nfunction getHrTime(input?: TimeInput): HrTime {\n const now = Date.now();\n if (!input) {\n return millisToHr(now);\n } else if (input instanceof Date) {\n return millisToHr(input.getTime());\n } else if (typeof input === 'number') {\n return millisToHr(input);\n } else if (Array.isArray(input)) {\n return input;\n }\n\n const v: never = input;\n throw new Error(`unreachable value: ${JSON.stringify(v)}`);\n}\n\n// Previously exported from OTel, now private\nfunction isAttributeKey(key: unknown): key is string {\n return typeof key === 'string' && key.length > 0;\n}\n\n/**\n * Lightweight Span implementation for edge runtimes\n */\nexport class SpanImpl implements Span, ReadableSpan {\n name: string;\n private readonly _spanContext: SpanContext;\n private readonly onEnd: OnSpanEnd;\n readonly parentSpanId?: string;\n readonly parentSpanContext?: SpanContext | undefined;\n readonly kind: SpanKind;\n readonly attributes: Attributes;\n status: SpanStatus = {\n code: 0 as SpanStatusCode, // SpanStatusCode.UNSET\n };\n endTime: HrTime = [0, 0];\n private _duration: HrTime = [0, 0];\n readonly startTime: HrTime;\n readonly events: TimedEvent[] = [];\n readonly links: Link[];\n readonly resource: Resource;\n instrumentationScope: InstrumentationScope = {\n name: 'autotel-edge',\n };\n private _ended: boolean = false;\n private _droppedAttributesCount: number = 0;\n private _droppedEventsCount: number = 0;\n private _droppedLinksCount: number = 0;\n\n constructor(init: SpanInit) {\n this.name = init.name;\n this._spanContext = init.spanContext;\n this.parentSpanId = init.parentSpanId;\n this.parentSpanContext = init.parentSpanContext;\n this.kind = init.spanKind || (0 as SpanKind); // SpanKind.INTERNAL\n this.attributes = sanitizeAttributes(init.attributes);\n this.startTime = getHrTime(init.startTime);\n this.links = init.links || [];\n this.resource = init.resource;\n this.onEnd = init.onEnd;\n }\n\n addLink(link: Link): this {\n this.links.push(link);\n return this;\n }\n\n addLinks(links: Link[]): this {\n this.links.push(...links);\n return this;\n }\n\n spanContext(): SpanContext {\n return this._spanContext;\n }\n\n setAttribute(key: string, value?: AttributeValue): this {\n if (isAttributeKey(key) && isAttributeValue(value)) {\n this.attributes[key] = value;\n }\n return this;\n }\n\n setAttributes(attributes: Attributes): this {\n for (const [key, value] of Object.entries(attributes)) {\n this.setAttribute(key, value);\n }\n return this;\n }\n\n addEvent(\n name: string,\n attributesOrStartTime?: Attributes | TimeInput,\n startTime?: TimeInput,\n ): this {\n if (isTimeInput(attributesOrStartTime)) {\n startTime = attributesOrStartTime;\n attributesOrStartTime = undefined;\n }\n\n const attributes = sanitizeAttributes(attributesOrStartTime);\n const time = getHrTime(startTime);\n this.events.push({ name, attributes, time });\n return this;\n }\n\n setStatus(status: SpanStatus): this {\n this.status = status;\n return this;\n }\n\n updateName(name: string): this {\n this.name = name;\n return this;\n }\n\n end(endTime?: TimeInput): void {\n if (this._ended) {\n return;\n }\n this._ended = true;\n this.endTime = getHrTime(endTime);\n this._duration = hrTimeDuration(this.startTime, this.endTime);\n this.onEnd(this);\n }\n\n isRecording(): boolean {\n return !this._ended;\n }\n\n recordException(exception: Exception, time?: TimeInput): void {\n const attributes = transformExceptionAttributes(exception);\n this.addEvent('exception', attributes, time);\n }\n\n get duration(): HrTime {\n return this._duration;\n }\n\n get ended(): boolean {\n return this._ended;\n }\n\n get droppedAttributesCount(): number {\n return this._droppedAttributesCount;\n }\n\n get droppedEventsCount(): number {\n return this._droppedEventsCount;\n }\n\n get droppedLinksCount(): number {\n return this._droppedLinksCount;\n }\n}\n","/**\n * Lightweight WorkerTracer for edge environments\n */\n\nimport type {\n Attributes,\n Tracer,\n Span,\n SpanKind,\n SpanOptions,\n Context,\n} from '@opentelemetry/api';\nimport {\n context as api_context,\n trace,\n type SpanContext,\n} from '@opentelemetry/api';\nimport { sanitizeAttributes } from '@opentelemetry/core';\nimport type { Resource } from '@opentelemetry/resources';\nimport {\n type SpanProcessor,\n RandomIdGenerator,\n type ReadableSpan,\n SamplingDecision,\n} from '@opentelemetry/sdk-trace-base';\n\nimport { SpanImpl } from './span';\nimport type { TraceFlushableSpanProcessor } from '../types';\n\nconst NewTraceFlags = {\n RANDOM_TRACE_ID_SET: 2,\n RANDOM_TRACE_ID_UNSET: 0,\n} as const;\n\ntype NewTraceFlagValues =\n | typeof NewTraceFlags.RANDOM_TRACE_ID_SET\n | typeof NewTraceFlags.RANDOM_TRACE_ID_UNSET;\n\nconst idGenerator: RandomIdGenerator = new RandomIdGenerator();\n\nlet withNextSpanAttributes: Attributes;\n\nfunction getFlagAt(flagSequence: number, position: number): number {\n return ((flagSequence >> (position - 1)) & 1) * position;\n}\n\n/**\n * WorkerTracer - Lightweight tracer for edge environments\n */\nexport class WorkerTracer implements Tracer {\n private readonly spanProcessors: TraceFlushableSpanProcessor[];\n private readonly resource: Resource;\n private headSampler: any; // Will be set via setHeadSampler\n\n constructor(spanProcessors: SpanProcessor[], resource: Resource) {\n this.spanProcessors = spanProcessors as TraceFlushableSpanProcessor[];\n this.resource = resource;\n }\n\n /**\n * Set the head sampler (called from config)\n */\n setHeadSampler(sampler: any): void {\n this.headSampler = sampler;\n }\n\n /**\n * Force flush spans for a specific trace\n */\n async forceFlush(traceId?: string) {\n const promises = this.spanProcessors.map(async (spanProcessor) => {\n await spanProcessor.forceFlush(traceId);\n });\n await Promise.allSettled(promises);\n }\n\n /**\n * Add extra resource attributes\n */\n addToResource(extra: Resource) {\n this.resource.merge(extra);\n }\n\n /**\n * Start a new span\n */\n startSpan(\n name: string,\n options: SpanOptions = {},\n context = api_context.active(),\n ): Span {\n if (options.root) {\n context = trace.deleteSpan(context);\n }\n\n if (!this.headSampler) {\n throw new Error(\n 'Head sampler not configured. This is a bug in the instrumentation logic',\n );\n }\n\n const parentSpanContext = trace.getSpan(context)?.spanContext();\n const { traceId, randomTraceFlag } = getTraceInfo(parentSpanContext);\n\n const spanKind = options.kind || (0 as SpanKind); // SpanKind.INTERNAL\n const sanitisedAttrs = sanitizeAttributes(options.attributes);\n\n // Use per-span sampler if provided, otherwise use head sampler\n const optionsWithSampler = options as any;\n const sampler = optionsWithSampler.sampler || this.headSampler;\n\n const samplingDecision = sampler.shouldSample(\n context,\n traceId,\n name,\n spanKind,\n sanitisedAttrs,\n [],\n );\n const { decision, traceState, attributes: attrs } = samplingDecision;\n\n const attributes = Object.assign(\n {},\n options.attributes,\n attrs,\n withNextSpanAttributes,\n );\n withNextSpanAttributes = {};\n\n const spanId = idGenerator.generateSpanId();\n const parentSpanId = parentSpanContext?.spanId;\n\n const sampleFlag =\n decision === SamplingDecision.RECORD_AND_SAMPLED ? 1 : 0; // TraceFlags.SAMPLED : TraceFlags.NONE\n const traceFlags = sampleFlag + randomTraceFlag;\n const spanContext: SpanContext = { traceId, spanId, traceFlags, traceState };\n\n const span = new SpanImpl({\n attributes: sanitizeAttributes(attributes),\n name,\n onEnd: (span) => {\n for (const sp of this.spanProcessors) {\n sp.onEnd(span as unknown as ReadableSpan);\n }\n },\n resource: this.resource,\n spanContext,\n parentSpanContext,\n parentSpanId,\n spanKind,\n startTime: options.startTime,\n });\n\n for (const sp of this.spanProcessors) {\n //@ts-ignore - OTel type quirk\n sp.onStart(span, context);\n }\n\n return span;\n }\n\n /**\n * Start an active span (with automatic context management)\n */\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n options: SpanOptions,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n options: SpanOptions,\n context: Context,\n fn: F,\n ): ReturnType<F>;\n startActiveSpan<F extends (span: Span) => ReturnType<F>>(\n name: string,\n ...args: unknown[]\n ): ReturnType<F> {\n const options = args.length > 1 ? (args[0] as SpanOptions) : undefined;\n const parentContext =\n args.length > 2 ? (args[1] as Context) : api_context.active();\n const fn = args.at(-1) as F;\n\n const span = this.startSpan(name, options, parentContext);\n const contextWithSpanSet = trace.setSpan(parentContext, span);\n\n return api_context.with(contextWithSpanSet, fn, undefined, span);\n }\n}\n\n/**\n * Set attributes for the next span created\n */\nexport function withNextSpan(attrs: Attributes) {\n withNextSpanAttributes = Object.assign({}, withNextSpanAttributes, attrs);\n}\n\nfunction getTraceInfo(parentSpanContext?: SpanContext): {\n traceId: string;\n randomTraceFlag: NewTraceFlagValues;\n} {\n if (parentSpanContext && trace.isSpanContextValid(parentSpanContext)) {\n const { traceId, traceFlags } = parentSpanContext;\n return { traceId, randomTraceFlag: getFlagAt(traceFlags, 2) as NewTraceFlagValues };\n } else {\n return {\n traceId: idGenerator.generateTraceId(),\n randomTraceFlag: NewTraceFlags.RANDOM_TRACE_ID_SET,\n };\n }\n}\n","/**\n * AsyncLocalStorage-based context manager for edge environments\n *\n * Copyright The OpenTelemetry Authors\n * Licensed under the Apache License, Version 2.0\n */\n\nimport type { ContextManager, Context } from '@opentelemetry/api';\nimport { ROOT_CONTEXT } from '@opentelemetry/api';\n\n//@ts-ignore - node:async_hooks available in CF Workers with nodejs_compat\nimport { AsyncLocalStorage } from 'node:async_hooks';\n//@ts-ignore\nimport { EventEmitter } from 'node:events';\n\ntype Func<T> = (...args: unknown[]) => T;\n\n/**\n * Store a map for each event of all original listeners and their \"patched\"\n * version. So when a listener is removed by the user, the corresponding\n * patched function will be also removed.\n */\ninterface PatchMap {\n [name: string]: WeakMap<Func<void>, Func<void>>;\n}\n\nconst ADD_LISTENER_METHODS = [\n 'addListener' as const,\n 'on' as const,\n 'once' as const,\n 'prependListener' as const,\n 'prependOnceListener' as const,\n];\n\nabstract class AbstractAsyncHooksContextManager implements ContextManager {\n abstract active(): Context;\n\n abstract with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F>;\n\n abstract enable(): this;\n\n abstract disable(): this;\n\n /**\n * Binds a context to the target function or event emitter\n */\n bind<T>(context: Context, target: T): T {\n if (target instanceof EventEmitter) {\n return this._bindEventEmitter(context, target);\n }\n\n if (typeof target === 'function') {\n return this._bindFunction(context, target);\n }\n return target;\n }\n\n private _bindFunction<T extends Function>(context: Context, target: T): T {\n const manager = this;\n const contextWrapper = function (this: never, ...args: unknown[]) {\n return manager.with(context, () => target.apply(this, args));\n };\n Object.defineProperty(contextWrapper, 'length', {\n enumerable: false,\n configurable: true,\n writable: false,\n value: target.length,\n });\n return contextWrapper as any;\n }\n\n /**\n * By default, EventEmitter calls callbacks with their context, which we do\n * not want. Instead we bind a specific context to all callbacks.\n */\n private _bindEventEmitter<T extends EventEmitter>(\n context: Context,\n ee: T,\n ): T {\n const map = this._getPatchMap(ee);\n if (map !== undefined) return ee;\n this._createPatchMap(ee);\n\n // Patch methods that add a listener to propagate context\n for (const methodName of ADD_LISTENER_METHODS) {\n if (ee[methodName] === undefined) continue;\n ee[methodName] = this._patchAddListener(ee, ee[methodName], context);\n }\n\n // Patch methods that remove a listener\n if (typeof ee.removeListener === 'function') {\n ee.removeListener = this._patchRemoveListener(ee, ee.removeListener);\n }\n if (typeof ee.off === 'function') {\n ee.off = this._patchRemoveListener(ee, ee.off);\n }\n\n // Patch method that removes all listeners\n if (typeof ee.removeAllListeners === 'function') {\n ee.removeAllListeners = this._patchRemoveAllListeners(\n ee,\n ee.removeAllListeners,\n );\n }\n return ee;\n }\n\n private _patchRemoveListener(ee: EventEmitter, original: Function) {\n const contextManager = this;\n return function (this: never, event: string, listener: Func<void>) {\n const events = contextManager._getPatchMap(ee)?.[event];\n if (events === undefined) {\n return original.call(this, event, listener);\n }\n const patchedListener = events.get(listener);\n return original.call(this, event, patchedListener || listener);\n };\n }\n\n private _patchRemoveAllListeners(ee: EventEmitter, original: Function) {\n const contextManager = this;\n return function (this: never, event: string) {\n const map = contextManager._getPatchMap(ee);\n if (map !== undefined) {\n if (arguments.length === 0) {\n contextManager._createPatchMap(ee);\n } else if (map[event] !== undefined) {\n delete map[event];\n }\n }\n return Reflect.apply(original, this, arguments);\n };\n }\n\n private _patchAddListener(\n ee: EventEmitter,\n original: Function,\n context: Context,\n ) {\n const contextManager = this;\n return function (this: never, event: string, listener: Func<void>) {\n /**\n * This check prevents double-wrapping the listener.\n * The implementation for ee.once wraps the listener and calls ee.on.\n * Without this check, we would wrap that wrapped listener.\n */\n if (contextManager._wrapped) {\n return original.call(this, event, listener);\n }\n let map = contextManager._getPatchMap(ee);\n if (map === undefined) {\n map = contextManager._createPatchMap(ee);\n }\n let listeners = map[event];\n if (listeners === undefined) {\n listeners = new WeakMap();\n map[event] = listeners;\n }\n const patchedListener = contextManager.bind(context, listener);\n // Store a weak reference of the user listener to ours\n listeners.set(listener, patchedListener);\n\n contextManager._wrapped = true;\n try {\n return original.call(this, event, patchedListener);\n } finally {\n contextManager._wrapped = false;\n }\n };\n }\n\n private _createPatchMap(ee: EventEmitter): PatchMap {\n const map = Object.create(null);\n (ee as any)[this._kOtListeners] = map;\n return map;\n }\n\n private _getPatchMap(ee: EventEmitter): PatchMap | undefined {\n return (ee as never)[this._kOtListeners];\n }\n\n private readonly _kOtListeners = Symbol('OtListeners');\n private _wrapped = false;\n}\n\n/**\n * AsyncLocalStorage-based context manager for edge runtimes\n */\nexport class AsyncLocalStorageContextManager extends AbstractAsyncHooksContextManager {\n private _asyncLocalStorage: AsyncLocalStorage<Context>;\n\n constructor() {\n super();\n this._asyncLocalStorage = new AsyncLocalStorage();\n }\n\n active(): Context {\n return this._asyncLocalStorage.getStore() ?? ROOT_CONTEXT;\n }\n\n with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(\n context: Context,\n fn: F,\n thisArg?: ThisParameterType<F>,\n ...args: A\n ): ReturnType<F> {\n const cb = thisArg == null ? fn : fn.bind(thisArg);\n return this._asyncLocalStorage.run(context, cb as never, ...args);\n }\n\n enable(): this {\n return this;\n }\n\n disable(): this {\n this._asyncLocalStorage.disable();\n return this;\n }\n}\n","/**\n * Tracer provider for edge environments\n */\n\nimport { trace } from '@opentelemetry/api';\nimport type { Resource } from '@opentelemetry/resources';\nimport type { SpanProcessor, TracerConfig } from '@opentelemetry/sdk-trace-base';\nimport { WorkerTracer } from './tracer';\nimport { AsyncLocalStorageContextManager } from './context';\n\n/**\n * WorkerTracerProvider - Registers tracer globally\n */\nexport class WorkerTracerProvider {\n private tracer: WorkerTracer;\n private contextManager: AsyncLocalStorageContextManager;\n\n constructor(spanProcessors: SpanProcessor[], resource: Resource) {\n this.tracer = new WorkerTracer(spanProcessors, resource);\n this.contextManager = new AsyncLocalStorageContextManager();\n }\n\n /**\n * Get the tracer instance\n */\n getTracer(_name: string, _version?: string, _config?: TracerConfig): WorkerTracer {\n return this.tracer;\n }\n\n /**\n * Register this provider as the global tracer\n */\n register(): void {\n // Enable context manager\n this.contextManager.enable();\n\n // Set tracer provider\n const provider = {\n getTracer: (_name: string, _version?: string) => this.tracer,\n };\n\n // @ts-ignore - OTel types\n trace.setGlobalTracerProvider(provider);\n }\n}\n","/**\n * Buffer polyfill for edge environments\n *\n * Cloudflare Workers and other edge runtimes need the Buffer global\n * for OpenTelemetry OTLP serialization.\n */\n\n//@ts-ignore - node:buffer available in CF Workers with nodejs_compat\nimport { Buffer } from 'node:buffer';\n\n//@ts-ignore\nglobalThis.Buffer = Buffer;\n\n\n\nexport {Buffer} from 'node:buffer';","/**\n * Functional API for autotel-edge\n *\n * Provides zero-boilerplate tracing helpers that mirror the Node.js runtime\n * implementation while staying optimized for edge environments.\n */\n\nimport {\n trace as otelTrace,\n SpanStatusCode,\n type Span,\n type AttributeValue,\n} from '@opentelemetry/api';\nimport type { Sampler } from '@opentelemetry/sdk-trace-base';\nimport type { TraceContext } from './core/trace-context';\nimport { createTraceContext, setSpanName } from './core/trace-context';\n\n// Re-export for convenience\nexport type { TraceContext } from './core/trace-context';\n\ntype AnyFn = (...args: any[]) => any;\n\nconst TRACE_FACTORY_MARK = '__autotelEdgeTraceFactory';\nconst INSTRUMENTED_MARK = '__autotelEdgeInstrumented';\nconst FACTORY_NAME_HINTS: Record<string, true> = {\n ctx: true,\n _ctx: true,\n context: true,\n tracecontext: true,\n tracectx: true,\n};\n\nconst SINGLE_LINE_COMMENT_REGEX = /\\/\\/.*$/gm;\nconst MULTI_LINE_COMMENT_REGEX = /\\/\\*[\\s\\S]*?\\*\\//gm;\nconst PARAM_TOKEN_SANITIZE_REGEX = new RegExp(String.raw`[{}\\[\\]\\s]`, 'g');\n\ninterface TraceFactoryMarked {\n [TRACE_FACTORY_MARK]?: true;\n}\n\nfunction markAsTraceFactory(fn: AnyFn): void {\n try {\n Object.defineProperty(fn, TRACE_FACTORY_MARK, {\n value: true,\n configurable: true,\n });\n } catch {\n (fn as TraceFactoryMarked)[TRACE_FACTORY_MARK] = true;\n }\n}\n\nfunction hasFactoryMark(fn: AnyFn): boolean {\n return Boolean((fn as TraceFactoryMarked)[TRACE_FACTORY_MARK]);\n}\n\nfunction sanitizeParameterToken(token: string): string {\n const [firstToken] = token.split('=');\n return (firstToken ?? '').replaceAll(PARAM_TOKEN_SANITIZE_REGEX, '').trim();\n}\n\nfunction getFirstParameterToken(fn: AnyFn): string | null {\n let source = Function.prototype.toString.call(fn);\n source = source\n .replaceAll(MULTI_LINE_COMMENT_REGEX, '')\n .replaceAll(SINGLE_LINE_COMMENT_REGEX, '')\n .trim();\n\n const arrowMatch = source.match(/^(?:async\\s*)?(?:\\(([^)]*)\\)|([^=()]+))\\s*=>/);\n if (arrowMatch) {\n const params = (arrowMatch[1] ?? arrowMatch[2] ?? '').split(',');\n const first = params[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n return null;\n }\n\n const functionMatch = source.match(/^[^(]*\\(([^)]*)\\)/);\n if (functionMatch) {\n const params = functionMatch[1]?.split(',');\n const first = params?.[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n }\n\n return null;\n}\n\nfunction looksLikeTraceFactory(fn: AnyFn): boolean {\n if (hasFactoryMark(fn)) {\n return true;\n }\n\n if (fn.length === 0) {\n return false;\n }\n\n const firstParam = getFirstParameterToken(fn);\n if (!firstParam) {\n return false;\n }\n\n const normalized = firstParam.toLowerCase();\n if (\n Object.hasOwn(FACTORY_NAME_HINTS, normalized) ||\n normalized.startsWith('ctx') ||\n normalized.startsWith('_ctx') ||\n normalized.startsWith('trace')\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if a function that takes ctx returns another function (factory pattern)\n * vs returning a value directly (immediate execution pattern)\n */\nfunction isFactoryReturningFunction(\n fnWithCtx: (ctx: TraceContext) => unknown,\n): boolean {\n try {\n const result = fnWithCtx(createDummyCtx());\n return typeof result === 'function';\n } catch {\n // If the function throws when called with dummy ctx, assume it's immediate execution\n // since factory functions typically just return a function and don't execute logic\n return false;\n }\n}\n\nfunction isTraceFactoryFunction<TArgs extends any[], TReturn>(\n fn:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): fn is (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (typeof fn !== 'function') {\n return false;\n }\n\n if (hasFactoryMark(fn as AnyFn)) {\n return true;\n }\n\n if (looksLikeTraceFactory(fn as AnyFn)) {\n markAsTraceFactory(fn as AnyFn);\n return true;\n }\n\n return false;\n}\n\nfunction ensureTraceFactory<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (isTraceFactoryFunction(fnOrFactory)) {\n return fnOrFactory;\n }\n\n const plainFn = fnOrFactory as (...args: TArgs) => TReturn | Promise<TReturn>;\n const factory = (ctx: TraceContext) => {\n void ctx;\n return plainFn;\n };\n markAsTraceFactory(factory);\n return factory;\n}\n\ntype ExtractFunctionSignature<T> = T extends (ctx: TraceContext) => infer F\n ? F extends (...args: infer Args) => infer Return\n ? (...args: Args) => Return\n : never\n : never;\n\ntype WrappedFunction<TArgs extends any[], TReturn> = (...args: TArgs) => TReturn | Promise<TReturn>;\n\n/**\n * trace function options\n */\nexport interface traceOptions<TArgs extends any[] = any[], TReturn = any> {\n name?: string;\n serviceName?: string;\n sampler?: Sampler;\n attributesFromArgs?: (args: TArgs) => Record<string, unknown>;\n attributesFromResult?: (result: TReturn) => Record<string, unknown>;\n attributes?: Record<string, unknown>;\n}\n\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\nfunction createDummyCtx(): TraceContext {\n return {\n traceId: '',\n spanId: '',\n correlationId: '',\n setAttribute: () => {},\n setAttributes: () => {},\n setStatus: () => {},\n recordException: () => {},\n addEvent: () => {},\n addLink: () => {},\n addLinks: () => {},\n updateName: () => {},\n isRecording: () => false,\n } as TraceContext;\n}\n\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\ntype InstrumentableFunction<TArgs extends any[] = any[], TReturn = any> = ((\n ...args: TArgs\n) => TReturn | Promise<TReturn>) & {\n displayName?: string;\n name?: string;\n};\n\nfunction inferFunctionName<TArgs extends any[] = any[], TReturn = any>(\n fn: InstrumentableFunction<TArgs, TReturn>,\n): string | undefined {\n const displayName = (fn as { displayName?: string }).displayName;\n if (displayName) {\n return displayName;\n }\n\n if (fn.name && fn.name !== 'anonymous') {\n return fn.name;\n }\n\n const source = Function.prototype.toString.call(fn);\n const match = source.match(/function\\s+([^(\\s]+)/);\n if (match && match[1] && match[1] !== 'anonymous') {\n return match[1];\n }\n\n return undefined;\n}\n\nfunction getSpanName<TArgs extends any[], TReturn>(\n options: traceOptions<TArgs, TReturn>,\n fn: InstrumentableFunction<TArgs, TReturn>,\n variableName?: string,\n): string {\n if (options.name) {\n return options.name;\n }\n\n let fnName = variableName ?? inferFunctionName(fn);\n fnName = fnName || 'anonymous';\n\n if (options.serviceName) {\n return `${options.serviceName}.${fnName}`;\n }\n\n if (fnName && fnName !== 'anonymous') {\n return fnName;\n }\n\n return 'unknown';\n}\n\nfunction isAsyncFunction(fn: unknown): boolean {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n\nfunction wrapWithTracingAsync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => Promise<TReturn> {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = async function wrappedFunction(this: unknown, ...args: TArgs): Promise<TReturn> {\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, async (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = await actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_MARK] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapWithTracingSync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => TReturn {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = function wrappedFunction(this: unknown, ...args: TArgs): TReturn {\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result as TReturn);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_MARK] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapFactoryWithTracing<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const factory = ensureTraceFactory(fnOrFactory);\n const sampleFn = factory(createDummyCtx());\n const useAsyncWrapper = isAsyncFunction(sampleFn);\n\n if (useAsyncWrapper) {\n return wrapWithTracingAsync(\n factory as (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n }\n\n return wrapWithTracingSync(\n factory as (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Execute a function immediately within a trace span\n * Used for the immediate execution pattern: trace((ctx) => result)\n */\nfunction executeImmediately<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn | Promise<TReturn>,\n options: traceOptions<any[], any>,\n): TReturn | Promise<TReturn> {\n const tracer = otelTrace.getTracer('@autotel/edge');\n const spanName = options.name || 'anonymous';\n\n return tracer.startActiveSpan(spanName, (span) => {\n try {\n setSpanName(span, spanName);\n const ctxValue = createTraceContext(span);\n\n const onSuccess = (result: TReturn) => {\n span.setStatus({ code: SpanStatusCode.OK });\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value as AttributeValue);\n }\n }\n span.end();\n return result;\n };\n\n const onError = (error: unknown): never => {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.type',\n error instanceof Error ? error.constructor.name : 'Error');\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n };\n\n const result = fn(ctxValue);\n\n // Check if result is a Promise\n if (result instanceof Promise) {\n return result.then(onSuccess, onError);\n }\n\n return onSuccess(result);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n }\n });\n}\n\n// Sync overloads - Factory pattern with explicit return type helps TypeScript infer\n// Overload 1a: Plain sync function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => TReturn,\n): () => TReturn;\n// Overload 1b: Plain sync function (auto-inferred name)\nexport function trace<TArgs extends any[], TReturn = any>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 1c: Factory sync function with no args returning explicit type (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => TReturn,\n): () => TReturn;\n// Overload 1d: Immediate execution - sync function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n// Overload 1e: Factory sync function - use conditional type to extract signature (MUST come before generic)\n// This overload is more specific and helps TypeScript infer types from factory functions\nexport function trace<TFactory extends (ctx: TraceContext) => (...args: any[]) => any>(\n fnFactory: TFactory,\n): ExtractFunctionSignature<TFactory>;\n// Overload 1f: Generic factory sync function (fallback)\nexport function trace<TArgs extends any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2a: Name + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2b: Name + immediate execution sync with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 2c: Name + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3a: Options + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3b: Options + immediate execution sync with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 3c: Options + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Async overloads\n// Overload 4a: Plain async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4b: Plain async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 4c: Immediate execution - async function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n// Overload 4d: Factory async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4e: Factory async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5a: Name + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5b: Name + immediate execution async with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 5c: Name + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6a: Options + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6b: Options + immediate execution async with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 6c: Options + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Implementation\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnOrNameOrOptions:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>)\n | string\n | traceOptions<TArgs, TReturn>,\n maybeFn?:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>),\n): WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn> {\n // Handle: trace(fn) - single argument\n if (typeof fnOrNameOrOptions === 'function') {\n // Check if it's immediate execution pattern: (ctx) => result\n if (\n looksLikeTraceFactory(fnOrNameOrOptions as AnyFn) &&\n !isFactoryReturningFunction(fnOrNameOrOptions as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern\n return executeImmediately(\n fnOrNameOrOptions as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n {},\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n // Factory pattern or plain function\n return wrapFactoryWithTracing(\n fnOrNameOrOptions as (...args: TArgs) => TReturn,\n {} as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(name, fn) or trace(options, fn) - two arguments\n if (typeof fnOrNameOrOptions === 'string') {\n if (!maybeFn) {\n throw new Error('trace(name, fn): fn is required');\n }\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with name\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n { name: fnOrNameOrOptions },\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n { name: fnOrNameOrOptions } as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(options, fn)\n if (!maybeFn) {\n throw new Error('trace(options, fn): fn is required');\n }\n\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with options\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n fnOrNameOrOptions as traceOptions<any[], any>,\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n fnOrNameOrOptions as traceOptions<TArgs, TReturn>,\n );\n}\n\nexport function withTracing<TArgs extends any[] = any[], TReturn = any>(\n options: Omit<traceOptions<TArgs, TReturn>, 'name'>,\n) {\n return (\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>)\n ): WrappedFunction<TArgs, TReturn> => wrapFactoryWithTracing(fnOrFactory, options as traceOptions<TArgs, TReturn>);\n}\n\nfunction shouldSkip(key: string, fn: Function, skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[]): boolean {\n if (key.startsWith('_')) {\n return true;\n }\n\n if (!skip || skip.length === 0) {\n return false;\n }\n\n for (const pattern of skip) {\n if (typeof pattern === 'string' && key === pattern) {\n return true;\n }\n if (pattern instanceof RegExp && pattern.test(key)) {\n return true;\n }\n if (typeof pattern === 'function' && pattern(key, fn)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport interface InstrumentOptions extends traceOptions {\n functions: Record<string, any>;\n overrides?: Record<string, Partial<traceOptions>>;\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[];\n}\n\nexport function instrument<T extends Record<string, any>>(\n options: InstrumentOptions,\n): T {\n const { functions, ...tracingOptions } = options;\n const instrumented: Record<string, any> = {};\n\n for (const key of Object.keys(functions)) {\n const fn = functions[key];\n\n if (typeof fn !== 'function') {\n instrumented[key] = fn;\n continue;\n }\n\n if (shouldSkip(key, fn, tracingOptions.skip)) {\n instrumented[key] = fn;\n continue;\n }\n\n const fnOptions: traceOptions = {\n ...tracingOptions,\n ...tracingOptions.overrides?.[key],\n name: tracingOptions.overrides?.[key]?.name ?? tracingOptions.name,\n };\n\n const boundFn = fn.bind(functions);\n const fnFactory = (_ctx: TraceContext) => boundFn as AnyFn;\n\n instrumented[key] = wrapFactoryWithTracing(fnFactory, fnOptions, key);\n }\n\n return instrumented as T;\n}\n\nexport interface SpanOptions {\n name: string;\n attributes?: Record<string, string | number | boolean>;\n}\n\n// Aligned with trace(): accept a name string OR full SpanOptions as the first\n// argument so span() and trace() share the same calling conventions.\nexport function span<T = unknown>(name: string, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n name: string,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(options: SpanOptions, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(\n nameOrOptions: string | SpanOptions,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n const options: SpanOptions =\n typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions;\n const tracer = otelTrace.getTracer('autotel-edge');\n\n const execute = (span: Span) => {\n setSpanName(span, options.name);\n\n try {\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value);\n }\n }\n\n const result = fn(span);\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return value;\n })\n .catch((error) => {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n });\n }\n\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n };\n\n const result = tracer.startActiveSpan(options.name, execute);\n\n if (result instanceof Promise) {\n return result;\n }\n\n return result as T;\n}\n","/**\n * Composition helpers for building autotel pipelines from small, testable parts.\n *\n * The motivation is the same as for any pipeline library: you can author\n * subscribers, post-processors and span processors as standalone units and\n * stitch them together at config-construction time without inventing ad-hoc\n * wrappers in every package.\n *\n * None of these helpers change runtime behaviour by themselves — they only\n * combine functions / processors that already work in isolation.\n */\nimport type { Span } from '@opentelemetry/api';\nimport type { ReadableSpan as SdkReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type {\n EdgeConfig,\n EdgeEvent,\n EdgeSubscriber,\n PostProcessorFn,\n ReadableSpan as EdgeReadableSpan,\n ResolveConfigFn,\n} from './types';\n\ntype Awaitable<T> = T | Promise<T>;\n\n/**\n * Identity helper for authoring an autotel configuration once with full\n * type-checking. Mirrors `defineConfig` patterns in tools like Vite / Vitest.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'autotel-edge'\n *\n * export const otelConfig = defineConfig({\n * service: { name: 'checkout' },\n * exporter: { url: process.env.OTLP_URL! },\n * })\n * ```\n */\nexport function defineConfig<T extends EdgeConfig | ResolveConfigFn>(config: T): T {\n return config;\n}\n\n/**\n * Run a list of subscribers in registration order. Errors thrown by an\n * individual subscriber are caught and logged so a buggy subscriber never\n * blocks the others — important because `subscribers` is the primary\n * extensibility point for in-process side effects.\n */\nexport function composeSubscribers(\n subscribers: Array<EdgeSubscriber>,\n options: { name?: string } = {},\n): EdgeSubscriber {\n const label = options.name ?? 'compose-subscribers';\n return async (event: EdgeEvent) => {\n for (const subscriber of subscribers) {\n try {\n await subscriber(event);\n } catch (err) {\n console.error(`[autotel-edge/${label}] subscriber failed:`, err);\n }\n }\n };\n}\n\n/**\n * Chain post-processors so each one sees the output of the previous one.\n * This matches the standard OTel post-processor contract: take spans, return\n * spans (possibly filtered, redacted, or annotated).\n */\nexport function composePostProcessors(\n processors: Array<PostProcessorFn>,\n): PostProcessorFn {\n return (spans: EdgeReadableSpan[]) => {\n let current = spans;\n for (const processor of processors) {\n try {\n current = processor(current);\n } catch (err) {\n console.error('[autotel-edge/compose-post-processors] failed:', err);\n }\n }\n return current;\n };\n}\n\n/**\n * Fan out span lifecycle events to multiple span processors. Any single\n * processor's failure is isolated so it cannot break the others.\n *\n * Useful when you want to attach, say, a sampling processor + a custom\n * attribute redactor + the default batch processor without having to author a\n * single processor that knows about all three.\n */\nexport function composeSpanProcessors(processors: SpanProcessor[]): SpanProcessor {\n const safe = (label: string, fn: () => Awaitable<void>) =>\n Promise.resolve()\n .then(fn)\n .catch((err) => {\n console.error(`[autotel-edge/compose-span-processors:${label}]`, err);\n });\n\n return {\n onStart(span: Span, parentContext) {\n for (const processor of processors) {\n try {\n processor.onStart(span as unknown as SdkReadableSpan & Span, parentContext);\n } catch (err) {\n console.error('[autotel-edge/compose-span-processors:onStart]', err);\n }\n }\n },\n onEnd(span: SdkReadableSpan) {\n for (const processor of processors) {\n try {\n processor.onEnd(span);\n } catch (err) {\n console.error('[autotel-edge/compose-span-processors:onEnd]', err);\n }\n }\n },\n async forceFlush() {\n await Promise.allSettled(\n processors.map((p) => safe('forceFlush', () => p.forceFlush())),\n );\n },\n async shutdown() {\n await Promise.allSettled(\n processors.map((p) => safe('shutdown', () => p.shutdown())),\n );\n },\n } as SpanProcessor;\n}\n","export type Awaitable<T> = T | Promise<T>;\n\nexport interface PluginHookContexts<\n TSetup = unknown,\n TEnrich = unknown,\n TDrain = unknown,\n TKeep = unknown,\n TRequestStart = unknown,\n TRequestFinish = unknown,\n TClientLog = unknown,\n TLogger = unknown,\n> {\n setup: TSetup;\n enrich: TEnrich;\n drain: TDrain;\n keep: TKeep;\n requestStart: TRequestStart;\n requestFinish: TRequestFinish;\n clientLog: TClientLog;\n logger: TLogger;\n}\n\nexport type DefaultPluginContexts = PluginHookContexts;\n\nexport interface EdgePlugin<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n> {\n name: string;\n setup?: (ctx: Ctx['setup']) => Awaitable<void>;\n enrich?: (ctx: Ctx['enrich']) => Awaitable<void>;\n drain?: (ctx: Ctx['drain']) => Awaitable<void>;\n keep?: (ctx: Ctx['keep']) => Awaitable<void>;\n onRequestStart?: (ctx: Ctx['requestStart']) => void;\n onRequestFinish?: (ctx: Ctx['requestFinish']) => void;\n onClientLog?: (ctx: Ctx['clientLog']) => void;\n extendLogger?: (logger: Ctx['logger']) => void;\n}\n\nexport interface PluginRunner<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n> {\n readonly plugins: readonly EdgePlugin<Ctx>[];\n readonly hasEnrich: boolean;\n readonly hasDrain: boolean;\n readonly hasKeep: boolean;\n readonly hasRequestLifecycle: boolean;\n readonly hasClientLog: boolean;\n readonly hasExtendLogger: boolean;\n applyExtendLogger: (logger: Ctx['logger']) => void;\n runOnRequestStart: (ctx: Ctx['requestStart']) => void;\n runOnRequestFinish: (ctx: Ctx['requestFinish']) => void;\n runOnClientLog: (ctx: Ctx['clientLog']) => void;\n runSetup: (ctx: Ctx['setup']) => Promise<void>;\n runEnrich: (ctx: Ctx['enrich']) => Promise<void>;\n runDrain: (ctx: Ctx['drain']) => Promise<void>;\n runKeep: (ctx: Ctx['keep']) => Promise<void>;\n}\n\nexport interface PluginRunnerOptions {\n logger?: Pick<Console, 'error'>;\n}\n\nfunction logPluginError(\n logger: Pick<Console, 'error'>,\n name: string,\n hook: string,\n error: unknown,\n): void {\n logger.error(`[autotel-edge/${name}] ${hook} failed:`, error);\n}\n\nexport function definePlugin<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n>(plugin: EdgePlugin<Ctx>): EdgePlugin<Ctx> {\n return plugin;\n}\n\nexport function createPluginRunner<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n>(\n plugins: EdgePlugin<Ctx>[] = [],\n options: PluginRunnerOptions = {},\n): PluginRunner<Ctx> {\n const errorLogger = options.logger ?? console;\n const byName = new Map<string, EdgePlugin<Ctx>>();\n\n // De-duplicate by plugin name while preserving registration order semantics.\n // The last plugin with a given name wins.\n for (const plugin of plugins) {\n byName.set(plugin.name, plugin);\n }\n\n const list = Array.from(byName.values());\n\n const hasEnrich = list.some((p) => typeof p.enrich === 'function');\n const hasDrain = list.some((p) => typeof p.drain === 'function');\n const hasKeep = list.some((p) => typeof p.keep === 'function');\n const hasRequestLifecycle = list.some(\n (p) =>\n typeof p.onRequestStart === 'function' ||\n typeof p.onRequestFinish === 'function',\n );\n const hasClientLog = list.some((p) => typeof p.onClientLog === 'function');\n const hasExtendLogger = list.some(\n (p) => typeof p.extendLogger === 'function',\n );\n\n return {\n plugins: list,\n hasEnrich,\n hasDrain,\n hasKeep,\n hasRequestLifecycle,\n hasClientLog,\n hasExtendLogger,\n\n applyExtendLogger(logger) {\n for (const plugin of list) {\n if (!plugin.extendLogger) continue;\n try {\n plugin.extendLogger(logger);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'extendLogger', err);\n }\n }\n },\n\n runOnRequestStart(ctx) {\n for (const plugin of list) {\n if (!plugin.onRequestStart) continue;\n try {\n plugin.onRequestStart(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onRequestStart', err);\n }\n }\n },\n\n runOnRequestFinish(ctx) {\n for (const plugin of list) {\n if (!plugin.onRequestFinish) continue;\n try {\n plugin.onRequestFinish(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onRequestFinish', err);\n }\n }\n },\n\n runOnClientLog(ctx) {\n for (const plugin of list) {\n if (!plugin.onClientLog) continue;\n try {\n plugin.onClientLog(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onClientLog', err);\n }\n }\n },\n\n async runSetup(ctx) {\n for (const plugin of list) {\n if (!plugin.setup) continue;\n try {\n await plugin.setup(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'setup', err);\n }\n }\n },\n\n async runEnrich(ctx) {\n for (const plugin of list) {\n if (!plugin.enrich) continue;\n try {\n await plugin.enrich(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'enrich', err);\n }\n }\n },\n\n async runDrain(ctx) {\n const drains = list.filter((p) => typeof p.drain === 'function');\n if (drains.length === 0) return;\n\n await Promise.allSettled(\n drains.map(async (plugin) => {\n try {\n await plugin.drain!(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'drain', err);\n }\n }),\n );\n },\n\n async runKeep(ctx) {\n for (const plugin of list) {\n if (!plugin.keep) continue;\n try {\n await plugin.keep(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'keep', err);\n }\n }\n },\n };\n}\n\nconst emptyRunner = createPluginRunner([]);\n\nexport function getEmptyPluginRunner(): PluginRunner {\n return emptyRunner;\n}\n","import type { RouteServiceConfig } from './types';\n\nexport type Awaitable<T> = T | Promise<T>;\n\nexport function matchesRoutePattern(path: string, pattern: string): boolean {\n const regexPattern = pattern\n .replaceAll(/[.+^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n .replaceAll('**', '{{GLOBSTAR}}')\n .replaceAll('*', '[^/]*')\n .replaceAll('{{GLOBSTAR}}', '.*')\n .replaceAll('?', '[^/]');\n return new RegExp(`^${regexPattern}$`).test(path);\n}\n\nexport interface RouteFilterOptions {\n include?: string[];\n exclude?: string[];\n}\n\nexport function shouldInstrumentPath(\n path: string,\n options: RouteFilterOptions = {},\n): boolean {\n const { include, exclude } = options;\n\n if (exclude && exclude.some((pattern) => matchesRoutePattern(path, pattern))) {\n return false;\n }\n\n if (!include || include.length === 0) {\n return true;\n }\n\n return include.some((pattern) => matchesRoutePattern(path, pattern));\n}\n\nexport function getServiceForPath(\n path: string,\n routes?: Record<string, RouteServiceConfig>,\n): string | undefined {\n if (!routes) return undefined;\n\n for (const [pattern, config] of Object.entries(routes)) {\n if (matchesRoutePattern(path, pattern)) {\n return config.service;\n }\n }\n\n return undefined;\n}\n\nexport interface MiddlewareFinishContext<TEvent, TRequest = unknown> {\n event: TEvent;\n request: TRequest;\n status?: number;\n}\n\nexport interface MiddlewarePipelineOptions<TEvent, TRequest = unknown> {\n enrichers?: Array<\n (ctx: MiddlewareFinishContext<TEvent, TRequest>) => Awaitable<void>\n >;\n drains?: Array<\n (ctx: MiddlewareFinishContext<TEvent, TRequest>) => Awaitable<void>\n >;\n logger?: Pick<Console, 'error'>;\n}\n\nexport async function runMiddlewareFinishPipeline<TEvent, TRequest = unknown>(\n ctx: MiddlewareFinishContext<TEvent, TRequest>,\n options: MiddlewarePipelineOptions<TEvent, TRequest> = {},\n): Promise<void> {\n const logger = options.logger ?? console;\n\n for (const enrich of options.enrichers ?? []) {\n try {\n await enrich(ctx);\n } catch (err) {\n logger.error('[autotel-edge/middleware] enricher failed:', err);\n }\n }\n\n const drains = options.drains ?? [];\n if (drains.length === 0) return;\n\n await Promise.allSettled(\n drains.map(async (drain) => {\n try {\n await drain(ctx);\n } catch (err) {\n logger.error('[autotel-edge/middleware] drain failed:', err);\n }\n }),\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-edge",
3
- "version": "3.16.8",
3
+ "version": "3.16.9",
4
4
  "description": "Vendor-agnostic OpenTelemetry for edge runtimes - foundation for Cloudflare, Vercel, Netlify, Deno",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -592,6 +592,18 @@ describe('Functional API', () => {
592
592
  expect(value).toBe(7);
593
593
  expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: SpanStatusCode.OK });
594
594
  });
595
+
596
+ it('should accept a string name as first argument (sync)', () => {
597
+ const value = span('sync-name-shorthand', () => 11);
598
+ expect(value).toBe(11);
599
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: SpanStatusCode.OK });
600
+ });
601
+
602
+ it('should accept a string name as first argument (async)', async () => {
603
+ const value = await span('async-name-shorthand', async () => 13);
604
+ expect(value).toBe(13);
605
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({ code: SpanStatusCode.OK });
606
+ });
595
607
  });
596
608
 
597
609
  describe('Immediate execution pattern', () => {
package/src/functional.ts CHANGED
@@ -786,15 +786,24 @@ export interface SpanOptions {
786
786
  attributes?: Record<string, string | number | boolean>;
787
787
  }
788
788
 
789
+ // Aligned with trace(): accept a name string OR full SpanOptions as the first
790
+ // argument so span() and trace() share the same calling conventions.
791
+ export function span<T = unknown>(name: string, fn: (span: Span) => T): T;
792
+ export function span<T = unknown>(
793
+ name: string,
794
+ fn: (span: Span) => Promise<T>,
795
+ ): Promise<T>;
789
796
  export function span<T = unknown>(options: SpanOptions, fn: (span: Span) => T): T;
790
797
  export function span<T = unknown>(
791
798
  options: SpanOptions,
792
799
  fn: (span: Span) => Promise<T>,
793
800
  ): Promise<T>;
794
801
  export function span<T = unknown>(
795
- options: SpanOptions,
802
+ nameOrOptions: string | SpanOptions,
796
803
  fn: (span: Span) => T | Promise<T>,
797
804
  ): T | Promise<T> {
805
+ const options: SpanOptions =
806
+ typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions;
798
807
  const tracer = otelTrace.getTracer('autotel-edge');
799
808
 
800
809
  const execute = (span: Span) => {