@parsrun/service 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/tracing/context.ts","../../src/tracing/spans.ts","../../src/tracing/exporters.ts","../../src/tracing/tracer.ts"],"sourcesContent":["/**\n * @parsrun/service - Trace Context\n * W3C Trace Context implementation\n */\n\nimport type { TraceContext } from \"../types.js\";\n\n// ============================================================================\n// TRACE ID GENERATION\n// ============================================================================\n\n/**\n * Generate a trace ID (32 hex characters)\n */\nexport function generateTraceId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Generate a span ID (16 hex characters)\n */\nexport function generateSpanId(): string {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n// ============================================================================\n// TRACE CONTEXT\n// ============================================================================\n\n/**\n * Create a new trace context\n */\nexport function createTraceContext(options?: {\n traceId?: string;\n spanId?: string;\n traceFlags?: number;\n traceState?: string;\n}): TraceContext {\n const ctx: TraceContext = {\n traceId: options?.traceId ?? generateTraceId(),\n spanId: options?.spanId ?? generateSpanId(),\n traceFlags: options?.traceFlags ?? 1, // Default: sampled\n };\n\n if (options?.traceState) {\n ctx.traceState = options.traceState;\n }\n\n return ctx;\n}\n\n/**\n * Create child trace context (new span in same trace)\n */\nexport function createChildContext(parent: TraceContext): TraceContext {\n const ctx: TraceContext = {\n traceId: parent.traceId,\n spanId: generateSpanId(),\n traceFlags: parent.traceFlags,\n };\n\n if (parent.traceState) {\n ctx.traceState = parent.traceState;\n }\n\n return ctx;\n}\n\n// ============================================================================\n// W3C TRACEPARENT HEADER\n// ============================================================================\n\n/**\n * Format trace context as W3C traceparent header\n *\n * Format: {version}-{trace-id}-{span-id}-{trace-flags}\n * Example: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01\n */\nexport function formatTraceparent(ctx: TraceContext): string {\n const version = \"00\";\n const flags = ctx.traceFlags.toString(16).padStart(2, \"0\");\n return `${version}-${ctx.traceId}-${ctx.spanId}-${flags}`;\n}\n\n/**\n * Parse W3C traceparent header\n */\nexport function parseTraceparent(header: string): TraceContext | null {\n const parts = header.trim().split(\"-\");\n if (parts.length !== 4) {\n return null;\n }\n\n const [version, traceId, spanId, flags] = parts;\n\n // Validate version\n if (version !== \"00\") {\n return null;\n }\n\n // Validate trace ID (32 hex chars)\n if (!traceId || traceId.length !== 32 || !/^[0-9a-f]+$/i.test(traceId)) {\n return null;\n }\n\n // Validate span ID (16 hex chars)\n if (!spanId || spanId.length !== 16 || !/^[0-9a-f]+$/i.test(spanId)) {\n return null;\n }\n\n // Validate flags (2 hex chars)\n if (!flags || flags.length !== 2 || !/^[0-9a-f]+$/i.test(flags)) {\n return null;\n }\n\n return {\n traceId: traceId.toLowerCase(),\n spanId: spanId.toLowerCase(),\n traceFlags: parseInt(flags, 16),\n };\n}\n\n// ============================================================================\n// W3C TRACESTATE HEADER\n// ============================================================================\n\n/**\n * Format trace state as W3C tracestate header\n *\n * Format: key1=value1,key2=value2\n */\nexport function formatTracestate(state: Record<string, string>): string {\n return Object.entries(state)\n .map(([key, value]) => `${key}=${value}`)\n .join(\",\");\n}\n\n/**\n * Parse W3C tracestate header\n */\nexport function parseTracestate(header: string): Record<string, string> {\n const state: Record<string, string> = {};\n\n for (const pair of header.split(\",\")) {\n const [key, value] = pair.trim().split(\"=\");\n if (key && value) {\n state[key] = value;\n }\n }\n\n return state;\n}\n\n// ============================================================================\n// TRACE CONTEXT MANAGER\n// ============================================================================\n\n/**\n * Async-local-storage-like context manager for tracing\n * Uses a simple stack for edge compatibility\n */\nexport class TraceContextManager {\n private readonly stack: TraceContext[] = [];\n\n /**\n * Get current trace context\n */\n current(): TraceContext | undefined {\n return this.stack[this.stack.length - 1];\n }\n\n /**\n * Run a function with a trace context\n */\n async run<T>(ctx: TraceContext, fn: () => Promise<T>): Promise<T> {\n this.stack.push(ctx);\n try {\n return await fn();\n } finally {\n this.stack.pop();\n }\n }\n\n /**\n * Run a function with a new child context\n */\n async runChild<T>(fn: () => Promise<T>): Promise<T> {\n const parent = this.current();\n const child = parent ? createChildContext(parent) : createTraceContext();\n return this.run(child, fn);\n }\n\n /**\n * Create context from incoming request headers\n */\n fromHeaders(headers: Headers | Record<string, string>): TraceContext | undefined {\n const traceparent =\n headers instanceof Headers\n ? headers.get(\"traceparent\")\n : headers[\"traceparent\"];\n\n if (!traceparent) {\n return undefined;\n }\n\n const ctx = parseTraceparent(traceparent);\n if (!ctx) {\n return undefined;\n }\n\n const tracestate =\n headers instanceof Headers\n ? headers.get(\"tracestate\")\n : headers[\"tracestate\"];\n\n if (tracestate) {\n ctx.traceState = tracestate;\n }\n\n return ctx;\n }\n\n /**\n * Add trace context to outgoing request headers\n */\n toHeaders(ctx: TraceContext): Record<string, string> {\n const headers: Record<string, string> = {\n traceparent: formatTraceparent(ctx),\n };\n\n if (ctx.traceState) {\n headers[\"tracestate\"] = ctx.traceState;\n }\n\n return headers;\n }\n\n /**\n * Check if current context is sampled\n */\n isSampled(): boolean {\n const ctx = this.current();\n return ctx ? (ctx.traceFlags & 0x01) === 1 : false;\n }\n\n /**\n * Clear all contexts (for testing)\n */\n clear(): void {\n this.stack.length = 0;\n }\n}\n\n// ============================================================================\n// SAMPLING\n// ============================================================================\n\nexport type Sampler = \"always\" | \"never\" | { ratio: number };\n\n/**\n * Determine if a trace should be sampled\n */\nexport function shouldSample(sampler: Sampler, traceId?: string): boolean {\n if (sampler === \"always\") {\n return true;\n }\n\n if (sampler === \"never\") {\n return false;\n }\n\n // Ratio-based sampling\n if (traceId) {\n // Use trace ID for deterministic sampling\n const hash = parseInt(traceId.slice(-8), 16);\n const threshold = Math.floor(sampler.ratio * 0xffffffff);\n return hash < threshold;\n }\n\n // Random sampling\n return Math.random() < sampler.ratio;\n}\n","/**\n * @parsrun/service - Spans\n * Span creation and management\n */\n\nimport type {\n Span,\n SpanKind,\n SpanStatus,\n SpanAttributeValue,\n SpanEvent,\n TraceContext,\n} from \"../types.js\";\nimport { generateSpanId, createTraceContext } from \"./context.js\";\n\n// ============================================================================\n// SPAN CREATION\n// ============================================================================\n\nexport interface SpanOptions {\n /** Span name */\n name: string;\n /** Span kind */\n kind?: SpanKind;\n /** Parent trace context */\n parent?: TraceContext;\n /** Initial attributes */\n attributes?: Record<string, SpanAttributeValue>;\n /** Start time (default: now) */\n startTime?: number;\n}\n\n/**\n * Create a new span\n */\nexport function createSpan(options: SpanOptions): Span {\n let traceContext: TraceContext;\n\n if (options.parent) {\n traceContext = {\n traceId: options.parent.traceId,\n spanId: generateSpanId(),\n traceFlags: options.parent.traceFlags,\n };\n if (options.parent.traceState) {\n traceContext.traceState = options.parent.traceState;\n }\n } else {\n traceContext = createTraceContext();\n }\n\n const span: Span = {\n name: options.name,\n kind: options.kind ?? \"internal\",\n traceContext,\n startTime: options.startTime ?? Date.now(),\n status: \"unset\",\n attributes: options.attributes ?? {},\n events: [],\n };\n\n if (options.parent?.spanId) {\n span.parentSpanId = options.parent.spanId;\n }\n\n return span;\n}\n\n// ============================================================================\n// SPAN MANAGER\n// ============================================================================\n\n/**\n * Span manager for creating and managing spans\n */\nexport class SpanManager {\n private readonly spans: Map<string, Span> = new Map();\n\n /**\n * Start a new span\n */\n startSpan(options: SpanOptions): Span {\n const span = createSpan(options);\n this.spans.set(span.traceContext.spanId, span);\n return span;\n }\n\n /**\n * End a span\n */\n endSpan(span: Span, status?: SpanStatus): Span {\n span.endTime = Date.now();\n if (status) {\n span.status = status;\n } else if (span.status === \"unset\") {\n span.status = \"ok\";\n }\n return span;\n }\n\n /**\n * Set span attribute\n */\n setAttribute(span: Span, key: string, value: SpanAttributeValue): void {\n span.attributes[key] = value;\n }\n\n /**\n * Set multiple span attributes\n */\n setAttributes(span: Span, attributes: Record<string, SpanAttributeValue>): void {\n Object.assign(span.attributes, attributes);\n }\n\n /**\n * Add span event\n */\n addEvent(\n span: Span,\n name: string,\n attributes?: Record<string, SpanAttributeValue>\n ): void {\n const event: SpanEvent = {\n name,\n time: Date.now(),\n };\n if (attributes) {\n event.attributes = attributes;\n }\n span.events.push(event);\n }\n\n /**\n * Set span status\n */\n setStatus(span: Span, status: SpanStatus): void {\n span.status = status;\n }\n\n /**\n * Record exception on span\n */\n recordException(span: Span, error: Error): void {\n span.status = \"error\";\n this.addEvent(span, \"exception\", {\n \"exception.type\": error.name,\n \"exception.message\": error.message,\n \"exception.stacktrace\": error.stack ?? \"\",\n });\n }\n\n /**\n * Get span by ID\n */\n getSpan(spanId: string): Span | undefined {\n return this.spans.get(spanId);\n }\n\n /**\n * Get all completed spans and clear\n */\n flush(): Span[] {\n const completed = Array.from(this.spans.values()).filter((s) => s.endTime);\n for (const span of completed) {\n this.spans.delete(span.traceContext.spanId);\n }\n return completed;\n }\n\n /**\n * Clear all spans\n */\n clear(): void {\n this.spans.clear();\n }\n}\n\n// ============================================================================\n// SPAN UTILITIES\n// ============================================================================\n\n/**\n * Calculate span duration in milliseconds\n */\nexport function getSpanDuration(span: Span): number | undefined {\n if (!span.endTime) return undefined;\n return span.endTime - span.startTime;\n}\n\n/**\n * Check if span is completed\n */\nexport function isSpanCompleted(span: Span): boolean {\n return span.endTime !== undefined;\n}\n\n/**\n * Get span as simplified object (for logging)\n */\nexport function spanToLogObject(span: Span): Record<string, unknown> {\n return {\n traceId: span.traceContext.traceId,\n spanId: span.traceContext.spanId,\n parentSpanId: span.parentSpanId,\n name: span.name,\n kind: span.kind,\n status: span.status,\n startTime: new Date(span.startTime).toISOString(),\n endTime: span.endTime ? new Date(span.endTime).toISOString() : undefined,\n durationMs: getSpanDuration(span),\n attributes: span.attributes,\n events: span.events.map((e) => ({\n name: e.name,\n time: new Date(e.time).toISOString(),\n attributes: e.attributes,\n })),\n };\n}\n\n// ============================================================================\n// SEMANTIC CONVENTIONS\n// ============================================================================\n\n/**\n * Common span attribute keys (OpenTelemetry semantic conventions)\n */\nexport const SpanAttributes = {\n // HTTP\n HTTP_METHOD: \"http.method\",\n HTTP_URL: \"http.url\",\n HTTP_STATUS_CODE: \"http.status_code\",\n HTTP_REQUEST_CONTENT_LENGTH: \"http.request_content_length\",\n HTTP_RESPONSE_CONTENT_LENGTH: \"http.response_content_length\",\n\n // RPC\n RPC_SYSTEM: \"rpc.system\",\n RPC_SERVICE: \"rpc.service\",\n RPC_METHOD: \"rpc.method\",\n\n // Database\n DB_SYSTEM: \"db.system\",\n DB_NAME: \"db.name\",\n DB_OPERATION: \"db.operation\",\n DB_STATEMENT: \"db.statement\",\n\n // Messaging\n MESSAGING_SYSTEM: \"messaging.system\",\n MESSAGING_DESTINATION: \"messaging.destination\",\n MESSAGING_MESSAGE_ID: \"messaging.message_id\",\n\n // Service\n SERVICE_NAME: \"service.name\",\n SERVICE_VERSION: \"service.version\",\n\n // Error\n EXCEPTION_TYPE: \"exception.type\",\n EXCEPTION_MESSAGE: \"exception.message\",\n EXCEPTION_STACKTRACE: \"exception.stacktrace\",\n\n // Custom Pars attributes\n PARS_TENANT_ID: \"pars.tenant_id\",\n PARS_USER_ID: \"pars.user_id\",\n PARS_REQUEST_ID: \"pars.request_id\",\n} as const;\n","/**\n * @parsrun/service - Trace Exporters\n * Console and OTLP exporters for spans\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type { Span } from \"../types.js\";\nimport { spanToLogObject, getSpanDuration } from \"./spans.js\";\n\n// ============================================================================\n// EXPORTER INTERFACE\n// ============================================================================\n\nexport interface SpanExporter {\n /** Exporter name */\n readonly name: string;\n /** Export spans */\n export(spans: Span[]): Promise<void>;\n /** Shutdown exporter */\n shutdown(): Promise<void>;\n}\n\nexport interface ExporterOptions {\n /** Logger */\n logger?: Logger;\n}\n\n// ============================================================================\n// CONSOLE EXPORTER\n// ============================================================================\n\nexport interface ConsoleExporterOptions extends ExporterOptions {\n /** Pretty print (default: true in dev) */\n pretty?: boolean;\n /** Include attributes (default: true) */\n includeAttributes?: boolean;\n /** Include events (default: true) */\n includeEvents?: boolean;\n}\n\n/**\n * Console exporter for development/debugging\n */\nexport class ConsoleExporter implements SpanExporter {\n readonly name = \"console\";\n private readonly logger: Logger;\n private readonly pretty: boolean;\n private readonly includeAttributes: boolean;\n private readonly includeEvents: boolean;\n\n constructor(options: ConsoleExporterOptions = {}) {\n this.logger = options.logger ?? createLogger({ name: \"trace-exporter\" });\n this.pretty = options.pretty ?? true;\n this.includeAttributes = options.includeAttributes ?? true;\n this.includeEvents = options.includeEvents ?? true;\n }\n\n async export(spans: Span[]): Promise<void> {\n for (const span of spans) {\n const duration = getSpanDuration(span);\n const status = span.status === \"error\" ? \"ERROR\" : span.status === \"ok\" ? \"OK\" : \"UNSET\";\n\n if (this.pretty) {\n const indent = span.parentSpanId ? \" └─\" : \"──\";\n const statusIcon = span.status === \"error\" ? \"✗\" : span.status === \"ok\" ? \"✓\" : \"○\";\n const durationStr = duration !== undefined ? `${duration}ms` : \"?ms\";\n\n console.log(\n `${indent} ${statusIcon} [${span.kind}] ${span.name} (${durationStr}) trace=${span.traceContext.traceId.slice(0, 8)}`\n );\n\n if (this.includeAttributes && Object.keys(span.attributes).length > 0) {\n console.log(` attributes:`, span.attributes);\n }\n\n if (this.includeEvents && span.events.length > 0) {\n for (const event of span.events) {\n console.log(` event: ${event.name}`, event.attributes ?? \"\");\n }\n }\n } else {\n const logObj = spanToLogObject(span);\n this.logger.info(`Span: ${span.name}`, {\n ...logObj,\n status,\n durationMs: duration,\n });\n }\n }\n }\n\n async shutdown(): Promise<void> {\n // No cleanup needed\n }\n}\n\n/**\n * Create a console exporter\n */\nexport function createConsoleExporter(options?: ConsoleExporterOptions): ConsoleExporter {\n return new ConsoleExporter(options);\n}\n\n// ============================================================================\n// OTLP EXPORTER\n// ============================================================================\n\nexport interface OtlpExporterOptions extends ExporterOptions {\n /** OTLP endpoint URL */\n endpoint: string;\n /** Service name */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** Custom headers */\n headers?: Record<string, string>;\n /** Timeout in ms */\n timeout?: number;\n /** Batch size */\n batchSize?: number;\n /** Flush interval in ms */\n flushInterval?: number;\n}\n\n/**\n * OTLP exporter for production tracing\n */\nexport class OtlpExporter implements SpanExporter {\n readonly name = \"otlp\";\n private readonly endpoint: string;\n private readonly serviceName: string;\n private readonly serviceVersion: string;\n private readonly headers: Record<string, string>;\n private readonly timeout: number;\n private readonly batchSize: number;\n private readonly flushInterval: number;\n private readonly logger: Logger;\n private readonly buffer: Span[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: OtlpExporterOptions) {\n this.endpoint = options.endpoint.replace(/\\/$/, \"\");\n this.serviceName = options.serviceName;\n this.serviceVersion = options.serviceVersion ?? \"1.0.0\";\n this.headers = options.headers ?? {};\n this.timeout = options.timeout ?? 10_000;\n this.batchSize = options.batchSize ?? 100;\n this.flushInterval = options.flushInterval ?? 5_000;\n this.logger = options.logger ?? createLogger({ name: \"otlp-exporter\" });\n\n // Start flush timer\n this.flushTimer = setInterval(() => this.flush(), this.flushInterval);\n }\n\n async export(spans: Span[]): Promise<void> {\n this.buffer.push(...spans);\n\n if (this.buffer.length >= this.batchSize) {\n await this.flush();\n }\n }\n\n private async flush(): Promise<void> {\n if (this.buffer.length === 0) return;\n\n const spansToExport = this.buffer.splice(0, this.batchSize);\n\n try {\n const payload = this.buildOtlpPayload(spansToExport);\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.endpoint}/v1/traces`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.headers,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`OTLP export failed: ${response.status} ${response.statusText}`);\n }\n\n this.logger.debug(`Exported ${spansToExport.length} spans to OTLP`);\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error) {\n this.logger.error(`Failed to export spans to OTLP`, error as Error);\n // Put spans back in buffer for retry\n this.buffer.unshift(...spansToExport);\n }\n }\n\n private buildOtlpPayload(spans: Span[]): OtlpTracePayload {\n return {\n resourceSpans: [\n {\n resource: {\n attributes: [\n { key: \"service.name\", value: { stringValue: this.serviceName } },\n { key: \"service.version\", value: { stringValue: this.serviceVersion } },\n ],\n },\n scopeSpans: [\n {\n scope: {\n name: \"@parsrun/service\",\n version: \"0.1.0\",\n },\n spans: spans.map((span) => this.convertSpan(span)),\n },\n ],\n },\n ],\n };\n }\n\n private convertSpan(span: Span): OtlpSpan {\n const otlpSpan: OtlpSpan = {\n traceId: span.traceContext.traceId,\n spanId: span.traceContext.spanId,\n name: span.name,\n kind: this.convertSpanKind(span.kind),\n startTimeUnixNano: String(span.startTime * 1_000_000),\n attributes: Object.entries(span.attributes).map(([key, value]) => ({\n key,\n value: this.convertAttributeValue(value),\n })),\n events: span.events.map((event) => ({\n name: event.name,\n timeUnixNano: String(event.time * 1_000_000),\n attributes: event.attributes\n ? Object.entries(event.attributes).map(([key, value]) => ({\n key,\n value: this.convertAttributeValue(value),\n }))\n : [],\n })),\n status: {\n code: span.status === \"error\" ? 2 : span.status === \"ok\" ? 1 : 0,\n },\n };\n\n if (span.parentSpanId) {\n otlpSpan.parentSpanId = span.parentSpanId;\n }\n if (span.endTime) {\n otlpSpan.endTimeUnixNano = String(span.endTime * 1_000_000);\n }\n\n return otlpSpan;\n }\n\n private convertSpanKind(kind: string): number {\n switch (kind) {\n case \"internal\":\n return 1;\n case \"server\":\n return 2;\n case \"client\":\n return 3;\n case \"producer\":\n return 4;\n case \"consumer\":\n return 5;\n default:\n return 0;\n }\n }\n\n private convertAttributeValue(value: unknown): OtlpAttributeValue {\n if (typeof value === \"string\") {\n return { stringValue: value };\n }\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) {\n return { intValue: String(value) };\n }\n return { doubleValue: value };\n }\n if (typeof value === \"boolean\") {\n return { boolValue: value };\n }\n if (Array.isArray(value)) {\n return {\n arrayValue: {\n values: value.map((v) => this.convertAttributeValue(v)),\n },\n };\n }\n return { stringValue: String(value) };\n }\n\n async shutdown(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.flush();\n }\n}\n\n/**\n * Create an OTLP exporter\n */\nexport function createOtlpExporter(options: OtlpExporterOptions): OtlpExporter {\n return new OtlpExporter(options);\n}\n\n// ============================================================================\n// OTLP TYPES\n// ============================================================================\n\ninterface OtlpTracePayload {\n resourceSpans: Array<{\n resource: {\n attributes: OtlpAttribute[];\n };\n scopeSpans: Array<{\n scope: {\n name: string;\n version: string;\n };\n spans: OtlpSpan[];\n }>;\n }>;\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n kind: number;\n startTimeUnixNano: string;\n endTimeUnixNano?: string;\n attributes: OtlpAttribute[];\n events: Array<{\n name: string;\n timeUnixNano: string;\n attributes: OtlpAttribute[];\n }>;\n status: {\n code: number;\n };\n}\n\ninterface OtlpAttribute {\n key: string;\n value: OtlpAttributeValue;\n}\n\ninterface OtlpAttributeValue {\n stringValue?: string;\n intValue?: string;\n doubleValue?: number;\n boolValue?: boolean;\n arrayValue?: {\n values: OtlpAttributeValue[];\n };\n}\n","/**\n * @parsrun/service - Tracer\n * High-level tracing API\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport type { Span, TraceContext, SpanKind, SpanAttributeValue } from \"../types.js\";\nimport type { TracingConfig } from \"../types.js\";\nimport {\n TraceContextManager,\n shouldSample,\n type Sampler,\n} from \"./context.js\";\nimport { SpanManager, SpanAttributes } from \"./spans.js\";\nimport type { SpanExporter } from \"./exporters.js\";\nimport { ConsoleExporter } from \"./exporters.js\";\n\n// ============================================================================\n// TRACER\n// ============================================================================\n\nexport interface TracerOptions {\n /** Service name */\n serviceName: string;\n /** Service version */\n serviceVersion?: string;\n /** Tracing config */\n config?: TracingConfig;\n /** Span exporter */\n exporter?: SpanExporter;\n /** Logger */\n logger?: Logger;\n}\n\n/**\n * Main tracer class for distributed tracing\n */\nexport class Tracer {\n private readonly serviceName: string;\n private readonly serviceVersion: string;\n private readonly sampler: Sampler;\n private readonly exporter: SpanExporter;\n private readonly logger: Logger;\n private readonly contextManager: TraceContextManager;\n private readonly spanManager: SpanManager;\n private readonly enabled: boolean;\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(options: TracerOptions) {\n this.serviceName = options.serviceName;\n this.serviceVersion = options.serviceVersion ?? \"1.0.0\";\n this.enabled = options.config?.enabled ?? true;\n this.sampler = options.config?.sampler ?? { ratio: 0.1 };\n this.exporter = options.exporter ?? new ConsoleExporter();\n this.logger = options.logger ?? createLogger({ name: `tracer:${options.serviceName}` });\n this.contextManager = new TraceContextManager();\n this.spanManager = new SpanManager();\n\n // Auto-flush spans periodically\n if (this.enabled) {\n this.flushTimer = setInterval(() => this.flush(), 5000);\n }\n }\n\n /**\n * Start a new span\n */\n startSpan(\n name: string,\n options?: {\n kind?: SpanKind;\n parent?: TraceContext;\n attributes?: Record<string, SpanAttributeValue>;\n }\n ): Span | null {\n if (!this.enabled) return null;\n\n // Get parent from options or current context\n const parent = options?.parent ?? this.contextManager.current();\n\n // Check sampling\n if (!parent && !shouldSample(this.sampler)) {\n return null;\n }\n\n const spanOptions: Parameters<typeof this.spanManager.startSpan>[0] = {\n name,\n kind: options?.kind ?? \"internal\",\n attributes: {\n [SpanAttributes.SERVICE_NAME]: this.serviceName,\n [SpanAttributes.SERVICE_VERSION]: this.serviceVersion,\n ...options?.attributes,\n },\n };\n\n if (parent) {\n spanOptions.parent = parent;\n }\n\n const span = this.spanManager.startSpan(spanOptions);\n\n return span;\n }\n\n /**\n * End a span\n */\n endSpan(span: Span | null, error?: Error): void {\n if (!span) return;\n\n if (error) {\n this.spanManager.recordException(span, error);\n }\n\n this.spanManager.endSpan(span, error ? \"error\" : \"ok\");\n }\n\n /**\n * Run a function with automatic span creation\n */\n async trace<T>(\n name: string,\n fn: (span: Span | null) => Promise<T>,\n options?: {\n kind?: SpanKind;\n attributes?: Record<string, SpanAttributeValue>;\n }\n ): Promise<T> {\n const span = this.startSpan(name, options);\n\n if (!span) {\n return fn(null);\n }\n\n try {\n const result = await this.contextManager.run(span.traceContext, () => fn(span));\n this.endSpan(span);\n return result;\n } catch (error) {\n this.endSpan(span, error as Error);\n throw error;\n }\n }\n\n /**\n * Add attribute to current span\n */\n setAttribute(key: string, value: SpanAttributeValue): void {\n const ctx = this.contextManager.current();\n if (!ctx) return;\n\n const span = this.spanManager.getSpan(ctx.spanId);\n if (span) {\n this.spanManager.setAttribute(span, key, value);\n }\n }\n\n /**\n * Add event to current span\n */\n addEvent(name: string, attributes?: Record<string, SpanAttributeValue>): void {\n const ctx = this.contextManager.current();\n if (!ctx) return;\n\n const span = this.spanManager.getSpan(ctx.spanId);\n if (span) {\n this.spanManager.addEvent(span, name, attributes);\n }\n }\n\n /**\n * Get current trace context\n */\n currentContext(): TraceContext | undefined {\n return this.contextManager.current();\n }\n\n /**\n * Get context manager for advanced use\n */\n getContextManager(): TraceContextManager {\n return this.contextManager;\n }\n\n /**\n * Extract trace context from incoming request\n */\n extract(headers: Headers | Record<string, string>): TraceContext | undefined {\n return this.contextManager.fromHeaders(headers);\n }\n\n /**\n * Inject trace context into outgoing request headers\n */\n inject(ctx?: TraceContext): Record<string, string> {\n const context = ctx ?? this.contextManager.current();\n if (!context) return {};\n return this.contextManager.toHeaders(context);\n }\n\n /**\n * Flush completed spans to exporter\n */\n async flush(): Promise<void> {\n const spans = this.spanManager.flush();\n if (spans.length > 0) {\n try {\n await this.exporter.export(spans);\n } catch (error) {\n this.logger.error(\"Failed to export spans\", error as Error);\n }\n }\n }\n\n /**\n * Shutdown tracer\n */\n async shutdown(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n await this.flush();\n await this.exporter.shutdown();\n this.spanManager.clear();\n this.contextManager.clear();\n }\n}\n\n/**\n * Create a tracer\n */\nexport function createTracer(options: TracerOptions): Tracer {\n return new Tracer(options);\n}\n\n// ============================================================================\n// GLOBAL TRACER\n// ============================================================================\n\nlet globalTracer: Tracer | null = null;\n\n/**\n * Get the global tracer instance\n */\nexport function getGlobalTracer(): Tracer | null {\n return globalTracer;\n}\n\n/**\n * Set the global tracer instance\n */\nexport function setGlobalTracer(tracer: Tracer): void {\n globalTracer = tracer;\n}\n\n/**\n * Reset the global tracer (for testing)\n */\nexport function resetGlobalTracer(): void {\n globalTracer = null;\n}\n\n// ============================================================================\n// MIDDLEWARE HELPERS\n// ============================================================================\n\n/**\n * Create HTTP server tracing middleware\n */\nexport function createTracingMiddleware(tracer: Tracer) {\n return async (\n request: Request,\n next: () => Promise<Response>\n ): Promise<Response> => {\n // Extract trace context from incoming request\n const parentCtx = tracer.extract(request.headers);\n\n // Start server span\n const url = new URL(request.url);\n const spanOpts: {\n kind: SpanKind;\n parent?: TraceContext;\n attributes: Record<string, SpanAttributeValue>;\n } = {\n kind: \"server\",\n attributes: {\n [SpanAttributes.HTTP_METHOD]: request.method,\n [SpanAttributes.HTTP_URL]: request.url,\n },\n };\n if (parentCtx) {\n spanOpts.parent = parentCtx;\n }\n const span = tracer.startSpan(`${request.method} ${url.pathname}`, spanOpts);\n\n if (!span) {\n return next();\n }\n\n try {\n const response = await tracer.getContextManager().run(span.traceContext, next);\n\n tracer.endSpan(span);\n span.attributes[SpanAttributes.HTTP_STATUS_CODE] = response.status;\n\n return response;\n } catch (error) {\n tracer.endSpan(span, error as Error);\n throw error;\n }\n };\n}\n\n/**\n * Create RPC tracing helpers\n */\nexport function createRpcTracing(tracer: Tracer) {\n return {\n /**\n * Trace an outgoing RPC call\n */\n async traceCall<T>(\n service: string,\n method: string,\n fn: () => Promise<T>\n ): Promise<T> {\n return tracer.trace(\n `rpc.${service}.${method}`,\n fn,\n {\n kind: \"client\",\n attributes: {\n [SpanAttributes.RPC_SYSTEM]: \"pars\",\n [SpanAttributes.RPC_SERVICE]: service,\n [SpanAttributes.RPC_METHOD]: method,\n },\n }\n );\n },\n\n /**\n * Trace an incoming RPC request\n */\n async traceHandler<T>(\n service: string,\n method: string,\n fn: () => Promise<T>,\n parentCtx?: TraceContext\n ): Promise<T> {\n const handlerOpts: {\n kind: SpanKind;\n parent?: TraceContext;\n attributes: Record<string, SpanAttributeValue>;\n } = {\n kind: \"server\",\n attributes: {\n [SpanAttributes.RPC_SYSTEM]: \"pars\",\n [SpanAttributes.RPC_SERVICE]: service,\n [SpanAttributes.RPC_METHOD]: method,\n },\n };\n if (parentCtx) {\n handlerOpts.parent = parentCtx;\n }\n const span = tracer.startSpan(`rpc.${service}.${method}`, handlerOpts);\n\n if (!span) {\n return fn();\n }\n\n try {\n const result = await tracer.getContextManager().run(span.traceContext, fn);\n tracer.endSpan(span);\n return result;\n } catch (error) {\n tracer.endSpan(span, error as Error);\n throw error;\n }\n },\n };\n}\n"],"mappings":";AAcO,SAAS,kBAA0B;AACxC,QAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,SAAO,gBAAgB,KAAK;AAC5B,SAAO,MAAM,KAAK,KAAK,EACpB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AAKO,SAAS,iBAAyB;AACvC,QAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,SAAO,gBAAgB,KAAK;AAC5B,SAAO,MAAM,KAAK,KAAK,EACpB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AASO,SAAS,mBAAmB,SAKlB;AACf,QAAM,MAAoB;AAAA,IACxB,SAAS,SAAS,WAAW,gBAAgB;AAAA,IAC7C,QAAQ,SAAS,UAAU,eAAe;AAAA,IAC1C,YAAY,SAAS,cAAc;AAAA;AAAA,EACrC;AAEA,MAAI,SAAS,YAAY;AACvB,QAAI,aAAa,QAAQ;AAAA,EAC3B;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,QAAoC;AACrE,QAAM,MAAoB;AAAA,IACxB,SAAS,OAAO;AAAA,IAChB,QAAQ,eAAe;AAAA,IACvB,YAAY,OAAO;AAAA,EACrB;AAEA,MAAI,OAAO,YAAY;AACrB,QAAI,aAAa,OAAO;AAAA,EAC1B;AAEA,SAAO;AACT;AAYO,SAAS,kBAAkB,KAA2B;AAC3D,QAAM,UAAU;AAChB,QAAM,QAAQ,IAAI,WAAW,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACzD,SAAO,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,KAAK;AACzD;AAKO,SAAS,iBAAiB,QAAqC;AACpE,QAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,GAAG;AACrC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,SAAS,SAAS,QAAQ,KAAK,IAAI;AAG1C,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,WAAW,QAAQ,WAAW,MAAM,CAAC,eAAe,KAAK,OAAO,GAAG;AACtE,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,UAAU,OAAO,WAAW,MAAM,CAAC,eAAe,KAAK,MAAM,GAAG;AACnE,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,SAAS,MAAM,WAAW,KAAK,CAAC,eAAe,KAAK,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,QAAQ,YAAY;AAAA,IAC7B,QAAQ,OAAO,YAAY;AAAA,IAC3B,YAAY,SAAS,OAAO,EAAE;AAAA,EAChC;AACF;AAWO,SAAS,iBAAiB,OAAuC;AACtE,SAAO,OAAO,QAAQ,KAAK,EACxB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,EACvC,KAAK,GAAG;AACb;AAKO,SAAS,gBAAgB,QAAwC;AACtE,QAAM,QAAgC,CAAC;AAEvC,aAAW,QAAQ,OAAO,MAAM,GAAG,GAAG;AACpC,UAAM,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE,MAAM,GAAG;AAC1C,QAAI,OAAO,OAAO;AAChB,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAUO,IAAM,sBAAN,MAA0B;AAAA,EACd,QAAwB,CAAC;AAAA;AAAA;AAAA;AAAA,EAK1C,UAAoC;AAClC,WAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAO,KAAmB,IAAkC;AAChE,SAAK,MAAM,KAAK,GAAG;AACnB,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,UAAE;AACA,WAAK,MAAM,IAAI;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAY,IAAkC;AAClD,UAAM,SAAS,KAAK,QAAQ;AAC5B,UAAM,QAAQ,SAAS,mBAAmB,MAAM,IAAI,mBAAmB;AACvE,WAAO,KAAK,IAAI,OAAO,EAAE;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAqE;AAC/E,UAAM,cACJ,mBAAmB,UACf,QAAQ,IAAI,aAAa,IACzB,QAAQ,aAAa;AAE3B,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,iBAAiB,WAAW;AACxC,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAEA,UAAM,aACJ,mBAAmB,UACf,QAAQ,IAAI,YAAY,IACxB,QAAQ,YAAY;AAE1B,QAAI,YAAY;AACd,UAAI,aAAa;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAA2C;AACnD,UAAM,UAAkC;AAAA,MACtC,aAAa,kBAAkB,GAAG;AAAA,IACpC;AAEA,QAAI,IAAI,YAAY;AAClB,cAAQ,YAAY,IAAI,IAAI;AAAA,IAC9B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,UAAM,MAAM,KAAK,QAAQ;AACzB,WAAO,OAAO,IAAI,aAAa,OAAU,IAAI;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,SAAS;AAAA,EACtB;AACF;AAWO,SAAS,aAAa,SAAkB,SAA2B;AACxE,MAAI,YAAY,UAAU;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,EACT;AAGA,MAAI,SAAS;AAEX,UAAM,OAAO,SAAS,QAAQ,MAAM,EAAE,GAAG,EAAE;AAC3C,UAAM,YAAY,KAAK,MAAM,QAAQ,QAAQ,UAAU;AACvD,WAAO,OAAO;AAAA,EAChB;AAGA,SAAO,KAAK,OAAO,IAAI,QAAQ;AACjC;;;AC9PO,SAAS,WAAW,SAA4B;AACrD,MAAI;AAEJ,MAAI,QAAQ,QAAQ;AAClB,mBAAe;AAAA,MACb,SAAS,QAAQ,OAAO;AAAA,MACxB,QAAQ,eAAe;AAAA,MACvB,YAAY,QAAQ,OAAO;AAAA,IAC7B;AACA,QAAI,QAAQ,OAAO,YAAY;AAC7B,mBAAa,aAAa,QAAQ,OAAO;AAAA,IAC3C;AAAA,EACF,OAAO;AACL,mBAAe,mBAAmB;AAAA,EACpC;AAEA,QAAM,OAAa;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ,QAAQ;AAAA,IACtB;AAAA,IACA,WAAW,QAAQ,aAAa,KAAK,IAAI;AAAA,IACzC,QAAQ;AAAA,IACR,YAAY,QAAQ,cAAc,CAAC;AAAA,IACnC,QAAQ,CAAC;AAAA,EACX;AAEA,MAAI,QAAQ,QAAQ,QAAQ;AAC1B,SAAK,eAAe,QAAQ,OAAO;AAAA,EACrC;AAEA,SAAO;AACT;AASO,IAAM,cAAN,MAAkB;AAAA,EACN,QAA2B,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,EAKpD,UAAU,SAA4B;AACpC,UAAM,OAAO,WAAW,OAAO;AAC/B,SAAK,MAAM,IAAI,KAAK,aAAa,QAAQ,IAAI;AAC7C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAY,QAA2B;AAC7C,SAAK,UAAU,KAAK,IAAI;AACxB,QAAI,QAAQ;AACV,WAAK,SAAS;AAAA,IAChB,WAAW,KAAK,WAAW,SAAS;AAClC,WAAK,SAAS;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAY,KAAa,OAAiC;AACrE,SAAK,WAAW,GAAG,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAY,YAAsD;AAC9E,WAAO,OAAO,KAAK,YAAY,UAAU;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,MACA,MACA,YACM;AACN,UAAM,QAAmB;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,IAAI;AAAA,IACjB;AACA,QAAI,YAAY;AACd,YAAM,aAAa;AAAA,IACrB;AACA,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAY,QAA0B;AAC9C,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAY,OAAoB;AAC9C,SAAK,SAAS;AACd,SAAK,SAAS,MAAM,aAAa;AAAA,MAC/B,kBAAkB,MAAM;AAAA,MACxB,qBAAqB,MAAM;AAAA,MAC3B,wBAAwB,MAAM,SAAS;AAAA,IACzC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAkC;AACxC,WAAO,KAAK,MAAM,IAAI,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAgB;AACd,UAAM,YAAY,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO;AACzE,eAAW,QAAQ,WAAW;AAC5B,WAAK,MAAM,OAAO,KAAK,aAAa,MAAM;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AACF;AASO,SAAS,gBAAgB,MAAgC;AAC9D,MAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,SAAO,KAAK,UAAU,KAAK;AAC7B;AAKO,SAAS,gBAAgB,MAAqB;AACnD,SAAO,KAAK,YAAY;AAC1B;AAKO,SAAS,gBAAgB,MAAqC;AACnE,SAAO;AAAA,IACL,SAAS,KAAK,aAAa;AAAA,IAC3B,QAAQ,KAAK,aAAa;AAAA,IAC1B,cAAc,KAAK;AAAA,IACnB,MAAM,KAAK;AAAA,IACX,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY;AAAA,IAChD,SAAS,KAAK,UAAU,IAAI,KAAK,KAAK,OAAO,EAAE,YAAY,IAAI;AAAA,IAC/D,YAAY,gBAAgB,IAAI;AAAA,IAChC,YAAY,KAAK;AAAA,IACjB,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO;AAAA,MAC9B,MAAM,EAAE;AAAA,MACR,MAAM,IAAI,KAAK,EAAE,IAAI,EAAE,YAAY;AAAA,MACnC,YAAY,EAAE;AAAA,IAChB,EAAE;AAAA,EACJ;AACF;AASO,IAAM,iBAAiB;AAAA;AAAA,EAE5B,aAAa;AAAA,EACb,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA;AAAA,EAG9B,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA;AAAA,EAGZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAGd,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,sBAAsB;AAAA;AAAA,EAGtB,cAAc;AAAA,EACd,iBAAiB;AAAA;AAAA,EAGjB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA;AAAA,EAGtB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,iBAAiB;AACnB;;;ACjQA,SAAS,oBAAoB;AAsCtB,IAAM,kBAAN,MAA8C;AAAA,EAC1C,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAkC,CAAC,GAAG;AAChD,SAAK,SAAS,QAAQ,UAAU,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACvE,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,oBAAoB,QAAQ,qBAAqB;AACtD,SAAK,gBAAgB,QAAQ,iBAAiB;AAAA,EAChD;AAAA,EAEA,MAAM,OAAO,OAA8B;AACzC,eAAW,QAAQ,OAAO;AACxB,YAAM,WAAW,gBAAgB,IAAI;AACrC,YAAM,SAAS,KAAK,WAAW,UAAU,UAAU,KAAK,WAAW,OAAO,OAAO;AAEjF,UAAI,KAAK,QAAQ;AACf,cAAM,SAAS,KAAK,eAAe,mBAAS;AAC5C,cAAM,aAAa,KAAK,WAAW,UAAU,WAAM,KAAK,WAAW,OAAO,WAAM;AAChF,cAAM,cAAc,aAAa,SAAY,GAAG,QAAQ,OAAO;AAE/D,gBAAQ;AAAA,UACN,GAAG,MAAM,IAAI,UAAU,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,WAAW,WAAW,KAAK,aAAa,QAAQ,MAAM,GAAG,CAAC,CAAC;AAAA,QACrH;AAEA,YAAI,KAAK,qBAAqB,OAAO,KAAK,KAAK,UAAU,EAAE,SAAS,GAAG;AACrE,kBAAQ,IAAI,oBAAoB,KAAK,UAAU;AAAA,QACjD;AAEA,YAAI,KAAK,iBAAiB,KAAK,OAAO,SAAS,GAAG;AAChD,qBAAW,SAAS,KAAK,QAAQ;AAC/B,oBAAQ,IAAI,eAAe,MAAM,IAAI,IAAI,MAAM,cAAc,EAAE;AAAA,UACjE;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,SAAS,gBAAgB,IAAI;AACnC,aAAK,OAAO,KAAK,SAAS,KAAK,IAAI,IAAI;AAAA,UACrC,GAAG;AAAA,UACH;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAA0B;AAAA,EAEhC;AACF;AAKO,SAAS,sBAAsB,SAAmD;AACvF,SAAO,IAAI,gBAAgB,OAAO;AACpC;AA0BO,IAAM,eAAN,MAA2C;AAAA,EACvC,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAiB,CAAC;AAAA,EAC3B,aAAoD;AAAA,EAE5D,YAAY,SAA8B;AACxC,SAAK,WAAW,QAAQ,SAAS,QAAQ,OAAO,EAAE;AAClD,SAAK,cAAc,QAAQ;AAC3B,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,UAAU,QAAQ,WAAW,CAAC;AACnC,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,gBAAgB,QAAQ,iBAAiB;AAC9C,SAAK,SAAS,QAAQ,UAAU,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGtE,SAAK,aAAa,YAAY,MAAM,KAAK,MAAM,GAAG,KAAK,aAAa;AAAA,EACtE;AAAA,EAEA,MAAM,OAAO,OAA8B;AACzC,SAAK,OAAO,KAAK,GAAG,KAAK;AAEzB,QAAI,KAAK,OAAO,UAAU,KAAK,WAAW;AACxC,YAAM,KAAK,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAc,QAAuB;AACnC,QAAI,KAAK,OAAO,WAAW,EAAG;AAE9B,UAAM,gBAAgB,KAAK,OAAO,OAAO,GAAG,KAAK,SAAS;AAE1D,QAAI;AACF,YAAM,UAAU,KAAK,iBAAiB,aAAa;AACnD,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAEnE,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,cAAc;AAAA,UACzD,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,GAAG,KAAK;AAAA,UACV;AAAA,UACA,MAAM,KAAK,UAAU,OAAO;AAAA,UAC5B,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,uBAAuB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,QACjF;AAEA,aAAK,OAAO,MAAM,YAAY,cAAc,MAAM,gBAAgB;AAAA,MACpE,UAAE;AACA,qBAAa,SAAS;AAAA,MACxB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,OAAO,MAAM,kCAAkC,KAAc;AAElE,WAAK,OAAO,QAAQ,GAAG,aAAa;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAiC;AACxD,WAAO;AAAA,MACL,eAAe;AAAA,QACb;AAAA,UACE,UAAU;AAAA,YACR,YAAY;AAAA,cACV,EAAE,KAAK,gBAAgB,OAAO,EAAE,aAAa,KAAK,YAAY,EAAE;AAAA,cAChE,EAAE,KAAK,mBAAmB,OAAO,EAAE,aAAa,KAAK,eAAe,EAAE;AAAA,YACxE;AAAA,UACF;AAAA,UACA,YAAY;AAAA,YACV;AAAA,cACE,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,SAAS;AAAA,cACX;AAAA,cACA,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,MAAsB;AACxC,UAAM,WAAqB;AAAA,MACzB,SAAS,KAAK,aAAa;AAAA,MAC3B,QAAQ,KAAK,aAAa;AAAA,MAC1B,MAAM,KAAK;AAAA,MACX,MAAM,KAAK,gBAAgB,KAAK,IAAI;AAAA,MACpC,mBAAmB,OAAO,KAAK,YAAY,GAAS;AAAA,MACpD,YAAY,OAAO,QAAQ,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,QACjE;AAAA,QACA,OAAO,KAAK,sBAAsB,KAAK;AAAA,MACzC,EAAE;AAAA,MACF,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW;AAAA,QAClC,MAAM,MAAM;AAAA,QACZ,cAAc,OAAO,MAAM,OAAO,GAAS;AAAA,QAC3C,YAAY,MAAM,aACd,OAAO,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,UACtD;AAAA,UACA,OAAO,KAAK,sBAAsB,KAAK;AAAA,QACzC,EAAE,IACF,CAAC;AAAA,MACP,EAAE;AAAA,MACF,QAAQ;AAAA,QACN,MAAM,KAAK,WAAW,UAAU,IAAI,KAAK,WAAW,OAAO,IAAI;AAAA,MACjE;AAAA,IACF;AAEA,QAAI,KAAK,cAAc;AACrB,eAAS,eAAe,KAAK;AAAA,IAC/B;AACA,QAAI,KAAK,SAAS;AAChB,eAAS,kBAAkB,OAAO,KAAK,UAAU,GAAS;AAAA,IAC5D;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,MAAsB;AAC5C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,sBAAsB,OAAoC;AAChE,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,EAAE,aAAa,MAAM;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,OAAO,UAAU,KAAK,GAAG;AAC3B,eAAO,EAAE,UAAU,OAAO,KAAK,EAAE;AAAA,MACnC;AACA,aAAO,EAAE,aAAa,MAAM;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,WAAW;AAC9B,aAAO,EAAE,WAAW,MAAM;AAAA,IAC5B;AACA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO;AAAA,QACL,YAAY;AAAA,UACV,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,sBAAsB,CAAC,CAAC;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,aAAa,OAAO,KAAK,EAAE;AAAA,EACtC;AAAA,EAEA,MAAM,WAA0B;AAC9B,QAAI,KAAK,YAAY;AACnB,oBAAc,KAAK,UAAU;AAC7B,WAAK,aAAa;AAAA,IACpB;AACA,UAAM,KAAK,MAAM;AAAA,EACnB;AACF;AAKO,SAAS,mBAAmB,SAA4C;AAC7E,SAAO,IAAI,aAAa,OAAO;AACjC;;;ACnTA,SAAS,gBAAAA,qBAAoB;AAgCtB,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,aAAoD;AAAA,EAE5D,YAAY,SAAwB;AAClC,SAAK,cAAc,QAAQ;AAC3B,SAAK,iBAAiB,QAAQ,kBAAkB;AAChD,SAAK,UAAU,QAAQ,QAAQ,WAAW;AAC1C,SAAK,UAAU,QAAQ,QAAQ,WAAW,EAAE,OAAO,IAAI;AACvD,SAAK,WAAW,QAAQ,YAAY,IAAI,gBAAgB;AACxD,SAAK,SAAS,QAAQ,UAAUC,cAAa,EAAE,MAAM,UAAU,QAAQ,WAAW,GAAG,CAAC;AACtF,SAAK,iBAAiB,IAAI,oBAAoB;AAC9C,SAAK,cAAc,IAAI,YAAY;AAGnC,QAAI,KAAK,SAAS;AAChB,WAAK,aAAa,YAAY,MAAM,KAAK,MAAM,GAAG,GAAI;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UACE,MACA,SAKa;AACb,QAAI,CAAC,KAAK,QAAS,QAAO;AAG1B,UAAM,SAAS,SAAS,UAAU,KAAK,eAAe,QAAQ;AAG9D,QAAI,CAAC,UAAU,CAAC,aAAa,KAAK,OAAO,GAAG;AAC1C,aAAO;AAAA,IACT;AAEA,UAAM,cAAgE;AAAA,MACpE;AAAA,MACA,MAAM,SAAS,QAAQ;AAAA,MACvB,YAAY;AAAA,QACV,CAAC,eAAe,YAAY,GAAG,KAAK;AAAA,QACpC,CAAC,eAAe,eAAe,GAAG,KAAK;AAAA,QACvC,GAAG,SAAS;AAAA,MACd;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,kBAAY,SAAS;AAAA,IACvB;AAEA,UAAM,OAAO,KAAK,YAAY,UAAU,WAAW;AAEnD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAAmB,OAAqB;AAC9C,QAAI,CAAC,KAAM;AAEX,QAAI,OAAO;AACT,WAAK,YAAY,gBAAgB,MAAM,KAAK;AAAA,IAC9C;AAEA,SAAK,YAAY,QAAQ,MAAM,QAAQ,UAAU,IAAI;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MACJ,MACA,IACA,SAIY;AACZ,UAAM,OAAO,KAAK,UAAU,MAAM,OAAO;AAEzC,QAAI,CAAC,MAAM;AACT,aAAO,GAAG,IAAI;AAAA,IAChB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,eAAe,IAAI,KAAK,cAAc,MAAM,GAAG,IAAI,CAAC;AAC9E,WAAK,QAAQ,IAAI;AACjB,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,QAAQ,MAAM,KAAc;AACjC,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAa,OAAiC;AACzD,UAAM,MAAM,KAAK,eAAe,QAAQ;AACxC,QAAI,CAAC,IAAK;AAEV,UAAM,OAAO,KAAK,YAAY,QAAQ,IAAI,MAAM;AAChD,QAAI,MAAM;AACR,WAAK,YAAY,aAAa,MAAM,KAAK,KAAK;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAc,YAAuD;AAC5E,UAAM,MAAM,KAAK,eAAe,QAAQ;AACxC,QAAI,CAAC,IAAK;AAEV,UAAM,OAAO,KAAK,YAAY,QAAQ,IAAI,MAAM;AAChD,QAAI,MAAM;AACR,WAAK,YAAY,SAAS,MAAM,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAA2C;AACzC,WAAO,KAAK,eAAe,QAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAyC;AACvC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAqE;AAC3E,WAAO,KAAK,eAAe,YAAY,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAA4C;AACjD,UAAM,UAAU,OAAO,KAAK,eAAe,QAAQ;AACnD,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,WAAO,KAAK,eAAe,UAAU,OAAO;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,KAAK,YAAY,MAAM;AACrC,QAAI,MAAM,SAAS,GAAG;AACpB,UAAI;AACF,cAAM,KAAK,SAAS,OAAO,KAAK;AAAA,MAClC,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,0BAA0B,KAAc;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC9B,QAAI,KAAK,YAAY;AACnB,oBAAc,KAAK,UAAU;AAC7B,WAAK,aAAa;AAAA,IACpB;AAEA,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,SAAS,SAAS;AAC7B,SAAK,YAAY,MAAM;AACvB,SAAK,eAAe,MAAM;AAAA,EAC5B;AACF;AAKO,SAAS,aAAa,SAAgC;AAC3D,SAAO,IAAI,OAAO,OAAO;AAC3B;AAMA,IAAI,eAA8B;AAK3B,SAAS,kBAAiC;AAC/C,SAAO;AACT;AAKO,SAAS,gBAAgB,QAAsB;AACpD,iBAAe;AACjB;AAKO,SAAS,oBAA0B;AACxC,iBAAe;AACjB;AASO,SAAS,wBAAwB,QAAgB;AACtD,SAAO,OACL,SACA,SACsB;AAEtB,UAAM,YAAY,OAAO,QAAQ,QAAQ,OAAO;AAGhD,UAAM,MAAM,IAAI,IAAI,QAAQ,GAAG;AAC/B,UAAM,WAIF;AAAA,MACF,MAAM;AAAA,MACN,YAAY;AAAA,QACV,CAAC,eAAe,WAAW,GAAG,QAAQ;AAAA,QACtC,CAAC,eAAe,QAAQ,GAAG,QAAQ;AAAA,MACrC;AAAA,IACF;AACA,QAAI,WAAW;AACb,eAAS,SAAS;AAAA,IACpB;AACA,UAAM,OAAO,OAAO,UAAU,GAAG,QAAQ,MAAM,IAAI,IAAI,QAAQ,IAAI,QAAQ;AAE3E,QAAI,CAAC,MAAM;AACT,aAAO,KAAK;AAAA,IACd;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,kBAAkB,EAAE,IAAI,KAAK,cAAc,IAAI;AAE7E,aAAO,QAAQ,IAAI;AACnB,WAAK,WAAW,eAAe,gBAAgB,IAAI,SAAS;AAE5D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,aAAO,QAAQ,MAAM,KAAc;AACnC,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAKO,SAAS,iBAAiB,QAAgB;AAC/C,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,MAAM,UACJ,SACA,QACA,IACY;AACZ,aAAO,OAAO;AAAA,QACZ,OAAO,OAAO,IAAI,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,YACV,CAAC,eAAe,UAAU,GAAG;AAAA,YAC7B,CAAC,eAAe,WAAW,GAAG;AAAA,YAC9B,CAAC,eAAe,UAAU,GAAG;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,aACJ,SACA,QACA,IACA,WACY;AACZ,YAAM,cAIF;AAAA,QACF,MAAM;AAAA,QACN,YAAY;AAAA,UACV,CAAC,eAAe,UAAU,GAAG;AAAA,UAC7B,CAAC,eAAe,WAAW,GAAG;AAAA,UAC9B,CAAC,eAAe,UAAU,GAAG;AAAA,QAC/B;AAAA,MACF;AACA,UAAI,WAAW;AACb,oBAAY,SAAS;AAAA,MACvB;AACA,YAAM,OAAO,OAAO,UAAU,OAAO,OAAO,IAAI,MAAM,IAAI,WAAW;AAErE,UAAI,CAAC,MAAM;AACT,eAAO,GAAG;AAAA,MACZ;AAEA,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,kBAAkB,EAAE,IAAI,KAAK,cAAc,EAAE;AACzE,eAAO,QAAQ,IAAI;AACnB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO,QAAQ,MAAM,KAAc;AACnC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":["createLogger","createLogger"]}
@@ -0,0 +1,237 @@
1
+ import { Logger } from '@parsrun/core';
2
+ import { s as RpcTransport, F as Fetcher, f as RpcRequest, g as RpcResponse, t as EventTransport, P as ParsEvent, j as EventHandler, e as EventHandlerOptions, U as Unsubscribe } from '../../types-n4LLSPQU.js';
3
+ import { Serializer } from '../../serialization/index.js';
4
+ import { R as RpcServer } from '../../server-DFE8n2Sx.js';
5
+ import { E as EventHandlerRegistry } from '../../handler-CmiDUWZv.js';
6
+
7
+ /**
8
+ * @parsrun/service - Cloudflare Service Binding Transport
9
+ * RPC transport using Cloudflare Workers Service Bindings
10
+ */
11
+
12
+ interface ServiceBindingTransportOptions {
13
+ /** Service name */
14
+ serviceName: string;
15
+ /** Cloudflare service binding */
16
+ binding: Fetcher;
17
+ /** Serializer (default: JSON) */
18
+ serializer?: Serializer;
19
+ /** Logger */
20
+ logger?: Logger;
21
+ /** Timeout in ms */
22
+ timeout?: number;
23
+ }
24
+ /**
25
+ * RPC transport using Cloudflare Service Bindings
26
+ *
27
+ * Service bindings provide zero-latency, in-network communication
28
+ * between Cloudflare Workers.
29
+ */
30
+ declare class ServiceBindingTransport implements RpcTransport {
31
+ readonly name = "service-binding";
32
+ private readonly serviceName;
33
+ private readonly binding;
34
+ private readonly serializer;
35
+ private readonly logger;
36
+ constructor(options: ServiceBindingTransportOptions);
37
+ call<TInput, TOutput>(request: RpcRequest<TInput>): Promise<RpcResponse<TOutput>>;
38
+ close(): Promise<void>;
39
+ }
40
+ /**
41
+ * Create a service binding transport
42
+ */
43
+ declare function createServiceBindingTransport(options: ServiceBindingTransportOptions): ServiceBindingTransport;
44
+
45
+ /**
46
+ * Create a request handler for service binding requests
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * // In your worker
51
+ * export default {
52
+ * fetch: createServiceBindingHandler(rpcServer),
53
+ * };
54
+ * ```
55
+ */
56
+ declare function createServiceBindingHandler(server: RpcServer, options?: {
57
+ serializer?: Serializer;
58
+ logger?: Logger;
59
+ }): (request: Request) => Promise<Response>;
60
+
61
+ /**
62
+ * @parsrun/service - Cloudflare Queue Transport
63
+ * Event transport using Cloudflare Queues
64
+ */
65
+
66
+ /**
67
+ * Cloudflare Queue interface
68
+ */
69
+ interface CloudflareQueue {
70
+ send(message: unknown, options?: {
71
+ contentType?: string;
72
+ }): Promise<void>;
73
+ sendBatch(messages: Array<{
74
+ body: unknown;
75
+ contentType?: string;
76
+ }>): Promise<void>;
77
+ }
78
+ /**
79
+ * Queue message from Cloudflare
80
+ */
81
+ interface QueueMessage<T = unknown> {
82
+ id: string;
83
+ timestamp: Date;
84
+ body: T;
85
+ ack(): void;
86
+ retry(): void;
87
+ }
88
+ /**
89
+ * Queue batch from Cloudflare
90
+ */
91
+ interface QueueBatch<T = unknown> {
92
+ queue: string;
93
+ messages: QueueMessage<T>[];
94
+ ackAll(): void;
95
+ retryAll(): void;
96
+ }
97
+ interface CloudflareQueueTransportOptions {
98
+ /** Cloudflare Queue binding */
99
+ queue: CloudflareQueue;
100
+ /** Queue name (for logging) */
101
+ queueName?: string;
102
+ /** Use compact event format */
103
+ compact?: boolean;
104
+ /** Logger */
105
+ logger?: Logger;
106
+ /** Batch size for sending */
107
+ batchSize?: number;
108
+ /** Flush interval in ms */
109
+ flushInterval?: number;
110
+ }
111
+ /**
112
+ * Event transport using Cloudflare Queues
113
+ *
114
+ * Events are sent to a Cloudflare Queue for async processing.
115
+ * Handlers are registered to process events from the queue.
116
+ */
117
+ declare class CloudflareQueueTransport implements EventTransport {
118
+ readonly name = "cloudflare-queue";
119
+ private readonly queue;
120
+ private readonly queueName;
121
+ private readonly compact;
122
+ private readonly logger;
123
+ private readonly batchSize;
124
+ private readonly flushInterval;
125
+ private readonly registry;
126
+ private readonly buffer;
127
+ private flushTimer;
128
+ constructor(options: CloudflareQueueTransportOptions);
129
+ /**
130
+ * Emit an event to the queue
131
+ */
132
+ emit<T>(event: ParsEvent<T>): Promise<void>;
133
+ /**
134
+ * Subscribe to events (for local handler registration)
135
+ */
136
+ subscribe(eventType: string, handler: EventHandler, options?: EventHandlerOptions): Unsubscribe;
137
+ /**
138
+ * Flush buffered events to the queue
139
+ */
140
+ flush(): Promise<void>;
141
+ /**
142
+ * Handle a queue message (called by queue consumer)
143
+ */
144
+ handleMessage<T>(message: QueueMessage<T>): Promise<void>;
145
+ /**
146
+ * Handle a batch of queue messages
147
+ */
148
+ handleBatch<T>(batch: QueueBatch<T>): Promise<void>;
149
+ /**
150
+ * Parse event from message body
151
+ */
152
+ private parseEvent;
153
+ /**
154
+ * Close the transport
155
+ */
156
+ close(): Promise<void>;
157
+ }
158
+ /**
159
+ * Create a Cloudflare Queue transport
160
+ */
161
+ declare function createCloudflareQueueTransport(options: CloudflareQueueTransportOptions): CloudflareQueueTransport;
162
+ /**
163
+ * Create a queue consumer handler
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * // In your worker
168
+ * const consumer = createQueueConsumer(registry);
169
+ *
170
+ * export default {
171
+ * queue: consumer,
172
+ * };
173
+ * ```
174
+ */
175
+ declare function createQueueConsumer(registry: EventHandlerRegistry, options?: {
176
+ compact?: boolean;
177
+ logger?: Logger;
178
+ }): (batch: QueueBatch) => Promise<void>;
179
+
180
+ /**
181
+ * @parsrun/service - Durable Object Transport
182
+ * RPC/Event transport using Cloudflare Durable Objects
183
+ */
184
+
185
+ /**
186
+ * Durable Object namespace binding
187
+ */
188
+ interface DurableObjectNamespace {
189
+ idFromName(name: string): DurableObjectId;
190
+ idFromString(id: string): DurableObjectId;
191
+ newUniqueId(): DurableObjectId;
192
+ get(id: DurableObjectId): DurableObjectStub;
193
+ }
194
+ /**
195
+ * Durable Object ID
196
+ */
197
+ interface DurableObjectId {
198
+ toString(): string;
199
+ }
200
+ /**
201
+ * Durable Object stub for making requests
202
+ */
203
+ interface DurableObjectStub {
204
+ fetch(input: string | Request | URL, init?: RequestInit): Promise<Response>;
205
+ }
206
+ interface DurableObjectTransportOptions {
207
+ /** Durable Object namespace */
208
+ namespace: DurableObjectNamespace;
209
+ /** Object ID or name resolver */
210
+ objectId: string | ((request: RpcRequest) => string);
211
+ /** Serializer (default: JSON) */
212
+ serializer?: Serializer;
213
+ /** Logger */
214
+ logger?: Logger;
215
+ }
216
+ /**
217
+ * RPC transport using Durable Objects
218
+ *
219
+ * Routes requests to specific Durable Object instances,
220
+ * enabling stateful, single-threaded execution.
221
+ */
222
+ declare class DurableObjectTransport implements RpcTransport {
223
+ readonly name = "durable-object";
224
+ private readonly namespace;
225
+ private readonly objectIdResolver;
226
+ private readonly serializer;
227
+ private readonly logger;
228
+ constructor(options: DurableObjectTransportOptions);
229
+ call<TInput, TOutput>(request: RpcRequest<TInput>): Promise<RpcResponse<TOutput>>;
230
+ close(): Promise<void>;
231
+ }
232
+ /**
233
+ * Create a Durable Object transport
234
+ */
235
+ declare function createDurableObjectTransport(options: DurableObjectTransportOptions): DurableObjectTransport;
236
+
237
+ export { CloudflareQueueTransport, type CloudflareQueueTransportOptions, DurableObjectTransport, type DurableObjectTransportOptions, type QueueBatch, type QueueMessage, ServiceBindingTransport, type ServiceBindingTransportOptions, createCloudflareQueueTransport, createDurableObjectTransport, createQueueConsumer, createServiceBindingHandler, createServiceBindingTransport };