autotel-edge 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-CKI7KVQX.js → chunk-EVHQ3RLD.js} +3 -3
- package/dist/{chunk-CKI7KVQX.js.map → chunk-EVHQ3RLD.js.map} +1 -1
- package/dist/events.js +1 -1
- package/dist/index.d.ts +17 -3
- package/dist/index.js +17 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/core/trace-context.ts +33 -4
- package/src/functional.test.ts +114 -1
- package/src/functional.ts +5 -0
|
@@ -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.
|
|
8
|
+
var PACKAGE_VERSION = "3.2.0";
|
|
9
9
|
var defaultHeaders = {
|
|
10
10
|
accept: "application/json",
|
|
11
11
|
"content-type": "application/json",
|
|
@@ -305,5 +305,5 @@ function createInitialiser(config) {
|
|
|
305
305
|
}
|
|
306
306
|
|
|
307
307
|
export { OTLPExporter, createInitialiser, getActiveConfig, parseConfig, setConfig };
|
|
308
|
-
//# sourceMappingURL=chunk-
|
|
309
|
-
//# sourceMappingURL=chunk-
|
|
308
|
+
//# sourceMappingURL=chunk-EVHQ3RLD.js.map
|
|
309
|
+
//# sourceMappingURL=chunk-EVHQ3RLD.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-CKI7KVQX.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.AUTOLEMETRY_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 | 'do-alarm'\n | unknown;\n\nexport interface DOConstructorTrigger {\n id: string;\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 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\nexport interface HandlerConfig {\n fetch?: FetchHandlerConfig;\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}\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 * 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 };\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":";;;;;;;AAiBA,IAAM,eAAA,GAAkB,OAAA;AAExB,IAAM,cAAA,GAAyC;AAAA,EAC7C,MAAA,EAAQ,kBAAA;AAAA,EACR,cAAA,EAAgB,kBAAA;AAAA,EAChB,YAAA,EAAc,iBAAiB,eAAe,CAAA;AAChD,CAAA;AAKO,IAAM,eAAN,MAA2C;AAAA,EACxC,OAAA;AAAA,EACA,GAAA;AAAA,EAER,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAClB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,cAAA,EAAgB,OAAO,OAAO,CAAA;AAAA,EACjE;AAAA,EAEA,MAAA,CAAO,OAAc,cAAA,EAAsD;AACzE,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CACf,IAAA,CAAK,MAAM;AACV,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,gBAAA,CAAiB,OAAA,EAAS,CAAA;AAAA,IACnD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IACzD,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,QAAQ,KAAA,EAAgC;AAC9C,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC5C,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA;AAAA,MAClC,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,IAAA,CACE,KAAA,EACA,SAAA,EACA,OAAA,EACM;AACN,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,aAAA,GAAgB,mBAAA,CAAoB,gBAAA,CAAiB,KAAK,CAAA;AAEhE,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA;AACzC,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,IAAA,CAAK,OAAA;AAAA,MACd;AAAA,KACF;AAEA,IAAA,KAAA,CAAM,KAAK,GAAA,EAAK,MAAM,CAAA,CACnB,IAAA,CAAK,CAAC,QAAA,KAAa;AAClB,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,SAAA,EAAU;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,OAAA;AAAA,UACE,IAAI,iBAAA;AAAA,YACF,CAAA,gCAAA,EAAmC,SAAS,MAAM,CAAA;AAAA;AACpD,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,MAAA,OAAA;AAAA,QACE,IAAI,iBAAA;AAAA,UACF,CAAA,yBAAA,EAA4B,KAAA,CAAM,QAAA,EAAU,CAAA,CAAA;AAAA,UAC5C,KAAA,CAAM,IAAA;AAAA,UACN,KAAA,CAAM;AAAA;AACR,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,QAAA,GAA0B;AAAA,EAEhC;AACF;;;ACwGO,SAAS,sBACd,MAAA,EACoC;AACpC,EAAA,OAAO,CAAC,CAAE,MAAA,CAAoC,cAAA;AAChD;;;AC9LO,IAAM,yBAAN,MAAsD;AAAA,EACnD,QAAA;AAAA,EACA,aAAA;AAAA,EACA,KAAA,uBAAyC,GAAA,EAAI;AAAA,EAErD,WAAA,CAAY,UAAwB,aAAA,EAAiC;AACnE,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA,EAEA,OAAA,CAAQ,OAAa,cAAA,EAA+B;AAAA,EAEpD;AAAA,EAEA,MAAM,IAAA,EAA0B;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA;AAEnC,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,CAAG,KAAK,IAAI,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAA,EAAiC;AAChD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AACpC,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAA,CAAK,YAAY,KAAK,CAAA;AAC5B,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,WAA4B,EAAC;AACnC,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AAC9C,QAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AACrC,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,MACtB;AACA,MAAA,MAAM,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAA,CAAK,SAAS,QAAA,EAAS;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,YAAY,KAAA,EAAsC;AAC9D,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,IAAA,IAAI,cAAA,GAAiB,KAAA;AAErB,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAI;AACF,QAAA,cAAA,GAAiB,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAE3D,QAAA,cAAA,GAAiB,KAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,cAAA,EAAgB,CAAC,MAAA,KAAW;AAC/C,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AAErB,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA,MAAO;AAEL,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,gCAAA;AAAA,YACA,MAAA,CAAO,OAAO,OAAA,IAAW;AAAA,WAC3B;AACA,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACF,CAAA;AAKO,IAAM,4BAAN,MAAyD;AAAA,EACtD,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA,uBAAsC,GAAA,EAAI;AAAA,EAElD,WAAA,CACE,QAAA,EACA,aAAA,EACA,WAAA,EACA;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,sBAAA,CAAuB,QAAA,EAAU,aAAa,CAAA;AACjE,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EAEA,OAAA,CAAQ,MAAY,aAAA,EAA8B;AAChD,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,aAAa,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,IAAA,EAA0B;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,EAAY,CAAE,MAAA;AAClC,IAAA,MAAM,YAAA,GAAe,cAAA,IAAkB,IAAA,GAAO,IAAA,CAAK,YAAA,GAAe,MAAA;AAGlE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,MAAA,CAAO,IAAI,OAAA,EAAS;AAAA,QACvB,OAAA;AAAA,QACA,OAAO,EAAC;AAAA,QACR,aAAA,EAAe;AAAA;AAAA,OAChB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAMrC,IAAA,MAAM,cAAA,GAAiB,YAAA,IACC,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,OAAK,CAAA,CAAE,WAAA,EAAY,CAAE,MAAA,KAAW,YAAY,CAAA;AAGrF,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,KAAA,CAAM,aAAA,GAAgB,IAAA;AAAA,IACxB;AAEA,IAAA,KAAA,CAAM,KAAA,CAAM,KAAK,IAAI,CAAA;AAKrB,IAAA,MAAM,mBAAmB,CAAC,YAAA;AAC1B,IAAA,MAAM,eAAA,GAAkB,oBAAoB,KAAA,CAAM,aAAA,IACzB,MAAM,aAAA,CAAc,WAAA,GAAc,MAAA,KAAW,MAAA;AAEtE,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAEzC,QAAA,IAAI,UAAA,EAAY;AAEd,UAAA,KAAA,MAAW,YAAA,IAAgB,MAAM,KAAA,EAAO;AACtC,YAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,YAAY,CAAA;AAAA,UACjC;AAEA,UAAA,KAAK,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAAA,QACtC;AAAA,MAEF,CAAA,MAAO;AAEL,QAAA,KAAA,MAAW,YAAA,IAAgB,MAAM,KAAA,EAAO;AACtC,UAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,YAAY,CAAA;AAAA,QACjC;AAEA,QAAA,KAAK,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAAA,MACtC;AAGA,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,IAC5B;AAAA,EAEF;AAAA,EAEA,MAAM,WAAW,OAAA,EAAiC;AAChD,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,MAAA,IAAI,KAAA,EAAO;AAGT,QAAA,IAAI,CAAC,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,EAAG;AAClD,UAAA,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAAA,QACrC;AAEA,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAEzC,UAAA,IAAI,UAAA,EAAY;AAEd,YAAA,KAAA,MAAW,YAAA,IAAgB,MAAM,KAAA,EAAO;AACtC,cAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,YAAY,CAAA;AAAA,YACjC;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,KAAA,MAAW,YAAA,IAAgB,MAAM,KAAA,EAAO;AACtC,YAAA,IAAA,CAAK,OAAA,CAAQ,MAAM,YAAY,CAAA;AAAA,UACjC;AAAA,QACF;AAGA,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,EAAS;AAAA,EAC/B;AACF,CAAA;;;AC7MA,IAAM,UAAA,GAAa,iBAAiB,qBAAqB,CAAA;AAQlD,SAAS,eAAA,GAA6C;AAC3D,EAAA,MAAM,KAAA,GAAQA,OAAA,CAAY,MAAA,EAAO,CAAE,SAAS,UAAU,CAAA;AAItD,EAAA,OAAO,KAAA,IAAS,IAAA;AAClB;AAkBO,SAAS,UAAU,MAAA,EAAqC;AAC7D,EAAA,OAAOA,OAAA,CAAY,MAAA,EAAO,CAAE,QAAA,CAAS,YAAY,MAAM,CAAA;AACzD;AAKO,SAAS,YAAY,MAAA,EAAwC;AAElE,EAAA,MAAM,WAAA,GACJ,MAAA,CAAO,QAAA,EAAU,WAAA,IACjB,IAAI,kBAAA,CAAmB;AAAA,IACrB,IAAA,EAAM,IAAI,eAAA;AAAgB,GAC3B,CAAA;AAEH,EAAA,MAAM,iBAAA,GACJ,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAW,WAAA,GAC1C,wBAAA,CAAyB,WAAW,CAAA,GACpC,WAAA;AAGN,EAAA,MAAM,WAAA,GACJ,MAAA,CAAO,QAAA,EAAU,WAAA,KAChB,CAAC,SAAA,KAAc;AACd,IAAA,MAAM,gBAAgB,SAAA,CAAU,aAAA;AAChC,IAAA,MAAM,GAAA,GAAM,cAAc,WAAA,EAAY;AAEtC,IAAA,OAAA,CAAQ,IAAI,UAAA,GAAa,CAAA,MAAO,CAAA,IAAK,aAAA,CAAc,OAAO,IAAA,KAAS,CAAA;AAAA,EACrE,CAAA,CAAA;AAGF,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,MAAM,CAAA,GAC/C,MAAM,OAAA,CAAQ,MAAA,CAAO,cAAc,CAAA,GACjC,MAAA,CAAO,cAAA,GACP,CAAC,MAAA,CAAO,cAAc,CAAA,GACxB;AAAA;AAAA,IAEE,IAAI,yBAAA;AAAA,MACF,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,IAAY,KAAA,IAAS,MAAA,CAAO,QAAA,GACnD,IAAI,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAA,GAChC,MAAA,CAAO,QAAA;AAAA,MACX,MAAA,CAAO,aAAA;AAAA,MACP;AAAA;AAAA;AACF,GACF;AAGJ,EAAA,MAAM,QAAA,GAA+B;AAAA,IACnC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,MAAA,CAAO,QAAA,EAAU,KAAA,IAAS;AAAC,KACpC;AAAA,IACA,KAAA,EAAO;AAAA,MACL,mBAAA,EAAqB,MAAA,CAAO,KAAA,EAAO,mBAAA,IAAuB;AAAA,KAC5D;AAAA,IACA,aAAA,EAAe,MAAA,CAAO,aAAA,KAAkB,CAAC,KAAA,KAAU,KAAA,CAAA;AAAA,IACnD,QAAA,EAAU;AAAA,MACR,WAAA,EAAa,iBAAA;AAAA,MACb;AAAA,KACF;AAAA,IACA,cAAA;AAAA,IACA,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,IAAI,yBAAA,EAA0B;AAAA,IAC/D,eAAA,EAAiB;AAAA,MACf,qBAAA,EAAuB,MAAA,CAAO,eAAA,EAAiB,qBAAA,IAAyB,IAAA;AAAA,MACxE,qBAAA,EAAuB,MAAA,CAAO,eAAA,EAAiB,qBAAA,IAAyB,KAAA;AAAA,MACxE,QAAA,EAAU,MAAA,CAAO,eAAA,EAAiB,QAAA,IAAY;AAAA,KAChD;AAAA,IACA,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe;AAAC,GACtC;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,yBAAyB,MAAA,EAAmC;AACnE,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,GAAe,IAAA,EAAK,GAAI,MAAA;AAGvC,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,cAAc,OAAO;AAAA,MACnB,QAAA,EAAU,IAAA,CAAK,MAAA,EAAO,GAAI,QAAQ,CAAA,GAAI,CAAA;AAAA;AAAA,MACtC,YAAY;AAAC,KACf,CAAA;AAAA,IACA,QAAA,EAAU,MAAM,CAAA,yBAAA,EAA4B,KAAK,CAAA,CAAA;AAAA,GACnD;AAEA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,IAAI,kBAAA,CAAmB,EAAE,IAAA,EAAM,cAAqB,CAAA;AAAA,EAC7D;AAEA,EAAA,OAAO,YAAA;AACT;AAKO,SAAS,kBAAkB,MAAA,EAA0C;AAC1E,EAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,IAAA,OAAO,CAAC,KAAK,OAAA,KAAY;AACvB,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,MAAA,CAAO,GAAA,EAAK,OAAO,CAAC,CAAA;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,IAAA,OAAO,MAAM,MAAA;AAAA,EACf;AACF","file":"chunk-EVHQ3RLD.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.AUTOLEMETRY_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 | 'do-alarm'\n | unknown;\n\nexport interface DOConstructorTrigger {\n id: string;\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 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\nexport interface HandlerConfig {\n fetch?: FetchHandlerConfig;\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}\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 * 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 };\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
package/dist/index.d.ts
CHANGED
|
@@ -250,13 +250,27 @@ interface TraceContextBase {
|
|
|
250
250
|
* Span methods available on trace context
|
|
251
251
|
*/
|
|
252
252
|
interface SpanMethods {
|
|
253
|
-
|
|
254
|
-
|
|
253
|
+
/** Set a single attribute on the span */
|
|
254
|
+
setAttribute(key: string, value: AttributeValue): void;
|
|
255
|
+
/** Set multiple attributes on the span */
|
|
256
|
+
setAttributes(attrs: Record<string, AttributeValue>): void;
|
|
257
|
+
/** Set the status of the span */
|
|
255
258
|
setStatus(status: {
|
|
256
259
|
code: SpanStatusCode;
|
|
257
260
|
message?: string;
|
|
258
261
|
}): void;
|
|
259
|
-
|
|
262
|
+
/** Record an exception on the span */
|
|
263
|
+
recordException(exception: Error, time?: TimeInput): void;
|
|
264
|
+
/** Add an event to the span (for logging milestones/checkpoints) */
|
|
265
|
+
addEvent(name: string, attributesOrStartTime?: Record<string, AttributeValue> | TimeInput, startTime?: TimeInput): void;
|
|
266
|
+
/** Add a link to another span */
|
|
267
|
+
addLink(link: Link): void;
|
|
268
|
+
/** Add multiple links to other spans */
|
|
269
|
+
addLinks(links: Link[]): void;
|
|
270
|
+
/** Update the span name dynamically */
|
|
271
|
+
updateName(name: string): void;
|
|
272
|
+
/** Check if the span is recording */
|
|
273
|
+
isRecording(): boolean;
|
|
260
274
|
}
|
|
261
275
|
/**
|
|
262
276
|
* Complete trace context that merges base context and span methods
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { OTLPExporter, createInitialiser, getActiveConfig, parseConfig, setConfig } from './chunk-
|
|
1
|
+
export { OTLPExporter, createInitialiser, getActiveConfig, parseConfig, setConfig } from './chunk-EVHQ3RLD.js';
|
|
2
2
|
import { sanitizeAttributes, isAttributeValue, isTimeInput, hrTimeDuration } from '@opentelemetry/core';
|
|
3
3
|
import { SEMATTRS_EXCEPTION_MESSAGE, SEMATTRS_EXCEPTION_TYPE, SEMATTRS_EXCEPTION_STACKTRACE } from '@opentelemetry/semantic-conventions';
|
|
4
4
|
import { context, trace, ROOT_CONTEXT, SpanStatusCode } from '@opentelemetry/api';
|
|
@@ -456,7 +456,12 @@ function createTraceContext(span2) {
|
|
|
456
456
|
setAttribute: span2.setAttribute.bind(span2),
|
|
457
457
|
setAttributes: span2.setAttributes.bind(span2),
|
|
458
458
|
setStatus: span2.setStatus.bind(span2),
|
|
459
|
-
recordException: span2.recordException.bind(span2)
|
|
459
|
+
recordException: span2.recordException.bind(span2),
|
|
460
|
+
addEvent: span2.addEvent.bind(span2),
|
|
461
|
+
addLink: span2.addLink.bind(span2),
|
|
462
|
+
addLinks: span2.addLinks.bind(span2),
|
|
463
|
+
updateName: span2.updateName.bind(span2),
|
|
464
|
+
isRecording: span2.isRecording.bind(span2)
|
|
460
465
|
};
|
|
461
466
|
}
|
|
462
467
|
function setSpanName(span2, name) {
|
|
@@ -570,7 +575,16 @@ function createDummyCtx() {
|
|
|
570
575
|
setStatus: () => {
|
|
571
576
|
},
|
|
572
577
|
recordException: () => {
|
|
573
|
-
}
|
|
578
|
+
},
|
|
579
|
+
addEvent: () => {
|
|
580
|
+
},
|
|
581
|
+
addLink: () => {
|
|
582
|
+
},
|
|
583
|
+
addLinks: () => {
|
|
584
|
+
},
|
|
585
|
+
updateName: () => {
|
|
586
|
+
},
|
|
587
|
+
isRecording: () => false
|
|
574
588
|
};
|
|
575
589
|
}
|
|
576
590
|
function truncateErrorMessage(message) {
|
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/core/trace-context.ts","../src/functional.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 * Trace context types and utilities\n */\n\nimport type { Span, SpanStatusCode } from '@opentelemetry/api';\n\n/**\n * WeakMap to store span names for active spans.\n * Enables retrieving span names for correlation helpers.\n */\nconst spanNameMap = new WeakMap<Span, string>();\n\n/**\n * Base trace context containing trace identifiers\n */\nexport interface TraceContextBase {\n traceId: string;\n spanId: string;\n correlationId: string;\n 'code.function'?: string;\n}\n\n/**\n * Span methods available on trace context\n */\nexport interface SpanMethods {\n setAttribute(key: string, value: string | number | boolean): void;\n setAttributes(attrs: Record<string, string | number | boolean>): void;\n setStatus(status: { code: SpanStatusCode; message?: string }): void;\n recordException(exception: Error): void;\n}\n\n/**\n * Complete trace context that merges base context and span methods\n *\n * This is the ctx parameter passed to factory functions in trace().\n * It provides access to trace IDs and span manipulation methods.\n */\nexport type TraceContext = TraceContextBase & SpanMethods;\n\n/**\n * Create a TraceContext from an OpenTelemetry Span\n *\n * This utility extracts trace context information from a span\n * and provides span manipulation methods in a consistent format.\n */\nexport function createTraceContext(span: Span): TraceContext {\n const spanContext = span.spanContext();\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n correlationId: spanContext.traceId.slice(0, 16),\n 'code.function': spanNameMap.get(span),\n setAttribute: span.setAttribute.bind(span),\n setAttributes: span.setAttributes.bind(span),\n setStatus: span.setStatus.bind(span),\n recordException: span.recordException.bind(span),\n };\n}\n\n/**\n * Store the span name for later retrieval via trace context helpers.\n */\nexport function setSpanName(span: Span, name: string): void {\n spanNameMap.set(span, name);\n}\n","/**\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_SYMBOL = Symbol.for('autotel.edge.functional.factory');\nconst FACTORY_NAME_HINTS = new Set(['ctx', '_ctx', 'context', 'tracecontext', 'tracectx']);\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_SYMBOL]?: true;\n}\n\nfunction markAsTraceFactory(fn: AnyFn): void {\n try {\n Object.defineProperty(fn, TRACE_FACTORY_SYMBOL, {\n value: true,\n configurable: true,\n });\n } catch {\n (fn as TraceFactoryMarked)[TRACE_FACTORY_SYMBOL] = true;\n }\n}\n\nfunction hasFactoryMark(fn: AnyFn): boolean {\n return Boolean((fn as TraceFactoryMarked)[TRACE_FACTORY_SYMBOL]);\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 FACTORY_NAME_HINTS.has(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 } as unknown 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\nconst INSTRUMENTED_SYMBOL = Symbol.for('autotel.edge.functional.instrumented');\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_SYMBOL] = 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_SYMBOL] = 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"]}
|
|
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/core/trace-context.ts","../src/functional.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 * Trace context types and utilities\n */\n\nimport type {\n AttributeValue,\n Link,\n Span,\n SpanStatusCode,\n TimeInput,\n} from '@opentelemetry/api';\n\n/**\n * WeakMap to store span names for active spans.\n * Enables retrieving span names for correlation helpers.\n */\nconst spanNameMap = new WeakMap<Span, string>();\n\n/**\n * Base trace context containing trace identifiers\n */\nexport interface TraceContextBase {\n traceId: string;\n spanId: string;\n correlationId: string;\n 'code.function'?: string;\n}\n\n/**\n * Span methods available on trace context\n */\nexport interface SpanMethods {\n /** Set a single attribute on the span */\n setAttribute(key: string, value: AttributeValue): void;\n /** Set multiple attributes on the span */\n setAttributes(attrs: Record<string, AttributeValue>): void;\n /** Set the status of the span */\n setStatus(status: { code: SpanStatusCode; message?: string }): void;\n /** Record an exception on the span */\n recordException(exception: Error, time?: TimeInput): void;\n /** Add an event to the span (for logging milestones/checkpoints) */\n addEvent(\n name: string,\n attributesOrStartTime?: Record<string, AttributeValue> | TimeInput,\n startTime?: TimeInput,\n ): void;\n /** Add a link to another span */\n addLink(link: Link): void;\n /** Add multiple links to other spans */\n addLinks(links: Link[]): void;\n /** Update the span name dynamically */\n updateName(name: string): void;\n /** Check if the span is recording */\n isRecording(): boolean;\n}\n\n/**\n * Complete trace context that merges base context and span methods\n *\n * This is the ctx parameter passed to factory functions in trace().\n * It provides access to trace IDs and span manipulation methods.\n */\nexport type TraceContext = TraceContextBase & SpanMethods;\n\n/**\n * Create a TraceContext from an OpenTelemetry Span\n *\n * This utility extracts trace context information from a span\n * and provides span manipulation methods in a consistent format.\n */\nexport function createTraceContext(span: Span): TraceContext {\n const spanContext = span.spanContext();\n return {\n traceId: spanContext.traceId,\n spanId: spanContext.spanId,\n correlationId: spanContext.traceId.slice(0, 16),\n 'code.function': spanNameMap.get(span),\n setAttribute: span.setAttribute.bind(span),\n setAttributes: span.setAttributes.bind(span),\n setStatus: span.setStatus.bind(span),\n recordException: span.recordException.bind(span),\n addEvent: span.addEvent.bind(span),\n addLink: span.addLink.bind(span),\n addLinks: span.addLinks.bind(span),\n updateName: span.updateName.bind(span),\n isRecording: span.isRecording.bind(span),\n };\n}\n\n/**\n * Store the span name for later retrieval via trace context helpers.\n */\nexport function setSpanName(span: Span, name: string): void {\n spanNameMap.set(span, name);\n}\n","/**\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_SYMBOL = Symbol.for('autotel.edge.functional.factory');\nconst FACTORY_NAME_HINTS = new Set(['ctx', '_ctx', 'context', 'tracecontext', 'tracectx']);\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_SYMBOL]?: true;\n}\n\nfunction markAsTraceFactory(fn: AnyFn): void {\n try {\n Object.defineProperty(fn, TRACE_FACTORY_SYMBOL, {\n value: true,\n configurable: true,\n });\n } catch {\n (fn as TraceFactoryMarked)[TRACE_FACTORY_SYMBOL] = true;\n }\n}\n\nfunction hasFactoryMark(fn: AnyFn): boolean {\n return Boolean((fn as TraceFactoryMarked)[TRACE_FACTORY_SYMBOL]);\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 FACTORY_NAME_HINTS.has(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 unknown 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\nconst INSTRUMENTED_SYMBOL = Symbol.for('autotel.edge.functional.instrumented');\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_SYMBOL] = 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_SYMBOL] = 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"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
* Trace context types and utilities
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
AttributeValue,
|
|
7
|
+
Link,
|
|
8
|
+
Span,
|
|
9
|
+
SpanStatusCode,
|
|
10
|
+
TimeInput,
|
|
11
|
+
} from '@opentelemetry/api';
|
|
6
12
|
|
|
7
13
|
/**
|
|
8
14
|
* WeakMap to store span names for active spans.
|
|
@@ -24,10 +30,28 @@ export interface TraceContextBase {
|
|
|
24
30
|
* Span methods available on trace context
|
|
25
31
|
*/
|
|
26
32
|
export interface SpanMethods {
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
/** Set a single attribute on the span */
|
|
34
|
+
setAttribute(key: string, value: AttributeValue): void;
|
|
35
|
+
/** Set multiple attributes on the span */
|
|
36
|
+
setAttributes(attrs: Record<string, AttributeValue>): void;
|
|
37
|
+
/** Set the status of the span */
|
|
29
38
|
setStatus(status: { code: SpanStatusCode; message?: string }): void;
|
|
30
|
-
|
|
39
|
+
/** Record an exception on the span */
|
|
40
|
+
recordException(exception: Error, time?: TimeInput): void;
|
|
41
|
+
/** Add an event to the span (for logging milestones/checkpoints) */
|
|
42
|
+
addEvent(
|
|
43
|
+
name: string,
|
|
44
|
+
attributesOrStartTime?: Record<string, AttributeValue> | TimeInput,
|
|
45
|
+
startTime?: TimeInput,
|
|
46
|
+
): void;
|
|
47
|
+
/** Add a link to another span */
|
|
48
|
+
addLink(link: Link): void;
|
|
49
|
+
/** Add multiple links to other spans */
|
|
50
|
+
addLinks(links: Link[]): void;
|
|
51
|
+
/** Update the span name dynamically */
|
|
52
|
+
updateName(name: string): void;
|
|
53
|
+
/** Check if the span is recording */
|
|
54
|
+
isRecording(): boolean;
|
|
31
55
|
}
|
|
32
56
|
|
|
33
57
|
/**
|
|
@@ -55,6 +79,11 @@ export function createTraceContext(span: Span): TraceContext {
|
|
|
55
79
|
setAttributes: span.setAttributes.bind(span),
|
|
56
80
|
setStatus: span.setStatus.bind(span),
|
|
57
81
|
recordException: span.recordException.bind(span),
|
|
82
|
+
addEvent: span.addEvent.bind(span),
|
|
83
|
+
addLink: span.addLink.bind(span),
|
|
84
|
+
addLinks: span.addLinks.bind(span),
|
|
85
|
+
updateName: span.updateName.bind(span),
|
|
86
|
+
isRecording: span.isRecording.bind(span),
|
|
58
87
|
};
|
|
59
88
|
}
|
|
60
89
|
|
package/src/functional.test.ts
CHANGED
|
@@ -20,9 +20,11 @@ describe('Functional API', () => {
|
|
|
20
20
|
setStatus: vi.fn(),
|
|
21
21
|
recordException: vi.fn(),
|
|
22
22
|
end: vi.fn(),
|
|
23
|
-
isRecording: ()
|
|
23
|
+
isRecording: vi.fn().mockReturnValue(true),
|
|
24
24
|
updateName: vi.fn(),
|
|
25
25
|
addEvent: vi.fn(),
|
|
26
|
+
addLink: vi.fn(),
|
|
27
|
+
addLinks: vi.fn(),
|
|
26
28
|
};
|
|
27
29
|
|
|
28
30
|
mockTracer = {
|
|
@@ -699,4 +701,115 @@ describe('Functional API', () => {
|
|
|
699
701
|
expect(mockSpan.setAttribute).toHaveBeenCalledWith('operation.name', 'fetchUser');
|
|
700
702
|
});
|
|
701
703
|
});
|
|
704
|
+
|
|
705
|
+
describe('Array attribute support', () => {
|
|
706
|
+
it('should support string array attributes', async () => {
|
|
707
|
+
await trace(async (ctx) => {
|
|
708
|
+
ctx.setAttribute('tags', ['qa', 'test', 'automated']);
|
|
709
|
+
return 'done';
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith('tags', ['qa', 'test', 'automated']);
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
it('should support number array attributes', async () => {
|
|
716
|
+
await trace(async (ctx) => {
|
|
717
|
+
ctx.setAttribute('scores', [95, 87, 92]);
|
|
718
|
+
return 'done';
|
|
719
|
+
});
|
|
720
|
+
|
|
721
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith('scores', [95, 87, 92]);
|
|
722
|
+
});
|
|
723
|
+
|
|
724
|
+
it('should support boolean array attributes', async () => {
|
|
725
|
+
await trace(async (ctx) => {
|
|
726
|
+
ctx.setAttribute('flags', [true, false, true]);
|
|
727
|
+
return 'done';
|
|
728
|
+
});
|
|
729
|
+
|
|
730
|
+
expect(mockSpan.setAttribute).toHaveBeenCalledWith('flags', [true, false, true]);
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
it('should support mixed attributes including arrays via setAttributes', async () => {
|
|
734
|
+
await trace(async (ctx) => {
|
|
735
|
+
ctx.setAttributes({
|
|
736
|
+
'user.id': 'user_123',
|
|
737
|
+
environment: 'development',
|
|
738
|
+
tags: ['qa', 'test'],
|
|
739
|
+
scores: [1, 2, 3],
|
|
740
|
+
});
|
|
741
|
+
return 'done';
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
expect(mockSpan.setAttributes).toHaveBeenCalledWith({
|
|
745
|
+
'user.id': 'user_123',
|
|
746
|
+
environment: 'development',
|
|
747
|
+
tags: ['qa', 'test'],
|
|
748
|
+
scores: [1, 2, 3],
|
|
749
|
+
});
|
|
750
|
+
});
|
|
751
|
+
});
|
|
752
|
+
|
|
753
|
+
describe('Full OTel Span API', () => {
|
|
754
|
+
it('should support addEvent for span events', async () => {
|
|
755
|
+
await trace(async (ctx) => {
|
|
756
|
+
ctx.addEvent('order.started', { 'order.id': '123' });
|
|
757
|
+
ctx.addEvent('items.fetched', { 'item.count': 5 });
|
|
758
|
+
return 'done';
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
expect(mockSpan.addEvent).toHaveBeenCalledWith('order.started', { 'order.id': '123' });
|
|
762
|
+
expect(mockSpan.addEvent).toHaveBeenCalledWith('items.fetched', { 'item.count': 5 });
|
|
763
|
+
});
|
|
764
|
+
|
|
765
|
+
it('should support updateName for dynamic span naming', async () => {
|
|
766
|
+
await trace('initial.name', async (ctx) => {
|
|
767
|
+
ctx.updateName('updated.name');
|
|
768
|
+
return 'done';
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
expect(mockSpan.updateName).toHaveBeenCalledWith('updated.name');
|
|
772
|
+
});
|
|
773
|
+
|
|
774
|
+
it('should support isRecording', async () => {
|
|
775
|
+
let wasRecording = false;
|
|
776
|
+
|
|
777
|
+
await trace(async (ctx) => {
|
|
778
|
+
wasRecording = ctx.isRecording();
|
|
779
|
+
return 'done';
|
|
780
|
+
});
|
|
781
|
+
|
|
782
|
+
expect(wasRecording).toBe(true);
|
|
783
|
+
expect(mockSpan.isRecording).toHaveBeenCalled();
|
|
784
|
+
});
|
|
785
|
+
|
|
786
|
+
it('should support addLink for span links', async () => {
|
|
787
|
+
const linkContext = {
|
|
788
|
+
traceId: 'linked-trace-id',
|
|
789
|
+
spanId: 'linked-span-id',
|
|
790
|
+
traceFlags: 1,
|
|
791
|
+
};
|
|
792
|
+
|
|
793
|
+
await trace(async (ctx) => {
|
|
794
|
+
ctx.addLink({ context: linkContext });
|
|
795
|
+
return 'done';
|
|
796
|
+
});
|
|
797
|
+
|
|
798
|
+
expect(mockSpan.addLink).toHaveBeenCalledWith({ context: linkContext });
|
|
799
|
+
});
|
|
800
|
+
|
|
801
|
+
it('should support addLinks for multiple span links', async () => {
|
|
802
|
+
const links = [
|
|
803
|
+
{ context: { traceId: 'trace-1', spanId: 'span-1', traceFlags: 1 } },
|
|
804
|
+
{ context: { traceId: 'trace-2', spanId: 'span-2', traceFlags: 1 } },
|
|
805
|
+
];
|
|
806
|
+
|
|
807
|
+
await trace(async (ctx) => {
|
|
808
|
+
ctx.addLinks(links);
|
|
809
|
+
return 'done';
|
|
810
|
+
});
|
|
811
|
+
|
|
812
|
+
expect(mockSpan.addLinks).toHaveBeenCalledWith(links);
|
|
813
|
+
});
|
|
814
|
+
});
|
|
702
815
|
});
|
package/src/functional.ts
CHANGED
|
@@ -194,6 +194,11 @@ function createDummyCtx(): TraceContext {
|
|
|
194
194
|
setAttributes: () => {},
|
|
195
195
|
setStatus: () => {},
|
|
196
196
|
recordException: () => {},
|
|
197
|
+
addEvent: () => {},
|
|
198
|
+
addLink: () => {},
|
|
199
|
+
addLinks: () => {},
|
|
200
|
+
updateName: () => {},
|
|
201
|
+
isRecording: () => false,
|
|
197
202
|
} as unknown as TraceContext;
|
|
198
203
|
}
|
|
199
204
|
|