autotel-edge 3.17.1 → 3.17.2

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["v","api_context","trace","optionsWithSampler","api_context","otelTrace"],"sources":["../src/core/span.ts","../src/core/tracer.ts","../src/core/context.ts","../src/core/provider.ts","../src/core/buffer.ts","../src/core/native-bridge.ts","../src/functional.ts","../src/composition.ts","../src/plugin-runner.ts","../src/middleware-toolkit.ts"],"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, context as otelContext } 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// Single canonical AsyncLocalStorage context manager for the whole runtime.\n// `context.setGlobalContextManager()` is a one-shot global, so we register once\n// and reuse. Both the OTLP provider and the native-tracing path depend on this\n// being registered — otherwise OTel context (the active span, the native\n// tracer) does not propagate across `await` boundaries.\nlet globalContextManager: AsyncLocalStorageContextManager | undefined;\n\n/**\n * Ensure a global AsyncLocalStorage context manager is registered, returning it.\n * Idempotent.\n */\nexport function ensureGlobalContextManager(): AsyncLocalStorageContextManager {\n if (!globalContextManager) {\n const manager = new AsyncLocalStorageContextManager();\n manager.enable();\n otelContext.setGlobalContextManager(manager);\n globalContextManager = manager;\n }\n return globalContextManager;\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 { ensureGlobalContextManager } from './context';\n\n/**\n * WorkerTracerProvider - Registers tracer globally\n */\nexport class WorkerTracerProvider {\n private tracer: WorkerTracer;\n\n constructor(spanProcessors: SpanProcessor[], resource: Resource) {\n this.tracer = new WorkerTracer(spanProcessors, resource);\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 * Registers the global context manager so context — and the active span —\n * propagates across `await` boundaries (without it the API uses a no-op\n * manager and `trace.getActiveSpan()` returns undefined after the first\n * await), then installs the tracer provider.\n */\n register(): void {\n ensureGlobalContextManager();\n\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// Re-export the single imported binding. Importing AND re-exporting `Buffer`\n// from 'node:buffer' separately makes rolldown (tsdown) emit a dangling\n// `Buffer$1` reference, so keep exactly one binding.\nexport { Buffer };","/**\n * Native span bridge\n *\n * A runtime-agnostic seam that lets autotel's `span()` / `trace()` functional\n * API transparently emit *platform-native* spans when one is available, instead\n * of going through autotel's own OpenTelemetry tracer + OTLP exporter.\n *\n * The concrete native tracer is supplied by a runtime adapter package (e.g.\n * `autotel-cloudflare`, which wraps Cloudflare's `tracing.enterSpan()` /\n * `ctx.tracing`). autotel-edge itself never imports any runtime module — the\n * adapter installs a {@link NativeTracer} into the active OpenTelemetry context\n * with {@link withNativeTracer}, and the functional API reads it back with\n * {@link getActiveNativeTracer}.\n *\n * Native span surfaces are deliberately minimal (Cloudflare's `Span` exposes\n * only `setAttribute` + `isTraced`), so the adapters below degrade autotel's\n * richer `TraceContext` / OTel `Span` API gracefully. See the degradation map\n * in `docs/CLOUDFLARE-NATIVE-TRACING.md`.\n */\n\nimport {\n context as api_context,\n createContextKey,\n INVALID_SPAN_CONTEXT,\n SpanStatusCode,\n type AttributeValue,\n type Context,\n type Span,\n type SpanContext,\n} from '@opentelemetry/api';\nimport type { TraceContext } from './trace-context';\n\n/**\n * The minimal span surface every native runtime is expected to provide.\n * Modelled on Cloudflare Workers' custom-span `Span`.\n */\nexport interface NativeSpanHandle {\n /** Whether this invocation is actually being recorded (head sampling). */\n readonly isTraced: boolean;\n /** Set a single primitive attribute. `undefined` is a no-op. */\n setAttribute(key: string, value: string | number | boolean | undefined): void;\n /**\n * Optional — not provided by Cloudflare today, but reserved so autotel\n * auto-upgrades to real trace/span ids the moment the platform exposes them,\n * with no API change. When present and valid, its ids take precedence over\n * the fallback correlation id.\n */\n spanContext?(): SpanContext;\n}\n\n/**\n * A native tracer creates spans scoped to a callback, auto-nesting by async\n * context. Modelled on Cloudflare's `tracing.enterSpan(name, callback)`.\n */\nexport interface NativeTracer {\n enterSpan<T>(name: string, callback: (span: NativeSpanHandle) => T): T;\n /**\n * Optional per-request correlation id surfaced as `ctx.correlationId` (and a\n * `correlation.id` span attribute) when the platform does not yet expose\n * span ids. On Cloudflare this is the `cf-ray` id, so logs, custom spans, and\n * the dashboard all share one queryable key today.\n */\n readonly correlationId?: string;\n}\n\nconst INVALID_TRACE_ID = INVALID_SPAN_CONTEXT.traceId;\n\n/**\n * Resolve trace ids for a native span. Prefers real ids from a (future)\n * `spanContext()`; otherwise falls back to the supplied correlation id.\n */\nfunction resolveSpanIds(\n span: NativeSpanHandle,\n fallbackCorrelationId?: string,\n): { traceId: string; spanId: string; correlationId: string } {\n const sc = span.spanContext?.();\n if (sc && sc.traceId && sc.traceId !== INVALID_TRACE_ID) {\n return {\n traceId: sc.traceId,\n spanId: sc.spanId,\n correlationId: sc.traceId.slice(0, 16),\n };\n }\n return {\n traceId: '',\n spanId: '',\n correlationId: fallbackCorrelationId ?? '',\n };\n}\n\nconst NATIVE_TRACER_KEY = createContextKey('autotel-native-tracer');\n\n/**\n * Return a context with the given native tracer installed. Runtime adapters\n * call this once per request and run the handler inside it so that nested\n * `span()` / `trace()` calls route to the native tracer.\n */\nexport function withNativeTracer(\n tracer: NativeTracer,\n context: Context = api_context.active(),\n): Context {\n return context.setValue(NATIVE_TRACER_KEY, tracer);\n}\n\n/**\n * Read the native tracer from the active context, if one was installed.\n * Returns `null` when running without a native tracer (other edge runtimes,\n * native tracing disabled, local dev) — callers then fall back to the OTel path.\n */\nexport function getActiveNativeTracer(): NativeTracer | null {\n const value = api_context.active().getValue(NATIVE_TRACER_KEY) as\n | NativeTracer\n | undefined;\n return value ?? null;\n}\n\n/**\n * Coerce an arbitrary attribute value to the primitive subset native spans\n * accept. Arrays/objects are JSON-stringified; `undefined`/`null` are dropped.\n */\nfunction coerceAttribute(\n value: unknown,\n): string | number | boolean | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction applyAttributes(\n span: NativeSpanHandle,\n attributes: Record<string, unknown>,\n): void {\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, coerceAttribute(value));\n }\n}\n\n// Degradation primitives shared by the TraceContext and OTel-Span adapters,\n// so both surfaces map onto the thin native span identically.\n\nfunction nativeSetErrorStatus(span: NativeSpanHandle, message?: string): void {\n span.setAttribute('otel.status_code', 'ERROR');\n span.setAttribute('error', true);\n if (message) {\n span.setAttribute('otel.status_description', message);\n }\n}\n\nfunction nativeRecordException(span: NativeSpanHandle, exception: unknown): void {\n const error =\n exception instanceof Error ? exception : new Error(String(exception));\n span.setAttribute('exception.type', error.name);\n span.setAttribute('exception.message', error.message);\n // Platform attributes console output to the active native span.\n console.error(error);\n}\n\nfunction nativeAddEvent(\n eventName: string,\n attributesOrStartTime?: unknown,\n): void {\n if (\n attributesOrStartTime &&\n typeof attributesOrStartTime === 'object' &&\n !Array.isArray(attributesOrStartTime)\n ) {\n console.log(eventName, attributesOrStartTime);\n } else {\n console.log(eventName);\n }\n}\n\n/**\n * Build an autotel {@link TraceContext} backed by a native span.\n *\n * Degradation (native surface is thinner than OTel):\n * - `traceId`/`spanId` → real ids when the platform exposes `spanContext()`\n * (auto-upgrades in future), otherwise `''`.\n * - `correlationId` → real-id-derived when available, else the supplied\n * `correlationId` (e.g. Cloudflare `cf-ray`). Also written as a\n * `correlation.id` span attribute so it is queryable in the backend.\n * - `setStatus(ERROR)` → records `otel.status_code` + `error` attributes.\n * - `recordException` → attributes + `console.error` (attributed to the span).\n * - `addEvent` → `console.log(name, attrs)` (attributed to the span).\n * - `addLink`/`addLinks`/`updateName` → no-ops.\n */\nexport function createNativeTraceContext(\n span: NativeSpanHandle,\n name: string,\n correlationId?: string,\n): TraceContext {\n const ids = resolveSpanIds(span, correlationId);\n if (ids.correlationId) {\n span.setAttribute('correlation.id', ids.correlationId);\n }\n return {\n traceId: ids.traceId,\n spanId: ids.spanId,\n correlationId: ids.correlationId,\n 'code.function': name,\n setAttribute: (key, value) =>\n span.setAttribute(key, coerceAttribute(value)),\n setAttributes: (attrs) =>\n applyAttributes(span, attrs as Record<string, unknown>),\n setStatus: (status) => {\n if (status.code === SpanStatusCode.ERROR) {\n nativeSetErrorStatus(span, status.message);\n }\n },\n recordException: (exception) => nativeRecordException(span, exception),\n addEvent: (eventName, attributesOrStartTime) =>\n nativeAddEvent(eventName, attributesOrStartTime),\n addLink: () => {},\n addLinks: () => {},\n updateName: () => {},\n isRecording: () => span.isTraced,\n };\n}\n\n/**\n * Build a minimal OpenTelemetry {@link Span} backed by a native span, for the\n * `span(name, (span) => ...)` callback whose argument is typed as an OTel Span.\n * Unsupported operations degrade exactly as in {@link createNativeTraceContext}.\n */\nexport function createNativeSpanShim(\n span: NativeSpanHandle,\n correlationId?: string,\n): Span {\n // Surface the correlation id as a queryable attribute (parity with\n // createNativeTraceContext), preferring real ids when the platform has them.\n const ids = resolveSpanIds(span, correlationId);\n if (ids.correlationId) {\n span.setAttribute('correlation.id', ids.correlationId);\n }\n // Prefer the platform's real span context when it becomes available;\n // otherwise expose an invalid context (Cloudflare has no spanContext yet).\n const spanContext: SpanContext = span.spanContext?.() ?? INVALID_SPAN_CONTEXT;\n const shim: Partial<Span> = {\n spanContext: () => spanContext,\n setAttribute(key: string, value: AttributeValue) {\n span.setAttribute(key, coerceAttribute(value));\n return shim as Span;\n },\n setAttributes(attributes) {\n applyAttributes(span, attributes as Record<string, unknown>);\n return shim as Span;\n },\n addEvent(eventName, attributesOrStartTime) {\n nativeAddEvent(eventName, attributesOrStartTime);\n return shim as Span;\n },\n addLink: () => shim as Span,\n addLinks: () => shim as Span,\n setStatus(status) {\n if (status.code === SpanStatusCode.ERROR) {\n nativeSetErrorStatus(span, status.message);\n }\n return shim as Span;\n },\n updateName: () => shim as Span,\n end: () => {},\n isRecording: () => span.isTraced,\n recordException: (exception) => nativeRecordException(span, exception),\n };\n return shim as Span;\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';\nimport {\n getActiveNativeTracer,\n createNativeTraceContext,\n createNativeSpanShim,\n type NativeTracer,\n} from './core/native-bridge';\n\n// Re-export for convenience\nexport type { TraceContext } from './core/trace-context';\n\ntype AnyFn = (...args: any[]) => any;\n\nconst TRACE_FACTORY_MARK = '__autotelEdgeTraceFactory';\nconst INSTRUMENTED_MARK = '__autotelEdgeInstrumented';\nconst FACTORY_NAME_HINTS: Record<string, true> = {\n ctx: true,\n _ctx: true,\n context: true,\n tracecontext: true,\n tracectx: true,\n};\n\nconst SINGLE_LINE_COMMENT_REGEX = /\\/\\/.*$/gm;\nconst MULTI_LINE_COMMENT_REGEX = /\\/\\*[\\s\\S]*?\\*\\//gm;\nconst PARAM_TOKEN_SANITIZE_REGEX = new RegExp(String.raw`[{}\\[\\]\\s]`, 'g');\n\ninterface TraceFactoryMarked {\n [TRACE_FACTORY_MARK]?: true;\n}\n\nfunction markAsTraceFactory(fn: AnyFn): void {\n try {\n Object.defineProperty(fn, TRACE_FACTORY_MARK, {\n value: true,\n configurable: true,\n });\n } catch {\n (fn as TraceFactoryMarked)[TRACE_FACTORY_MARK] = true;\n }\n}\n\nfunction hasFactoryMark(fn: AnyFn): boolean {\n return Boolean((fn as TraceFactoryMarked)[TRACE_FACTORY_MARK]);\n}\n\nfunction sanitizeParameterToken(token: string): string {\n const [firstToken] = token.split('=');\n return (firstToken ?? '').replaceAll(PARAM_TOKEN_SANITIZE_REGEX, '').trim();\n}\n\nfunction getFirstParameterToken(fn: AnyFn): string | null {\n let source = Function.prototype.toString.call(fn);\n source = source\n .replaceAll(MULTI_LINE_COMMENT_REGEX, '')\n .replaceAll(SINGLE_LINE_COMMENT_REGEX, '')\n .trim();\n\n const arrowMatch = source.match(/^(?:async\\s*)?(?:\\(([^)]*)\\)|([^=()]+))\\s*=>/);\n if (arrowMatch) {\n const params = (arrowMatch[1] ?? arrowMatch[2] ?? '').split(',');\n const first = params[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n return null;\n }\n\n const functionMatch = source.match(/^[^(]*\\(([^)]*)\\)/);\n if (functionMatch) {\n const params = functionMatch[1]?.split(',');\n const first = params?.[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n }\n\n return null;\n}\n\nfunction looksLikeTraceFactory(fn: AnyFn): boolean {\n if (hasFactoryMark(fn)) {\n return true;\n }\n\n if (fn.length === 0) {\n return false;\n }\n\n const firstParam = getFirstParameterToken(fn);\n if (!firstParam) {\n return false;\n }\n\n const normalized = firstParam.toLowerCase();\n if (\n Object.hasOwn(FACTORY_NAME_HINTS, normalized) ||\n normalized.startsWith('ctx') ||\n normalized.startsWith('_ctx') ||\n normalized.startsWith('trace')\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if a function that takes ctx returns another function (factory pattern)\n * vs returning a value directly (immediate execution pattern)\n */\nfunction isFactoryReturningFunction(\n fnWithCtx: (ctx: TraceContext) => unknown,\n): boolean {\n try {\n const result = fnWithCtx(createDummyCtx());\n return typeof result === 'function';\n } catch {\n // If the function throws when called with dummy ctx, assume it's immediate execution\n // since factory functions typically just return a function and don't execute logic\n return false;\n }\n}\n\nfunction isTraceFactoryFunction<TArgs extends any[], TReturn>(\n fn:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): fn is (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (typeof fn !== 'function') {\n return false;\n }\n\n if (hasFactoryMark(fn as AnyFn)) {\n return true;\n }\n\n if (looksLikeTraceFactory(fn as AnyFn)) {\n markAsTraceFactory(fn as AnyFn);\n return true;\n }\n\n return false;\n}\n\nfunction ensureTraceFactory<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (isTraceFactoryFunction(fnOrFactory)) {\n return fnOrFactory;\n }\n\n const plainFn = fnOrFactory as (...args: TArgs) => TReturn | Promise<TReturn>;\n const factory = (ctx: TraceContext) => {\n void ctx;\n return plainFn;\n };\n markAsTraceFactory(factory);\n return factory;\n}\n\ntype ExtractFunctionSignature<T> = T extends (ctx: TraceContext) => infer F\n ? F extends (...args: infer Args) => infer Return\n ? (...args: Args) => Return\n : never\n : never;\n\ntype WrappedFunction<TArgs extends any[], TReturn> = (...args: TArgs) => TReturn | Promise<TReturn>;\n\n/**\n * trace function options\n */\nexport interface traceOptions<TArgs extends any[] = any[], TReturn = any> {\n name?: string;\n serviceName?: string;\n sampler?: Sampler;\n attributesFromArgs?: (args: TArgs) => Record<string, unknown>;\n attributesFromResult?: (result: TReturn) => Record<string, unknown>;\n attributes?: Record<string, unknown>;\n}\n\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\nfunction createDummyCtx(): TraceContext {\n return {\n traceId: '',\n spanId: '',\n correlationId: '',\n setAttribute: () => {},\n setAttributes: () => {},\n setStatus: () => {},\n recordException: () => {},\n addEvent: () => {},\n addLink: () => {},\n addLinks: () => {},\n updateName: () => {},\n isRecording: () => false,\n } as TraceContext;\n}\n\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Record an error onto a native trace context (status + exception) and rethrow.\n * Shared by every native-span code path so the error degradation is identical.\n */\nfunction failNativeContext(ctx: TraceContext, error: unknown): never {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n ),\n });\n ctx.recordException(error instanceof Error ? error : new Error(String(error)));\n throw error;\n}\n\n/**\n * Run a factory-produced function inside a native span, applying the same\n * options (attributes / attributesFromArgs / attributesFromResult / code.function)\n * and error degradation as the OTel path. Handles both sync and async functions\n * by branching on the returned value, so async/sync callers share one impl.\n */\nfunction runFactoryInNativeSpan<TArgs extends any[], TReturn>(\n nativeTracer: NativeTracer,\n spanName: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>,\n options: traceOptions<TArgs, TReturn>,\n args: TArgs,\n): TReturn | Promise<TReturn> {\n return nativeTracer.enterSpan(spanName, (nativeSpan) => {\n const ctx = createNativeTraceContext(nativeSpan, spanName, nativeTracer.correlationId);\n const actualFn = fnFactory(ctx);\n\n if (options.attributes) {\n ctx.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n if (options.attributesFromArgs) {\n ctx.setAttributes(options.attributesFromArgs(args) as Record<string, AttributeValue>);\n }\n\n const onSuccess = (result: TReturn): TReturn => {\n if (options.attributesFromResult) {\n ctx.setAttributes(options.attributesFromResult(result) as Record<string, AttributeValue>);\n }\n ctx.setAttribute('code.function', spanName);\n return result;\n };\n const onError = (error: unknown): never => {\n ctx.setAttribute('code.function', spanName);\n return failNativeContext(ctx, error);\n };\n\n try {\n const result = actualFn(...args);\n return result instanceof Promise\n ? (result.then(onSuccess, onError) as Promise<TReturn>)\n : onSuccess(result as TReturn);\n } catch (error) {\n return onError(error);\n }\n });\n}\n\ntype InstrumentableFunction<TArgs extends any[] = any[], TReturn = any> = ((\n ...args: TArgs\n) => TReturn | Promise<TReturn>) & {\n displayName?: string;\n name?: string;\n};\n\nfunction inferFunctionName<TArgs extends any[] = any[], TReturn = any>(\n fn: InstrumentableFunction<TArgs, TReturn>,\n): string | undefined {\n const displayName = (fn as { displayName?: string }).displayName;\n if (displayName) {\n return displayName;\n }\n\n if (fn.name && fn.name !== 'anonymous') {\n return fn.name;\n }\n\n const source = Function.prototype.toString.call(fn);\n const match = source.match(/function\\s+([^(\\s]+)/);\n if (match && match[1] && match[1] !== 'anonymous') {\n return match[1];\n }\n\n return undefined;\n}\n\nfunction getSpanName<TArgs extends any[], TReturn>(\n options: traceOptions<TArgs, TReturn>,\n fn: InstrumentableFunction<TArgs, TReturn>,\n variableName?: string,\n): string {\n if (options.name) {\n return options.name;\n }\n\n let fnName = variableName ?? inferFunctionName(fn);\n fnName = fnName || 'anonymous';\n\n if (options.serviceName) {\n return `${options.serviceName}.${fnName}`;\n }\n\n if (fnName && fnName !== 'anonymous') {\n return fnName;\n }\n\n return 'unknown';\n}\n\nfunction isAsyncFunction(fn: unknown): boolean {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n\nfunction wrapWithTracingAsync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => Promise<TReturn> {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = async function wrappedFunction(this: unknown, ...args: TArgs): Promise<TReturn> {\n const nativeTracer = getActiveNativeTracer();\n if (nativeTracer) {\n return runFactoryInNativeSpan(nativeTracer, spanName, fnFactory, options, args) as Promise<TReturn>;\n }\n\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, async (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = await actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_MARK] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapWithTracingSync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => TReturn {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = function wrappedFunction(this: unknown, ...args: TArgs): TReturn {\n const nativeTracer = getActiveNativeTracer();\n if (nativeTracer) {\n return runFactoryInNativeSpan(nativeTracer, spanName, fnFactory, options, args) as TReturn;\n }\n\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result as TReturn);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_MARK] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapFactoryWithTracing<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const factory = ensureTraceFactory(fnOrFactory);\n const sampleFn = factory(createDummyCtx());\n const useAsyncWrapper = isAsyncFunction(sampleFn);\n\n if (useAsyncWrapper) {\n return wrapWithTracingAsync(\n factory as (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n }\n\n return wrapWithTracingSync(\n factory as (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Execute a function immediately within a trace span\n * Used for the immediate execution pattern: trace((ctx) => result)\n */\nfunction executeImmediately<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn | Promise<TReturn>,\n options: traceOptions<any[], any>,\n): TReturn | Promise<TReturn> {\n const spanName = options.name || 'anonymous';\n\n const nativeTracer = getActiveNativeTracer();\n if (nativeTracer) {\n return nativeTracer.enterSpan(spanName, (nativeSpan) => {\n const ctxValue = createNativeTraceContext(nativeSpan, spanName, nativeTracer.correlationId);\n\n const onSuccess = (result: TReturn) => {\n if (options.attributes) {\n ctxValue.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n return result;\n };\n\n const onError = (error: unknown): never => failNativeContext(ctxValue, error);\n\n try {\n const result = fn(ctxValue);\n if (result instanceof Promise) {\n return result.then(onSuccess, onError);\n }\n return onSuccess(result);\n } catch (error) {\n return onError(error);\n }\n });\n }\n\n const tracer = otelTrace.getTracer('@autotel/edge');\n\n return tracer.startActiveSpan(spanName, (span) => {\n try {\n setSpanName(span, spanName);\n const ctxValue = createTraceContext(span);\n\n const onSuccess = (result: TReturn) => {\n span.setStatus({ code: SpanStatusCode.OK });\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value as AttributeValue);\n }\n }\n span.end();\n return result;\n };\n\n const onError = (error: unknown): never => {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.type',\n error instanceof Error ? error.constructor.name : 'Error');\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n };\n\n const result = fn(ctxValue);\n\n // Check if result is a Promise\n if (result instanceof Promise) {\n return result.then(onSuccess, onError);\n }\n\n return onSuccess(result);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n }\n });\n}\n\n// Sync overloads - Factory pattern with explicit return type helps TypeScript infer\n// Overload 1a: Plain sync function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => TReturn,\n): () => TReturn;\n// Overload 1b: Plain sync function (auto-inferred name)\nexport function trace<TArgs extends any[], TReturn = any>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 1c: Factory sync function with no args returning explicit type (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => TReturn,\n): () => TReturn;\n// Overload 1d: Immediate execution - sync function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n// Overload 1e: Factory sync function - use conditional type to extract signature (MUST come before generic)\n// This overload is more specific and helps TypeScript infer types from factory functions\nexport function trace<TFactory extends (ctx: TraceContext) => (...args: any[]) => any>(\n fnFactory: TFactory,\n): ExtractFunctionSignature<TFactory>;\n// Overload 1f: Generic factory sync function (fallback)\nexport function trace<TArgs extends any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2a: Name + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2b: Name + immediate execution sync with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 2c: Name + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3a: Options + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3b: Options + immediate execution sync with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 3c: Options + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Async overloads\n// Overload 4a: Plain async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4b: Plain async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 4c: Immediate execution - async function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n// Overload 4d: Factory async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4e: Factory async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5a: Name + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5b: Name + immediate execution async with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 5c: Name + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6a: Options + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6b: Options + immediate execution async with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 6c: Options + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Implementation\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnOrNameOrOptions:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>)\n | string\n | traceOptions<TArgs, TReturn>,\n maybeFn?:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>),\n): WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn> {\n // Handle: trace(fn) - single argument\n if (typeof fnOrNameOrOptions === 'function') {\n // Check if it's immediate execution pattern: (ctx) => result\n if (\n looksLikeTraceFactory(fnOrNameOrOptions as AnyFn) &&\n !isFactoryReturningFunction(fnOrNameOrOptions as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern\n return executeImmediately(\n fnOrNameOrOptions as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n {},\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n // Factory pattern or plain function\n return wrapFactoryWithTracing(\n fnOrNameOrOptions as (...args: TArgs) => TReturn,\n {} as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(name, fn) or trace(options, fn) - two arguments\n if (typeof fnOrNameOrOptions === 'string') {\n if (!maybeFn) {\n throw new Error('trace(name, fn): fn is required');\n }\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with name\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n { name: fnOrNameOrOptions },\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n { name: fnOrNameOrOptions } as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(options, fn)\n if (!maybeFn) {\n throw new Error('trace(options, fn): fn is required');\n }\n\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with options\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n fnOrNameOrOptions as traceOptions<any[], any>,\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n fnOrNameOrOptions as traceOptions<TArgs, TReturn>,\n );\n}\n\nexport function withTracing<TArgs extends any[] = any[], TReturn = any>(\n options: Omit<traceOptions<TArgs, TReturn>, 'name'>,\n) {\n return (\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>)\n ): WrappedFunction<TArgs, TReturn> => wrapFactoryWithTracing(fnOrFactory, options as traceOptions<TArgs, TReturn>);\n}\n\nfunction shouldSkip(key: string, fn: Function, skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[]): boolean {\n if (key.startsWith('_')) {\n return true;\n }\n\n if (!skip || skip.length === 0) {\n return false;\n }\n\n for (const pattern of skip) {\n if (typeof pattern === 'string' && key === pattern) {\n return true;\n }\n if (pattern instanceof RegExp && pattern.test(key)) {\n return true;\n }\n if (typeof pattern === 'function' && pattern(key, fn)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport interface InstrumentOptions extends traceOptions {\n functions: Record<string, any>;\n overrides?: Record<string, Partial<traceOptions>>;\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[];\n}\n\nexport function instrument<T extends Record<string, any>>(\n options: InstrumentOptions,\n): T {\n const { functions, ...tracingOptions } = options;\n const instrumented: Record<string, any> = {};\n\n for (const key of Object.keys(functions)) {\n const fn = functions[key];\n\n if (typeof fn !== 'function') {\n instrumented[key] = fn;\n continue;\n }\n\n if (shouldSkip(key, fn, tracingOptions.skip)) {\n instrumented[key] = fn;\n continue;\n }\n\n const fnOptions: traceOptions = {\n ...tracingOptions,\n ...tracingOptions.overrides?.[key],\n name: tracingOptions.overrides?.[key]?.name ?? tracingOptions.name,\n };\n\n const boundFn = fn.bind(functions);\n const fnFactory = (_ctx: TraceContext) => boundFn as AnyFn;\n\n instrumented[key] = wrapFactoryWithTracing(fnFactory, fnOptions, key);\n }\n\n return instrumented as T;\n}\n\nexport interface SpanOptions {\n name: string;\n attributes?: Record<string, string | number | boolean>;\n}\n\n// Aligned with trace(): accept a name string OR full SpanOptions as the first\n// argument so span() and trace() share the same calling conventions.\nexport function span<T = unknown>(name: string, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n name: string,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(options: SpanOptions, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(\n nameOrOptions: string | SpanOptions,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n const options: SpanOptions =\n typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions;\n const tracer = otelTrace.getTracer('autotel-edge');\n\n const execute = (span: Span) => {\n setSpanName(span, options.name);\n\n try {\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value);\n }\n }\n\n const result = fn(span);\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return value;\n })\n .catch((error) => {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n });\n }\n\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n };\n\n const nativeTracer = getActiveNativeTracer();\n if (nativeTracer) {\n const nativeResult = nativeTracer.enterSpan(options.name, (nativeSpan) =>\n execute(createNativeSpanShim(nativeSpan, nativeTracer.correlationId)),\n );\n if (nativeResult instanceof Promise) {\n return nativeResult;\n }\n return nativeResult as T;\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/**\n * `enterSpan(name, callback)` — a Cloudflare-familiar alias for {@link span}.\n *\n * Mirrors the shape of Cloudflare's `tracing.enterSpan()` so CF users can keep\n * the API they know, but with autotel superpowers: it works on every runtime\n * (not just Workers), supports `span.setAttributes()` bulk-set, and falls back\n * to autotel's OTLP pipeline when no native tracer is active. When a native\n * tracer *is* active (e.g. on a Worker with tracing enabled), the span nests\n * inside Cloudflare's native waterfall.\n */\nexport function enterSpan<T = unknown>(name: string, fn: (span: Span) => T): T;\nexport function enterSpan<T = unknown>(\n name: string,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function enterSpan<T = unknown>(\n name: string,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n return span(name, fn as (span: Span) => T);\n}\n","/**\n * Composition helpers for building autotel pipelines from small, testable parts.\n *\n * The motivation is the same as for any pipeline library: you can author\n * subscribers, post-processors and span processors as standalone units and\n * stitch them together at config-construction time without inventing ad-hoc\n * wrappers in every package.\n *\n * None of these helpers change runtime behaviour by themselves — they only\n * combine functions / processors that already work in isolation.\n */\nimport type { Span } from '@opentelemetry/api';\nimport type { ReadableSpan as SdkReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type {\n EdgeConfig,\n EdgeEvent,\n EdgeSubscriber,\n PostProcessorFn,\n ReadableSpan as EdgeReadableSpan,\n ResolveConfigFn,\n} from './types';\n\ntype Awaitable<T> = T | Promise<T>;\n\n/**\n * Identity helper for authoring an autotel configuration once with full\n * type-checking. Mirrors `defineConfig` patterns in tools like Vite / Vitest.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'autotel-edge'\n *\n * export const otelConfig = defineConfig({\n * service: { name: 'checkout' },\n * exporter: { url: process.env.OTLP_URL! },\n * })\n * ```\n */\nexport function defineConfig<T extends EdgeConfig | ResolveConfigFn>(config: T): T {\n return config;\n}\n\n/**\n * Run a list of subscribers in registration order. Errors thrown by an\n * individual subscriber are caught and logged so a buggy subscriber never\n * blocks the others — important because `subscribers` is the primary\n * extensibility point for in-process side effects.\n */\nexport function composeSubscribers(\n subscribers: Array<EdgeSubscriber>,\n options: { name?: string } = {},\n): EdgeSubscriber {\n const label = options.name ?? 'compose-subscribers';\n return async (event: EdgeEvent) => {\n for (const subscriber of subscribers) {\n try {\n await subscriber(event);\n } catch (err) {\n console.error(`[autotel-edge/${label}] subscriber failed:`, err);\n }\n }\n };\n}\n\n/**\n * Chain post-processors so each one sees the output of the previous one.\n * This matches the standard OTel post-processor contract: take spans, return\n * spans (possibly filtered, redacted, or annotated).\n */\nexport function composePostProcessors(\n processors: Array<PostProcessorFn>,\n): PostProcessorFn {\n return (spans: EdgeReadableSpan[]) => {\n let current = spans;\n for (const processor of processors) {\n try {\n current = processor(current);\n } catch (err) {\n console.error('[autotel-edge/compose-post-processors] failed:', err);\n }\n }\n return current;\n };\n}\n\n/**\n * Fan out span lifecycle events to multiple span processors. Any single\n * processor's failure is isolated so it cannot break the others.\n *\n * Useful when you want to attach, say, a sampling processor + a custom\n * attribute redactor + the default batch processor without having to author a\n * single processor that knows about all three.\n */\nexport function composeSpanProcessors(processors: SpanProcessor[]): SpanProcessor {\n const safe = (label: string, fn: () => Awaitable<void>) =>\n Promise.resolve()\n .then(fn)\n .catch((err) => {\n console.error(`[autotel-edge/compose-span-processors:${label}]`, err);\n });\n\n return {\n onStart(span: Span, parentContext) {\n for (const processor of processors) {\n try {\n processor.onStart(span as unknown as SdkReadableSpan & Span, parentContext);\n } catch (err) {\n console.error('[autotel-edge/compose-span-processors:onStart]', err);\n }\n }\n },\n onEnd(span: SdkReadableSpan) {\n for (const processor of processors) {\n try {\n processor.onEnd(span);\n } catch (err) {\n console.error('[autotel-edge/compose-span-processors:onEnd]', err);\n }\n }\n },\n async forceFlush() {\n await Promise.allSettled(\n processors.map((p) => safe('forceFlush', () => p.forceFlush())),\n );\n },\n async shutdown() {\n await Promise.allSettled(\n processors.map((p) => safe('shutdown', () => p.shutdown())),\n );\n },\n } as SpanProcessor;\n}\n","export type Awaitable<T> = T | Promise<T>;\n\nexport interface PluginHookContexts<\n TSetup = unknown,\n TEnrich = unknown,\n TDrain = unknown,\n TKeep = unknown,\n TRequestStart = unknown,\n TRequestFinish = unknown,\n TClientLog = unknown,\n TLogger = unknown,\n> {\n setup: TSetup;\n enrich: TEnrich;\n drain: TDrain;\n keep: TKeep;\n requestStart: TRequestStart;\n requestFinish: TRequestFinish;\n clientLog: TClientLog;\n logger: TLogger;\n}\n\nexport type DefaultPluginContexts = PluginHookContexts;\n\nexport interface EdgePlugin<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n> {\n name: string;\n setup?: (ctx: Ctx['setup']) => Awaitable<void>;\n enrich?: (ctx: Ctx['enrich']) => Awaitable<void>;\n drain?: (ctx: Ctx['drain']) => Awaitable<void>;\n keep?: (ctx: Ctx['keep']) => Awaitable<void>;\n onRequestStart?: (ctx: Ctx['requestStart']) => void;\n onRequestFinish?: (ctx: Ctx['requestFinish']) => void;\n onClientLog?: (ctx: Ctx['clientLog']) => void;\n extendLogger?: (logger: Ctx['logger']) => void;\n}\n\nexport interface PluginRunner<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n> {\n readonly plugins: readonly EdgePlugin<Ctx>[];\n readonly hasEnrich: boolean;\n readonly hasDrain: boolean;\n readonly hasKeep: boolean;\n readonly hasRequestLifecycle: boolean;\n readonly hasClientLog: boolean;\n readonly hasExtendLogger: boolean;\n applyExtendLogger: (logger: Ctx['logger']) => void;\n runOnRequestStart: (ctx: Ctx['requestStart']) => void;\n runOnRequestFinish: (ctx: Ctx['requestFinish']) => void;\n runOnClientLog: (ctx: Ctx['clientLog']) => void;\n runSetup: (ctx: Ctx['setup']) => Promise<void>;\n runEnrich: (ctx: Ctx['enrich']) => Promise<void>;\n runDrain: (ctx: Ctx['drain']) => Promise<void>;\n runKeep: (ctx: Ctx['keep']) => Promise<void>;\n}\n\nexport interface PluginRunnerOptions {\n logger?: Pick<Console, 'error'>;\n}\n\nfunction logPluginError(\n logger: Pick<Console, 'error'>,\n name: string,\n hook: string,\n error: unknown,\n): void {\n logger.error(`[autotel-edge/${name}] ${hook} failed:`, error);\n}\n\nexport function definePlugin<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n>(plugin: EdgePlugin<Ctx>): EdgePlugin<Ctx> {\n return plugin;\n}\n\nexport function createPluginRunner<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n>(\n plugins: EdgePlugin<Ctx>[] = [],\n options: PluginRunnerOptions = {},\n): PluginRunner<Ctx> {\n const errorLogger = options.logger ?? console;\n const byName = new Map<string, EdgePlugin<Ctx>>();\n\n // De-duplicate by plugin name while preserving registration order semantics.\n // The last plugin with a given name wins.\n for (const plugin of plugins) {\n byName.set(plugin.name, plugin);\n }\n\n const list = Array.from(byName.values());\n\n const hasEnrich = list.some((p) => typeof p.enrich === 'function');\n const hasDrain = list.some((p) => typeof p.drain === 'function');\n const hasKeep = list.some((p) => typeof p.keep === 'function');\n const hasRequestLifecycle = list.some(\n (p) =>\n typeof p.onRequestStart === 'function' ||\n typeof p.onRequestFinish === 'function',\n );\n const hasClientLog = list.some((p) => typeof p.onClientLog === 'function');\n const hasExtendLogger = list.some(\n (p) => typeof p.extendLogger === 'function',\n );\n\n return {\n plugins: list,\n hasEnrich,\n hasDrain,\n hasKeep,\n hasRequestLifecycle,\n hasClientLog,\n hasExtendLogger,\n\n applyExtendLogger(logger) {\n for (const plugin of list) {\n if (!plugin.extendLogger) continue;\n try {\n plugin.extendLogger(logger);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'extendLogger', err);\n }\n }\n },\n\n runOnRequestStart(ctx) {\n for (const plugin of list) {\n if (!plugin.onRequestStart) continue;\n try {\n plugin.onRequestStart(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onRequestStart', err);\n }\n }\n },\n\n runOnRequestFinish(ctx) {\n for (const plugin of list) {\n if (!plugin.onRequestFinish) continue;\n try {\n plugin.onRequestFinish(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onRequestFinish', err);\n }\n }\n },\n\n runOnClientLog(ctx) {\n for (const plugin of list) {\n if (!plugin.onClientLog) continue;\n try {\n plugin.onClientLog(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onClientLog', err);\n }\n }\n },\n\n async runSetup(ctx) {\n for (const plugin of list) {\n if (!plugin.setup) continue;\n try {\n await plugin.setup(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'setup', err);\n }\n }\n },\n\n async runEnrich(ctx) {\n for (const plugin of list) {\n if (!plugin.enrich) continue;\n try {\n await plugin.enrich(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'enrich', err);\n }\n }\n },\n\n async runDrain(ctx) {\n const drains = list.filter((p) => typeof p.drain === 'function');\n if (drains.length === 0) return;\n\n await Promise.allSettled(\n drains.map(async (plugin) => {\n try {\n await plugin.drain!(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'drain', err);\n }\n }),\n );\n },\n\n async runKeep(ctx) {\n for (const plugin of list) {\n if (!plugin.keep) continue;\n try {\n await plugin.keep(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'keep', err);\n }\n }\n },\n };\n}\n\nconst emptyRunner = createPluginRunner([]);\n\nexport function getEmptyPluginRunner(): PluginRunner {\n return emptyRunner;\n}\n","import type { RouteServiceConfig } from './types';\n\nexport type Awaitable<T> = T | Promise<T>;\n\nexport function matchesRoutePattern(path: string, pattern: string): boolean {\n const regexPattern = pattern\n .replaceAll(/[.+^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n .replaceAll('**', '{{GLOBSTAR}}')\n .replaceAll('*', '[^/]*')\n .replaceAll('{{GLOBSTAR}}', '.*')\n .replaceAll('?', '[^/]');\n return new RegExp(`^${regexPattern}$`).test(path);\n}\n\nexport interface RouteFilterOptions {\n include?: string[];\n exclude?: string[];\n}\n\nexport function shouldInstrumentPath(\n path: string,\n options: RouteFilterOptions = {},\n): boolean {\n const { include, exclude } = options;\n\n if (exclude && exclude.some((pattern) => matchesRoutePattern(path, pattern))) {\n return false;\n }\n\n if (!include || include.length === 0) {\n return true;\n }\n\n return include.some((pattern) => matchesRoutePattern(path, pattern));\n}\n\nexport function getServiceForPath(\n path: string,\n routes?: Record<string, RouteServiceConfig>,\n): string | undefined {\n if (!routes) return undefined;\n\n for (const [pattern, config] of Object.entries(routes)) {\n if (matchesRoutePattern(path, pattern)) {\n return config.service;\n }\n }\n\n return undefined;\n}\n\nexport interface MiddlewareFinishContext<TEvent, TRequest = unknown> {\n event: TEvent;\n request: TRequest;\n status?: number;\n}\n\nexport interface MiddlewarePipelineOptions<TEvent, TRequest = unknown> {\n enrichers?: Array<\n (ctx: MiddlewareFinishContext<TEvent, TRequest>) => Awaitable<void>\n >;\n drains?: Array<\n (ctx: MiddlewareFinishContext<TEvent, TRequest>) => Awaitable<void>\n >;\n logger?: Pick<Console, 'error'>;\n}\n\nexport async function runMiddlewareFinishPipeline<TEvent, TRequest = unknown>(\n ctx: MiddlewareFinishContext<TEvent, TRequest>,\n options: MiddlewarePipelineOptions<TEvent, TRequest> = {},\n): Promise<void> {\n const logger = options.logger ?? console;\n\n for (const enrich of options.enrichers ?? []) {\n try {\n await enrich(ctx);\n } catch (err) {\n logger.error('[autotel-edge/middleware] enricher failed:', err);\n }\n }\n\n const drains = options.drains ?? [];\n if (drains.length === 0) return;\n\n await Promise.allSettled(\n drains.map(async (drain) => {\n try {\n await drain(ctx);\n } catch (err) {\n logger.error('[autotel-edge/middleware] drain failed:', err);\n }\n }),\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["v","api_context","trace","optionsWithSampler","api_context","otelTrace"],"sources":["../src/core/span.ts","../src/core/tracer.ts","../src/core/context.ts","../src/core/provider.ts","../src/core/buffer.ts","../src/core/native-bridge.ts","../src/functional.ts","../src/composition.ts","../src/plugin-runner.ts","../src/middleware-toolkit.ts"],"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, context as otelContext } 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// Single canonical AsyncLocalStorage context manager for the whole runtime.\n// `context.setGlobalContextManager()` is a one-shot global, so we register once\n// and reuse. Both the OTLP provider and the native-tracing path depend on this\n// being registered — otherwise OTel context (the active span, the native\n// tracer) does not propagate across `await` boundaries.\nlet globalContextManager: AsyncLocalStorageContextManager | undefined;\n\n/**\n * Ensure a global AsyncLocalStorage context manager is registered, returning it.\n * Idempotent.\n */\nexport function ensureGlobalContextManager(): AsyncLocalStorageContextManager {\n if (!globalContextManager) {\n const manager = new AsyncLocalStorageContextManager();\n manager.enable();\n otelContext.setGlobalContextManager(manager);\n globalContextManager = manager;\n }\n return globalContextManager;\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 { ensureGlobalContextManager } from './context';\n\n/**\n * WorkerTracerProvider - Registers tracer globally\n */\nexport class WorkerTracerProvider {\n private tracer: WorkerTracer;\n\n constructor(spanProcessors: SpanProcessor[], resource: Resource) {\n this.tracer = new WorkerTracer(spanProcessors, resource);\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 * Registers the global context manager so context — and the active span —\n * propagates across `await` boundaries (without it the API uses a no-op\n * manager and `trace.getActiveSpan()` returns undefined after the first\n * await), then installs the tracer provider.\n */\n register(): void {\n ensureGlobalContextManager();\n\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// Re-export the single imported binding. Importing AND re-exporting `Buffer`\n// from 'node:buffer' separately makes rolldown (tsdown) emit a dangling\n// `Buffer$1` reference, so keep exactly one binding.\nexport { Buffer };","/**\n * Native span bridge\n *\n * A runtime-agnostic seam that lets autotel's `span()` / `trace()` functional\n * API transparently emit *platform-native* spans when one is available, instead\n * of going through autotel's own OpenTelemetry tracer + OTLP exporter.\n *\n * The concrete native tracer is supplied by a runtime adapter package (e.g.\n * `autotel-cloudflare`, which wraps Cloudflare's `tracing.enterSpan()` /\n * `ctx.tracing`). autotel-edge itself never imports any runtime module — the\n * adapter installs a {@link NativeTracer} into the active OpenTelemetry context\n * with {@link withNativeTracer}, and the functional API reads it back with\n * {@link getActiveNativeTracer}.\n *\n * Native span surfaces are deliberately minimal (Cloudflare's `Span` exposes\n * only `setAttribute` + `isTraced`), so the adapters below degrade autotel's\n * richer `TraceContext` / OTel `Span` API gracefully. See the degradation map\n * in `docs/CLOUDFLARE-NATIVE-TRACING.md`.\n */\n\nimport {\n context as api_context,\n createContextKey,\n INVALID_SPAN_CONTEXT,\n SpanStatusCode,\n type AttributeValue,\n type Context,\n type Span,\n type SpanContext,\n} from '@opentelemetry/api';\nimport type { TraceContext } from './trace-context';\n\n/**\n * The minimal span surface every native runtime is expected to provide.\n * Modelled on Cloudflare Workers' custom-span `Span`.\n */\nexport interface NativeSpanHandle {\n /** Whether this invocation is actually being recorded (head sampling). */\n readonly isTraced: boolean;\n /** Set a single primitive attribute. `undefined` is a no-op. */\n setAttribute(key: string, value: string | number | boolean | undefined): void;\n /**\n * Optional — not provided by Cloudflare today, but reserved so autotel\n * auto-upgrades to real trace/span ids the moment the platform exposes them,\n * with no API change. When present and valid, its ids take precedence over\n * the fallback correlation id.\n */\n spanContext?(): SpanContext;\n}\n\n/**\n * A native tracer creates spans scoped to a callback, auto-nesting by async\n * context. Modelled on Cloudflare's `tracing.enterSpan(name, callback)`.\n */\nexport interface NativeTracer {\n enterSpan<T>(name: string, callback: (span: NativeSpanHandle) => T): T;\n /**\n * Optional per-request correlation id surfaced as `ctx.correlationId` (and a\n * `correlation.id` span attribute) when the platform does not yet expose\n * span ids. On Cloudflare this is the `cf-ray` id, so logs, custom spans, and\n * the dashboard all share one queryable key today.\n */\n readonly correlationId?: string;\n}\n\nconst INVALID_TRACE_ID = INVALID_SPAN_CONTEXT.traceId;\n\n/**\n * Resolve trace ids for a native span. Prefers real ids from a (future)\n * `spanContext()`; otherwise falls back to the supplied correlation id.\n */\nfunction resolveSpanIds(\n span: NativeSpanHandle,\n fallbackCorrelationId?: string,\n): { traceId: string; spanId: string; correlationId: string } {\n const sc = span.spanContext?.();\n if (sc && sc.traceId && sc.traceId !== INVALID_TRACE_ID) {\n return {\n traceId: sc.traceId,\n spanId: sc.spanId,\n correlationId: sc.traceId.slice(0, 16),\n };\n }\n return {\n traceId: '',\n spanId: '',\n correlationId: fallbackCorrelationId ?? '',\n };\n}\n\nconst NATIVE_TRACER_KEY = createContextKey('autotel-native-tracer');\n\n/**\n * Return a context with the given native tracer installed. Runtime adapters\n * call this once per request and run the handler inside it so that nested\n * `span()` / `trace()` calls route to the native tracer.\n */\nexport function withNativeTracer(\n tracer: NativeTracer,\n context: Context = api_context.active(),\n): Context {\n return context.setValue(NATIVE_TRACER_KEY, tracer);\n}\n\n/**\n * Read the native tracer from the active context, if one was installed.\n * Returns `null` when running without a native tracer (other edge runtimes,\n * native tracing disabled, local dev) — callers then fall back to the OTel path.\n */\nexport function getActiveNativeTracer(): NativeTracer | null {\n const value = api_context.active().getValue(NATIVE_TRACER_KEY) as\n | NativeTracer\n | undefined;\n return value ?? null;\n}\n\n/**\n * Coerce an arbitrary attribute value to the primitive subset native spans\n * accept. Arrays/objects are JSON-stringified; `undefined`/`null` are dropped.\n */\nfunction coerceAttribute(\n value: unknown,\n): string | number | boolean | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction applyAttributes(\n span: NativeSpanHandle,\n attributes: Record<string, unknown>,\n): void {\n for (const [key, value] of Object.entries(attributes)) {\n span.setAttribute(key, coerceAttribute(value));\n }\n}\n\n// Degradation primitives shared by the TraceContext and OTel-Span adapters,\n// so both surfaces map onto the thin native span identically.\n\nfunction nativeSetErrorStatus(span: NativeSpanHandle, message?: string): void {\n span.setAttribute('otel.status_code', 'ERROR');\n span.setAttribute('error', true);\n if (message) {\n span.setAttribute('otel.status_description', message);\n }\n}\n\nfunction nativeRecordException(span: NativeSpanHandle, exception: unknown): void {\n const error =\n exception instanceof Error ? exception : new Error(String(exception));\n span.setAttribute('exception.type', error.name);\n span.setAttribute('exception.message', error.message);\n // Platform attributes console output to the active native span.\n console.error(error);\n}\n\nfunction nativeAddEvent(\n eventName: string,\n attributesOrStartTime?: unknown,\n): void {\n if (\n attributesOrStartTime &&\n typeof attributesOrStartTime === 'object' &&\n !Array.isArray(attributesOrStartTime)\n ) {\n console.log(eventName, attributesOrStartTime);\n } else {\n console.log(eventName);\n }\n}\n\n/**\n * Build an autotel {@link TraceContext} backed by a native span.\n *\n * Degradation (native surface is thinner than OTel):\n * - `traceId`/`spanId` → real ids when the platform exposes `spanContext()`\n * (auto-upgrades in future), otherwise `''`.\n * - `correlationId` → real-id-derived when available, else the supplied\n * `correlationId` (e.g. Cloudflare `cf-ray`). Also written as a\n * `correlation.id` span attribute so it is queryable in the backend.\n * - `setStatus(ERROR)` → records `otel.status_code` + `error` attributes.\n * - `recordException` → attributes + `console.error` (attributed to the span).\n * - `addEvent` → `console.log(name, attrs)` (attributed to the span).\n * - `addLink`/`addLinks`/`updateName` → no-ops.\n */\nexport function createNativeTraceContext(\n span: NativeSpanHandle,\n name: string,\n correlationId?: string,\n): TraceContext {\n const ids = resolveSpanIds(span, correlationId);\n if (ids.correlationId) {\n span.setAttribute('correlation.id', ids.correlationId);\n }\n return {\n traceId: ids.traceId,\n spanId: ids.spanId,\n correlationId: ids.correlationId,\n 'code.function': name,\n setAttribute: (key, value) =>\n span.setAttribute(key, coerceAttribute(value)),\n setAttributes: (attrs) =>\n applyAttributes(span, attrs as Record<string, unknown>),\n setStatus: (status) => {\n if (status.code === SpanStatusCode.ERROR) {\n nativeSetErrorStatus(span, status.message);\n }\n },\n recordException: (exception) => nativeRecordException(span, exception),\n addEvent: (eventName, attributesOrStartTime) =>\n nativeAddEvent(eventName, attributesOrStartTime),\n addLink: () => {},\n addLinks: () => {},\n updateName: () => {},\n isRecording: () => span.isTraced,\n };\n}\n\n/**\n * Build a minimal OpenTelemetry {@link Span} backed by a native span, for the\n * `span(name, (span) => ...)` callback whose argument is typed as an OTel Span.\n * Unsupported operations degrade exactly as in {@link createNativeTraceContext}.\n */\nexport function createNativeSpanShim(\n span: NativeSpanHandle,\n correlationId?: string,\n): Span {\n // Surface the correlation id as a queryable attribute (parity with\n // createNativeTraceContext), preferring real ids when the platform has them.\n const ids = resolveSpanIds(span, correlationId);\n if (ids.correlationId) {\n span.setAttribute('correlation.id', ids.correlationId);\n }\n // Prefer the platform's real span context when it becomes available;\n // otherwise expose an invalid context (Cloudflare has no spanContext yet).\n const spanContext: SpanContext = span.spanContext?.() ?? INVALID_SPAN_CONTEXT;\n const shim: Partial<Span> = {\n spanContext: () => spanContext,\n setAttribute(key: string, value: AttributeValue) {\n span.setAttribute(key, coerceAttribute(value));\n return shim as Span;\n },\n setAttributes(attributes) {\n applyAttributes(span, attributes as Record<string, unknown>);\n return shim as Span;\n },\n addEvent(eventName, attributesOrStartTime) {\n nativeAddEvent(eventName, attributesOrStartTime);\n return shim as Span;\n },\n addLink: () => shim as Span,\n addLinks: () => shim as Span,\n setStatus(status) {\n if (status.code === SpanStatusCode.ERROR) {\n nativeSetErrorStatus(span, status.message);\n }\n return shim as Span;\n },\n updateName: () => shim as Span,\n end: () => {},\n isRecording: () => span.isTraced,\n recordException: (exception) => nativeRecordException(span, exception),\n };\n return shim as Span;\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';\nimport {\n getActiveNativeTracer,\n createNativeTraceContext,\n createNativeSpanShim,\n type NativeTracer,\n} from './core/native-bridge';\n\n// Re-export for convenience\nexport type { TraceContext } from './core/trace-context';\n\ntype AnyFn = (...args: any[]) => any;\n\nconst TRACE_FACTORY_MARK = '__autotelEdgeTraceFactory';\nconst INSTRUMENTED_MARK = '__autotelEdgeInstrumented';\nconst FACTORY_NAME_HINTS: Record<string, true> = {\n ctx: true,\n _ctx: true,\n context: true,\n tracecontext: true,\n tracectx: true,\n};\n\nconst SINGLE_LINE_COMMENT_REGEX = /\\/\\/.*$/gm;\nconst MULTI_LINE_COMMENT_REGEX = /\\/\\*[\\s\\S]*?\\*\\//gm;\nconst PARAM_TOKEN_SANITIZE_REGEX = new RegExp(String.raw`[{}\\[\\]\\s]`, 'g');\n\ninterface TraceFactoryMarked {\n [TRACE_FACTORY_MARK]?: true;\n}\n\nfunction markAsTraceFactory(fn: AnyFn): void {\n try {\n Object.defineProperty(fn, TRACE_FACTORY_MARK, {\n value: true,\n configurable: true,\n });\n } catch {\n (fn as TraceFactoryMarked)[TRACE_FACTORY_MARK] = true;\n }\n}\n\nfunction hasFactoryMark(fn: AnyFn): boolean {\n return Boolean((fn as TraceFactoryMarked)[TRACE_FACTORY_MARK]);\n}\n\nfunction sanitizeParameterToken(token: string): string {\n const [firstToken] = token.split('=');\n return (firstToken ?? '').replaceAll(PARAM_TOKEN_SANITIZE_REGEX, '').trim();\n}\n\nfunction getFirstParameterToken(fn: AnyFn): string | null {\n let source = Function.prototype.toString.call(fn);\n source = source\n .replaceAll(MULTI_LINE_COMMENT_REGEX, '')\n .replaceAll(SINGLE_LINE_COMMENT_REGEX, '')\n .trim();\n\n const arrowMatch = source.match(/^(?:async\\s*)?(?:\\(([^)]*)\\)|([^=()]+))\\s*=>/);\n if (arrowMatch) {\n const params = (arrowMatch[1] ?? arrowMatch[2] ?? '').split(',');\n const first = params[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n return null;\n }\n\n const functionMatch = source.match(/^[^(]*\\(([^)]*)\\)/);\n if (functionMatch) {\n const params = functionMatch[1]?.split(',');\n const first = params?.[0]?.trim();\n if (first) {\n return sanitizeParameterToken(first);\n }\n }\n\n return null;\n}\n\nfunction looksLikeTraceFactory(fn: AnyFn): boolean {\n if (hasFactoryMark(fn)) {\n return true;\n }\n\n if (fn.length === 0) {\n return false;\n }\n\n const firstParam = getFirstParameterToken(fn);\n if (!firstParam) {\n return false;\n }\n\n const normalized = firstParam.toLowerCase();\n if (\n Object.hasOwn(FACTORY_NAME_HINTS, normalized) ||\n normalized.startsWith('ctx') ||\n normalized.startsWith('_ctx') ||\n normalized.startsWith('trace')\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if a function that takes ctx returns another function (factory pattern)\n * vs returning a value directly (immediate execution pattern)\n */\nfunction isFactoryReturningFunction(\n fnWithCtx: (ctx: TraceContext) => unknown,\n): boolean {\n try {\n const result = fnWithCtx(createDummyCtx());\n return typeof result === 'function';\n } catch {\n // If the function throws when called with dummy ctx, assume it's immediate execution\n // since factory functions typically just return a function and don't execute logic\n return false;\n }\n}\n\nfunction isTraceFactoryFunction<TArgs extends any[], TReturn>(\n fn:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): fn is (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (typeof fn !== 'function') {\n return false;\n }\n\n if (hasFactoryMark(fn as AnyFn)) {\n return true;\n }\n\n if (looksLikeTraceFactory(fn as AnyFn)) {\n markAsTraceFactory(fn as AnyFn);\n return true;\n }\n\n return false;\n}\n\nfunction ensureTraceFactory<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n): (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn> {\n if (isTraceFactoryFunction(fnOrFactory)) {\n return fnOrFactory;\n }\n\n const plainFn = fnOrFactory as (...args: TArgs) => TReturn | Promise<TReturn>;\n const factory = (ctx: TraceContext) => {\n void ctx;\n return plainFn;\n };\n markAsTraceFactory(factory);\n return factory;\n}\n\ntype ExtractFunctionSignature<T> = T extends (ctx: TraceContext) => infer F\n ? F extends (...args: infer Args) => infer Return\n ? (...args: Args) => Return\n : never\n : never;\n\ntype WrappedFunction<TArgs extends any[], TReturn> = (...args: TArgs) => TReturn | Promise<TReturn>;\n\n/**\n * trace function options\n */\nexport interface traceOptions<TArgs extends any[] = any[], TReturn = any> {\n name?: string;\n serviceName?: string;\n sampler?: Sampler;\n attributesFromArgs?: (args: TArgs) => Record<string, unknown>;\n attributesFromResult?: (result: TReturn) => Record<string, unknown>;\n attributes?: Record<string, unknown>;\n}\n\nconst MAX_ERROR_MESSAGE_LENGTH = 500;\n\nfunction createDummyCtx(): TraceContext {\n return {\n traceId: '',\n spanId: '',\n correlationId: '',\n setAttribute: () => {},\n setAttributes: () => {},\n setStatus: () => {},\n recordException: () => {},\n addEvent: () => {},\n addLink: () => {},\n addLinks: () => {},\n updateName: () => {},\n isRecording: () => false,\n } as TraceContext;\n}\n\nfunction truncateErrorMessage(message: string): string {\n if (message.length <= MAX_ERROR_MESSAGE_LENGTH) {\n return message;\n }\n return `${message.slice(0, MAX_ERROR_MESSAGE_LENGTH)}... (truncated)`;\n}\n\n/**\n * Record an error onto a native trace context (status + exception) and rethrow.\n * Shared by every native-span code path so the error degradation is identical.\n */\nfunction failNativeContext(ctx: TraceContext, error: unknown): never {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n ),\n });\n ctx.recordException(error instanceof Error ? error : new Error(String(error)));\n throw error;\n}\n\n/**\n * Run a factory-produced function inside a native span, applying the same\n * options (attributes / attributesFromArgs / attributesFromResult / code.function)\n * and error degradation as the OTel path. Handles both sync and async functions\n * by branching on the returned value, so async/sync callers share one impl.\n */\nfunction runFactoryInNativeSpan<TArgs extends any[], TReturn>(\n nativeTracer: NativeTracer,\n spanName: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>,\n options: traceOptions<TArgs, TReturn>,\n args: TArgs,\n): TReturn | Promise<TReturn> {\n return nativeTracer.enterSpan(spanName, (nativeSpan) => {\n const ctx = createNativeTraceContext(nativeSpan, spanName, nativeTracer.correlationId);\n const actualFn = fnFactory(ctx);\n\n if (options.attributes) {\n ctx.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n if (options.attributesFromArgs) {\n ctx.setAttributes(options.attributesFromArgs(args) as Record<string, AttributeValue>);\n }\n\n const onSuccess = (result: TReturn): TReturn => {\n if (options.attributesFromResult) {\n ctx.setAttributes(options.attributesFromResult(result) as Record<string, AttributeValue>);\n }\n ctx.setAttribute('code.function', spanName);\n return result;\n };\n const onError = (error: unknown): never => {\n ctx.setAttribute('code.function', spanName);\n return failNativeContext(ctx, error);\n };\n\n try {\n const result = actualFn(...args);\n return result instanceof Promise\n ? (result.then(onSuccess, onError) as Promise<TReturn>)\n : onSuccess(result as TReturn);\n } catch (error) {\n return onError(error);\n }\n });\n}\n\ntype InstrumentableFunction<TArgs extends any[] = any[], TReturn = any> = ((\n ...args: TArgs\n) => TReturn | Promise<TReturn>) & {\n displayName?: string;\n name?: string;\n};\n\nfunction inferFunctionName<TArgs extends any[] = any[], TReturn = any>(\n fn: InstrumentableFunction<TArgs, TReturn>,\n): string | undefined {\n const displayName = (fn as { displayName?: string }).displayName;\n if (displayName) {\n return displayName;\n }\n\n if (fn.name && fn.name !== 'anonymous') {\n return fn.name;\n }\n\n const source = Function.prototype.toString.call(fn);\n const match = source.match(/function\\s+([^(\\s]+)/);\n if (match && match[1] && match[1] !== 'anonymous') {\n return match[1];\n }\n\n return undefined;\n}\n\nfunction getSpanName<TArgs extends any[], TReturn>(\n options: traceOptions<TArgs, TReturn>,\n fn: InstrumentableFunction<TArgs, TReturn>,\n variableName?: string,\n): string {\n if (options.name) {\n return options.name;\n }\n\n let fnName = variableName ?? inferFunctionName(fn);\n fnName = fnName || 'anonymous';\n\n if (options.serviceName) {\n return `${options.serviceName}.${fnName}`;\n }\n\n if (fnName && fnName !== 'anonymous') {\n return fnName;\n }\n\n return 'unknown';\n}\n\nfunction isAsyncFunction(fn: unknown): boolean {\n return typeof fn === 'function' && fn.constructor?.name === 'AsyncFunction';\n}\n\nfunction wrapWithTracingAsync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => Promise<TReturn> {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = async function wrappedFunction(this: unknown, ...args: TArgs): Promise<TReturn> {\n const nativeTracer = getActiveNativeTracer();\n if (nativeTracer) {\n return runFactoryInNativeSpan(nativeTracer, spanName, fnFactory, options, args) as Promise<TReturn>;\n }\n\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, async (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = await actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_MARK] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapWithTracingSync<TArgs extends any[], TReturn>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): (...args: TArgs) => TReturn {\n const tempFn = fnFactory(createDummyCtx());\n const spanName = getSpanName(options, tempFn, variableName);\n\n const wrappedFunction = function wrappedFunction(this: unknown, ...args: TArgs): TReturn {\n const nativeTracer = getActiveNativeTracer();\n if (nativeTracer) {\n return runFactoryInNativeSpan(nativeTracer, spanName, fnFactory, options, args) as TReturn;\n }\n\n const tracer = otelTrace.getTracer('autotel-edge');\n const spanOptions: Record<string, unknown> = options.sampler ? { sampler: options.sampler } : {};\n\n return tracer.startActiveSpan(spanName, spanOptions, (span) => {\n setSpanName(span, spanName);\n\n try {\n const actualFn = fnFactory(createTraceContext(span));\n\n if (options.attributes) {\n span.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n\n if (options.attributesFromArgs) {\n const argsAttrs = options.attributesFromArgs(args);\n span.setAttributes(argsAttrs as Record<string, AttributeValue>);\n }\n\n const result = actualFn(...args);\n\n if (options.attributesFromResult) {\n const resultAttrs = options.attributesFromResult(result as TReturn);\n span.setAttributes(resultAttrs as Record<string, AttributeValue>);\n }\n\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', spanName);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n });\n };\n\n Object.defineProperty(wrappedFunction, 'name', {\n value: tempFn.name || 'trace',\n configurable: true,\n });\n\n (wrappedFunction as any)[INSTRUMENTED_MARK] = true;\n\n return wrappedFunction;\n}\n\nfunction wrapFactoryWithTracing<TArgs extends any[], TReturn>(\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>),\n options: traceOptions<TArgs, TReturn>,\n variableName?: string,\n): WrappedFunction<TArgs, TReturn> {\n const factory = ensureTraceFactory(fnOrFactory);\n const sampleFn = factory(createDummyCtx());\n const useAsyncWrapper = isAsyncFunction(sampleFn);\n\n if (useAsyncWrapper) {\n return wrapWithTracingAsync(\n factory as (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n }\n\n return wrapWithTracingSync(\n factory as (ctx: TraceContext) => (...args: TArgs) => TReturn,\n options,\n variableName,\n ) as WrappedFunction<TArgs, TReturn>;\n}\n\n/**\n * Execute a function immediately within a trace span\n * Used for the immediate execution pattern: trace((ctx) => result)\n */\nfunction executeImmediately<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn | Promise<TReturn>,\n options: traceOptions<any[], any>,\n): TReturn | Promise<TReturn> {\n const spanName = options.name || 'anonymous';\n\n const nativeTracer = getActiveNativeTracer();\n if (nativeTracer) {\n return nativeTracer.enterSpan(spanName, (nativeSpan) => {\n const ctxValue = createNativeTraceContext(nativeSpan, spanName, nativeTracer.correlationId);\n\n const onSuccess = (result: TReturn) => {\n if (options.attributes) {\n ctxValue.setAttributes(options.attributes as Record<string, AttributeValue>);\n }\n return result;\n };\n\n const onError = (error: unknown): never => failNativeContext(ctxValue, error);\n\n try {\n const result = fn(ctxValue);\n if (result instanceof Promise) {\n return result.then(onSuccess, onError);\n }\n return onSuccess(result);\n } catch (error) {\n return onError(error);\n }\n });\n }\n\n const tracer = otelTrace.getTracer('@autotel/edge');\n\n return tracer.startActiveSpan(spanName, (span) => {\n try {\n setSpanName(span, spanName);\n const ctxValue = createTraceContext(span);\n\n const onSuccess = (result: TReturn) => {\n span.setStatus({ code: SpanStatusCode.OK });\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value as AttributeValue);\n }\n }\n span.end();\n return result;\n };\n\n const onError = (error: unknown): never => {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.type',\n error instanceof Error ? error.constructor.name : 'Error');\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n };\n\n const result = fn(ctxValue);\n\n // Check if result is a Promise\n if (result instanceof Promise) {\n return result.then(onSuccess, onError);\n }\n\n return onSuccess(result);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n const truncatedMessage = truncateErrorMessage(errorMessage);\n\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: truncatedMessage,\n });\n\n span.setAttribute('error', true);\n span.setAttribute('exception.message', truncatedMessage);\n\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n span.end();\n throw error;\n }\n });\n}\n\n// Sync overloads - Factory pattern with explicit return type helps TypeScript infer\n// Overload 1a: Plain sync function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => TReturn,\n): () => TReturn;\n// Overload 1b: Plain sync function (auto-inferred name)\nexport function trace<TArgs extends any[], TReturn = any>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 1c: Factory sync function with no args returning explicit type (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => TReturn,\n): () => TReturn;\n// Overload 1d: Immediate execution - sync function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n// Overload 1e: Factory sync function - use conditional type to extract signature (MUST come before generic)\n// This overload is more specific and helps TypeScript infer types from factory functions\nexport function trace<TFactory extends (ctx: TraceContext) => (...args: any[]) => any>(\n fnFactory: TFactory,\n): ExtractFunctionSignature<TFactory>;\n// Overload 1f: Generic factory sync function (fallback)\nexport function trace<TArgs extends any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2a: Name + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 2b: Name + immediate execution sync with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 2c: Name + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3a: Options + plain sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Overload 3b: Options + immediate execution sync with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => TReturn,\n): TReturn;\n\n// Overload 3c: Options + factory sync function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn;\n\n// Async overloads\n// Overload 4a: Plain async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fn: () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4b: Plain async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 4c: Immediate execution - async function with context (NEW PATTERN)\nexport function trace<TReturn = any>(\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n// Overload 4d: Factory async function with no args (auto-inferred name)\nexport function trace<TReturn = any>(\n fnFactory: (ctx: TraceContext) => () => Promise<TReturn>,\n): () => Promise<TReturn>;\n// Overload 4e: Factory async function (auto-inferred name)\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5a: Name + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 5b: Name + immediate execution async with context\nexport function trace<TReturn = any>(\n name: string,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 5c: Name + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n name: string,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6a: Options + plain async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Overload 6b: Options + immediate execution async with context\nexport function trace<TReturn = any>(\n options: traceOptions<[], TReturn>,\n fn: (ctx: TraceContext) => Promise<TReturn>,\n): Promise<TReturn>;\n\n// Overload 6c: Options + factory async function\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n options: traceOptions<TArgs, TReturn>,\n fnFactory: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn>;\n\n// Implementation\nexport function trace<TArgs extends any[] = any[], TReturn = any>(\n fnOrNameOrOptions:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>)\n | string\n | traceOptions<TArgs, TReturn>,\n maybeFn?:\n | ((...args: TArgs) => TReturn)\n | ((...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn)\n | ((ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>)\n | ((ctx: TraceContext) => TReturn)\n | ((ctx: TraceContext) => Promise<TReturn>),\n): WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn> {\n // Handle: trace(fn) - single argument\n if (typeof fnOrNameOrOptions === 'function') {\n // Check if it's immediate execution pattern: (ctx) => result\n if (\n looksLikeTraceFactory(fnOrNameOrOptions as AnyFn) &&\n !isFactoryReturningFunction(fnOrNameOrOptions as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern\n return executeImmediately(\n fnOrNameOrOptions as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n {},\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n // Factory pattern or plain function\n return wrapFactoryWithTracing(\n fnOrNameOrOptions as (...args: TArgs) => TReturn,\n {} as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(name, fn) or trace(options, fn) - two arguments\n if (typeof fnOrNameOrOptions === 'string') {\n if (!maybeFn) {\n throw new Error('trace(name, fn): fn is required');\n }\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with name\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n { name: fnOrNameOrOptions },\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n { name: fnOrNameOrOptions } as traceOptions<TArgs, TReturn>,\n );\n }\n\n // Handle: trace(options, fn)\n if (!maybeFn) {\n throw new Error('trace(options, fn): fn is required');\n }\n\n // Check if it's immediate execution pattern\n if (\n looksLikeTraceFactory(maybeFn as AnyFn) &&\n !isFactoryReturningFunction(maybeFn as (ctx: TraceContext) => unknown)\n ) {\n // Immediate execution pattern with options\n return executeImmediately(\n maybeFn as (ctx: TraceContext) => TReturn | Promise<TReturn>,\n fnOrNameOrOptions as traceOptions<any[], any>,\n ) as WrappedFunction<TArgs, TReturn> | TReturn | Promise<TReturn>;\n }\n\n return wrapFactoryWithTracing(\n maybeFn as (...args: TArgs) => TReturn,\n fnOrNameOrOptions as traceOptions<TArgs, TReturn>,\n );\n}\n\nexport function withTracing<TArgs extends any[] = any[], TReturn = any>(\n options: Omit<traceOptions<TArgs, TReturn>, 'name'>,\n) {\n return (\n fnOrFactory:\n | ((...args: TArgs) => TReturn | Promise<TReturn>)\n | ((ctx: TraceContext) => (...args: TArgs) => TReturn | Promise<TReturn>)\n ): WrappedFunction<TArgs, TReturn> => wrapFactoryWithTracing(fnOrFactory, options as traceOptions<TArgs, TReturn>);\n}\n\nfunction shouldSkip(key: string, fn: Function, skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[]): boolean {\n if (key.startsWith('_')) {\n return true;\n }\n\n if (!skip || skip.length === 0) {\n return false;\n }\n\n for (const pattern of skip) {\n if (typeof pattern === 'string' && key === pattern) {\n return true;\n }\n if (pattern instanceof RegExp && pattern.test(key)) {\n return true;\n }\n if (typeof pattern === 'function' && pattern(key, fn)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport interface InstrumentOptions extends traceOptions {\n functions: Record<string, any>;\n overrides?: Record<string, Partial<traceOptions>>;\n skip?: (string | RegExp | ((key: string, fn: Function) => boolean))[];\n}\n\nexport function instrument<T extends Record<string, any>>(\n options: InstrumentOptions,\n): T {\n const { functions, ...tracingOptions } = options;\n const instrumented: Record<string, any> = {};\n\n for (const key of Object.keys(functions)) {\n const fn = functions[key];\n\n if (typeof fn !== 'function') {\n instrumented[key] = fn;\n continue;\n }\n\n if (shouldSkip(key, fn, tracingOptions.skip)) {\n instrumented[key] = fn;\n continue;\n }\n\n const fnOptions: traceOptions = {\n ...tracingOptions,\n ...tracingOptions.overrides?.[key],\n name: tracingOptions.overrides?.[key]?.name ?? tracingOptions.name,\n };\n\n const boundFn = fn.bind(functions);\n const fnFactory = (_ctx: TraceContext) => boundFn as AnyFn;\n\n instrumented[key] = wrapFactoryWithTracing(fnFactory, fnOptions, key);\n }\n\n return instrumented as T;\n}\n\nexport interface SpanOptions {\n name: string;\n attributes?: Record<string, string | number | boolean>;\n}\n\n// Aligned with trace(): accept a name string OR full SpanOptions as the first\n// argument so span() and trace() share the same calling conventions.\nexport function span<T = unknown>(name: string, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n name: string,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(options: SpanOptions, fn: (span: Span) => T): T;\nexport function span<T = unknown>(\n options: SpanOptions,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function span<T = unknown>(\n nameOrOptions: string | SpanOptions,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n const options: SpanOptions =\n typeof nameOrOptions === 'string' ? { name: nameOrOptions } : nameOrOptions;\n const tracer = otelTrace.getTracer('autotel-edge');\n\n const execute = (span: Span) => {\n setSpanName(span, options.name);\n\n try {\n if (options.attributes) {\n for (const [key, value] of Object.entries(options.attributes)) {\n span.setAttribute(key, value);\n }\n }\n\n const result = fn(span);\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return value;\n })\n .catch((error) => {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n });\n }\n\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n return result;\n } catch (error) {\n const message = truncateErrorMessage(\n error instanceof Error ? error.message : String(error ?? 'Unknown error'),\n );\n span.setAttribute('code.function', options.name);\n span.setStatus({ code: SpanStatusCode.ERROR, message });\n span.recordException(error instanceof Error ? error : new Error(String(error)));\n span.end();\n throw error;\n }\n };\n\n const nativeTracer = getActiveNativeTracer();\n if (nativeTracer) {\n const nativeResult = nativeTracer.enterSpan(options.name, (nativeSpan) =>\n execute(createNativeSpanShim(nativeSpan, nativeTracer.correlationId)),\n );\n if (nativeResult instanceof Promise) {\n return nativeResult;\n }\n return nativeResult as T;\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/**\n * `enterSpan(name, callback)` — a Cloudflare-familiar alias for {@link span}.\n *\n * Mirrors the shape of Cloudflare's `tracing.enterSpan()` so CF users can keep\n * the API they know, but with autotel superpowers: it works on every runtime\n * (not just Workers), supports `span.setAttributes()` bulk-set, and falls back\n * to autotel's OTLP pipeline when no native tracer is active. When a native\n * tracer *is* active (e.g. on a Worker with tracing enabled), the span nests\n * inside Cloudflare's native waterfall.\n */\nexport function enterSpan<T = unknown>(name: string, fn: (span: Span) => T): T;\nexport function enterSpan<T = unknown>(\n name: string,\n fn: (span: Span) => Promise<T>,\n): Promise<T>;\nexport function enterSpan<T = unknown>(\n name: string,\n fn: (span: Span) => T | Promise<T>,\n): T | Promise<T> {\n return span(name, fn as (span: Span) => T);\n}\n","/**\n * Composition helpers for building autotel pipelines from small, testable parts.\n *\n * The motivation is the same as for any pipeline library: you can author\n * subscribers, post-processors and span processors as standalone units and\n * stitch them together at config-construction time without inventing ad-hoc\n * wrappers in every package.\n *\n * None of these helpers change runtime behaviour by themselves — they only\n * combine functions / processors that already work in isolation.\n */\nimport type { Span } from '@opentelemetry/api';\nimport type { ReadableSpan as SdkReadableSpan, SpanProcessor } from '@opentelemetry/sdk-trace-base';\nimport type {\n EdgeConfig,\n EdgeEvent,\n EdgeSubscriber,\n PostProcessorFn,\n ReadableSpan as EdgeReadableSpan,\n ResolveConfigFn,\n} from './types';\n\ntype Awaitable<T> = T | Promise<T>;\n\n/**\n * Identity helper for authoring an autotel configuration once with full\n * type-checking. Mirrors `defineConfig` patterns in tools like Vite / Vitest.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'autotel-edge'\n *\n * export const otelConfig = defineConfig({\n * service: { name: 'checkout' },\n * exporter: { url: process.env.OTLP_URL! },\n * })\n * ```\n */\nexport function defineConfig<T extends EdgeConfig | ResolveConfigFn>(config: T): T {\n return config;\n}\n\n/**\n * Run a list of subscribers in registration order. Errors thrown by an\n * individual subscriber are caught and logged so a buggy subscriber never\n * blocks the others — important because `subscribers` is the primary\n * extensibility point for in-process side effects.\n */\nexport function composeSubscribers(\n subscribers: Array<EdgeSubscriber>,\n options: { name?: string } = {},\n): EdgeSubscriber {\n const label = options.name ?? 'compose-subscribers';\n return async (event: EdgeEvent) => {\n for (const subscriber of subscribers) {\n try {\n await subscriber(event);\n } catch (err) {\n console.error(`[autotel-edge/${label}] subscriber failed:`, err);\n }\n }\n };\n}\n\n/**\n * Chain post-processors so each one sees the output of the previous one.\n * This matches the standard OTel post-processor contract: take spans, return\n * spans (possibly filtered, redacted, or annotated).\n */\nexport function composePostProcessors(\n processors: Array<PostProcessorFn>,\n): PostProcessorFn {\n return (spans: EdgeReadableSpan[]) => {\n let current = spans;\n for (const processor of processors) {\n try {\n current = processor(current);\n } catch (err) {\n console.error('[autotel-edge/compose-post-processors] failed:', err);\n }\n }\n return current;\n };\n}\n\n/**\n * Fan out span lifecycle events to multiple span processors. Any single\n * processor's failure is isolated so it cannot break the others.\n *\n * Useful when you want to attach, say, a sampling processor + a custom\n * attribute redactor + the default batch processor without having to author a\n * single processor that knows about all three.\n */\nexport function composeSpanProcessors(processors: SpanProcessor[]): SpanProcessor {\n const safe = (label: string, fn: () => Awaitable<void>) =>\n Promise.resolve()\n .then(fn)\n .catch((err) => {\n console.error(`[autotel-edge/compose-span-processors:${label}]`, err);\n });\n\n return {\n onStart(span: Span, parentContext) {\n for (const processor of processors) {\n try {\n processor.onStart(span as unknown as SdkReadableSpan & Span, parentContext);\n } catch (err) {\n console.error('[autotel-edge/compose-span-processors:onStart]', err);\n }\n }\n },\n onEnd(span: SdkReadableSpan) {\n for (const processor of processors) {\n try {\n processor.onEnd(span);\n } catch (err) {\n console.error('[autotel-edge/compose-span-processors:onEnd]', err);\n }\n }\n },\n async forceFlush() {\n await Promise.allSettled(\n processors.map((p) => safe('forceFlush', () => p.forceFlush())),\n );\n },\n async shutdown() {\n await Promise.allSettled(\n processors.map((p) => safe('shutdown', () => p.shutdown())),\n );\n },\n } as SpanProcessor;\n}\n","export type Awaitable<T> = T | Promise<T>;\n\nexport interface PluginHookContexts<\n TSetup = unknown,\n TEnrich = unknown,\n TDrain = unknown,\n TKeep = unknown,\n TRequestStart = unknown,\n TRequestFinish = unknown,\n TClientLog = unknown,\n TLogger = unknown,\n> {\n setup: TSetup;\n enrich: TEnrich;\n drain: TDrain;\n keep: TKeep;\n requestStart: TRequestStart;\n requestFinish: TRequestFinish;\n clientLog: TClientLog;\n logger: TLogger;\n}\n\nexport type DefaultPluginContexts = PluginHookContexts;\n\nexport interface EdgePlugin<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n> {\n name: string;\n setup?: (ctx: Ctx['setup']) => Awaitable<void>;\n enrich?: (ctx: Ctx['enrich']) => Awaitable<void>;\n drain?: (ctx: Ctx['drain']) => Awaitable<void>;\n keep?: (ctx: Ctx['keep']) => Awaitable<void>;\n onRequestStart?: (ctx: Ctx['requestStart']) => void;\n onRequestFinish?: (ctx: Ctx['requestFinish']) => void;\n onClientLog?: (ctx: Ctx['clientLog']) => void;\n extendLogger?: (logger: Ctx['logger']) => void;\n}\n\nexport interface PluginRunner<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n> {\n readonly plugins: readonly EdgePlugin<Ctx>[];\n readonly hasEnrich: boolean;\n readonly hasDrain: boolean;\n readonly hasKeep: boolean;\n readonly hasRequestLifecycle: boolean;\n readonly hasClientLog: boolean;\n readonly hasExtendLogger: boolean;\n applyExtendLogger: (logger: Ctx['logger']) => void;\n runOnRequestStart: (ctx: Ctx['requestStart']) => void;\n runOnRequestFinish: (ctx: Ctx['requestFinish']) => void;\n runOnClientLog: (ctx: Ctx['clientLog']) => void;\n runSetup: (ctx: Ctx['setup']) => Promise<void>;\n runEnrich: (ctx: Ctx['enrich']) => Promise<void>;\n runDrain: (ctx: Ctx['drain']) => Promise<void>;\n runKeep: (ctx: Ctx['keep']) => Promise<void>;\n}\n\nexport interface PluginRunnerOptions {\n logger?: Pick<Console, 'error'>;\n}\n\nfunction logPluginError(\n logger: Pick<Console, 'error'>,\n name: string,\n hook: string,\n error: unknown,\n): void {\n logger.error(`[autotel-edge/${name}] ${hook} failed:`, error);\n}\n\nexport function definePlugin<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n>(plugin: EdgePlugin<Ctx>): EdgePlugin<Ctx> {\n return plugin;\n}\n\nexport function createPluginRunner<\n Ctx extends PluginHookContexts = DefaultPluginContexts,\n>(\n plugins: EdgePlugin<Ctx>[] = [],\n options: PluginRunnerOptions = {},\n): PluginRunner<Ctx> {\n const errorLogger = options.logger ?? console;\n const byName = new Map<string, EdgePlugin<Ctx>>();\n\n // De-duplicate by plugin name while preserving registration order semantics.\n // The last plugin with a given name wins.\n for (const plugin of plugins) {\n byName.set(plugin.name, plugin);\n }\n\n const list = Array.from(byName.values());\n\n const hasEnrich = list.some((p) => typeof p.enrich === 'function');\n const hasDrain = list.some((p) => typeof p.drain === 'function');\n const hasKeep = list.some((p) => typeof p.keep === 'function');\n const hasRequestLifecycle = list.some(\n (p) =>\n typeof p.onRequestStart === 'function' ||\n typeof p.onRequestFinish === 'function',\n );\n const hasClientLog = list.some((p) => typeof p.onClientLog === 'function');\n const hasExtendLogger = list.some(\n (p) => typeof p.extendLogger === 'function',\n );\n\n return {\n plugins: list,\n hasEnrich,\n hasDrain,\n hasKeep,\n hasRequestLifecycle,\n hasClientLog,\n hasExtendLogger,\n\n applyExtendLogger(logger) {\n for (const plugin of list) {\n if (!plugin.extendLogger) continue;\n try {\n plugin.extendLogger(logger);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'extendLogger', err);\n }\n }\n },\n\n runOnRequestStart(ctx) {\n for (const plugin of list) {\n if (!plugin.onRequestStart) continue;\n try {\n plugin.onRequestStart(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onRequestStart', err);\n }\n }\n },\n\n runOnRequestFinish(ctx) {\n for (const plugin of list) {\n if (!plugin.onRequestFinish) continue;\n try {\n plugin.onRequestFinish(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onRequestFinish', err);\n }\n }\n },\n\n runOnClientLog(ctx) {\n for (const plugin of list) {\n if (!plugin.onClientLog) continue;\n try {\n plugin.onClientLog(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'onClientLog', err);\n }\n }\n },\n\n async runSetup(ctx) {\n for (const plugin of list) {\n if (!plugin.setup) continue;\n try {\n await plugin.setup(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'setup', err);\n }\n }\n },\n\n async runEnrich(ctx) {\n for (const plugin of list) {\n if (!plugin.enrich) continue;\n try {\n await plugin.enrich(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'enrich', err);\n }\n }\n },\n\n async runDrain(ctx) {\n const drains = list.filter((p) => typeof p.drain === 'function');\n if (drains.length === 0) return;\n\n await Promise.allSettled(\n drains.map(async (plugin) => {\n try {\n await plugin.drain!(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'drain', err);\n }\n }),\n );\n },\n\n async runKeep(ctx) {\n for (const plugin of list) {\n if (!plugin.keep) continue;\n try {\n await plugin.keep(ctx);\n } catch (err) {\n logPluginError(errorLogger, plugin.name, 'keep', err);\n }\n }\n },\n };\n}\n\nconst emptyRunner = createPluginRunner([]);\n\nexport function getEmptyPluginRunner(): PluginRunner {\n return emptyRunner;\n}\n","import type { RouteServiceConfig } from './types';\n\nexport type Awaitable<T> = T | Promise<T>;\n\nexport function matchesRoutePattern(path: string, pattern: string): boolean {\n const regexPattern = pattern\n .replaceAll(/[.+^${}()|[\\]\\\\]/g, String.raw`\\$&`)\n .replaceAll('**', '{{GLOBSTAR}}')\n .replaceAll('*', '[^/]*')\n .replaceAll('{{GLOBSTAR}}', '.*')\n .replaceAll('?', '[^/]');\n return new RegExp(`^${regexPattern}$`).test(path);\n}\n\nexport interface RouteFilterOptions {\n include?: string[];\n exclude?: string[];\n}\n\nexport function shouldInstrumentPath(\n path: string,\n options: RouteFilterOptions = {},\n): boolean {\n const { include, exclude } = options;\n\n if (exclude && exclude.some((pattern) => matchesRoutePattern(path, pattern))) {\n return false;\n }\n\n if (!include || include.length === 0) {\n return true;\n }\n\n return include.some((pattern) => matchesRoutePattern(path, pattern));\n}\n\nexport function getServiceForPath(\n path: string,\n routes?: Record<string, RouteServiceConfig>,\n): string | undefined {\n if (!routes) return undefined;\n\n for (const [pattern, config] of Object.entries(routes)) {\n if (matchesRoutePattern(path, pattern)) {\n return config.service;\n }\n }\n\n return undefined;\n}\n\nexport interface MiddlewareFinishContext<TEvent, TRequest = unknown> {\n event: TEvent;\n request: TRequest;\n status?: number;\n}\n\nexport interface MiddlewarePipelineOptions<TEvent, TRequest = unknown> {\n enrichers?: Array<\n (ctx: MiddlewareFinishContext<TEvent, TRequest>) => Awaitable<void>\n >;\n drains?: Array<\n (ctx: MiddlewareFinishContext<TEvent, TRequest>) => Awaitable<void>\n >;\n logger?: Pick<Console, 'error'>;\n}\n\nexport async function runMiddlewareFinishPipeline<TEvent, TRequest = unknown>(\n ctx: MiddlewareFinishContext<TEvent, TRequest>,\n options: MiddlewarePipelineOptions<TEvent, TRequest> = {},\n): Promise<void> {\n const logger = options.logger ?? console;\n\n for (const enrich of options.enrichers ?? []) {\n try {\n await enrich(ctx);\n } catch (err) {\n logger.error('[autotel-edge/middleware] enricher failed:', err);\n }\n }\n\n const drains = options.drains ?? [];\n if (drains.length === 0) return;\n\n await Promise.allSettled(\n drains.map(async (drain) => {\n try {\n await drain(ctx);\n } catch (err) {\n logger.error('[autotel-edge/middleware] drain failed:', err);\n }\n }),\n );\n}\n"],"mappings":"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"}
package/dist/logger.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as getExecutionLogger } from "./execution-logger-CoxSsBmU.js";
1
+ import { t as getExecutionLogger } from "./execution-logger-CSW2AyVi.js";
2
2
  import { context, createContextKey, trace } from "@opentelemetry/api";
3
3
 
4
4
  //#region src/api/redact.ts
@@ -607,7 +607,8 @@ function createEdgeLogger(service, options) {
607
607
  const baseBindings = bindingsFormatter ? bindingsFormatter({ ...currentBindings }) : { ...currentBindings };
608
608
  const serializedAttrs = attrs ? Object.fromEntries(Object.entries(attrs).map(([key, value]) => [key, key in serializers ? serializers[key](value) : value])) : void 0;
609
609
  const mergeObject = nestedKey ? { [nestedKey]: serializedAttrs ?? {} } : serializedAttrs ?? {};
610
- const mergedLogObject = mixinMergeStrategy(mergeObject, mixin?.(mergeObject, levelValues[level], logger) ?? {});
610
+ const mixinObject = mixin?.(mergeObject, levelValues[level], logger) ?? {};
611
+ const mergedLogObject = mixinMergeStrategy(mergeObject, mixinObject);
611
612
  const formattedLogObject = logFormatter ? logFormatter(mergedLogObject) : mergedLogObject;
612
613
  const formattedLevel = levelFormatter ? levelFormatter(level, levelValues[level]) : { level: logger.useLevelLabels ? level : levelValues[level] };
613
614
  const ts = getTimestamp();
@@ -637,7 +638,10 @@ function createEdgeLogger(service, options) {
637
638
  };
638
639
  const attrsStr = formatPrettyAttrs(redactor ? redactor(prettyAttrs) : prettyAttrs);
639
640
  console.log(`${ANSI_DIM}${time}${ANSI_RESET} ${color}${ANSI_BOLD}${symbol} ${level.toUpperCase()}${ANSI_RESET}${traceInfo} ${ANSI_DIM}(${service})${ANSI_RESET} ${message}${attrsStr}`);
640
- } else writeOutput(level, redactor ? redactor(logEntry) : logEntry);
641
+ } else {
642
+ const safeEntry = redactor ? redactor(logEntry) : logEntry;
643
+ writeOutput(level, safeEntry);
644
+ }
641
645
  emitTransmit(level, rawArgs ?? []);
642
646
  };
643
647
  const makeLogMethod = (levelName) => {