@parsrun/service 0.1.29 → 0.1.31
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/client.d.ts +30 -3
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/define.d.ts +29 -6
- package/dist/define.js.map +1 -1
- package/dist/events/index.d.ts +95 -15
- package/dist/events/index.js.map +1 -1
- package/dist/{handler-CmiDUWZv.d.ts → handler-eCIZLODd.d.ts} +45 -3
- package/dist/{index-CVOAoJjZ.d.ts → index-reEpIe1R.d.ts} +82 -11
- package/dist/index.d.ts +53 -9
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/resilience/index.d.ts +76 -9
- package/dist/resilience/index.js +1 -0
- package/dist/resilience/index.js.map +1 -1
- package/dist/rpc/index.d.ts +3 -3
- package/dist/rpc/index.js +1 -0
- package/dist/rpc/index.js.map +1 -1
- package/dist/serialization/index.d.ts +27 -2
- package/dist/serialization/index.js.map +1 -1
- package/dist/{server-DFE8n2Sx.d.ts → server-BB9AbnkP.d.ts} +50 -6
- package/dist/tracing/index.d.ts +94 -15
- package/dist/tracing/index.js.map +1 -1
- package/dist/transports/cloudflare/index.d.ts +72 -10
- package/dist/transports/cloudflare/index.js.map +1 -1
- package/dist/{types-n4LLSPQU.d.ts → types-DHZaZwAt.d.ts} +51 -0
- package/package.json +3 -3
|
@@ -1 +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":"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","names":["createLogger","createLogger"]}
|
|
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\n/**\n * Sampling configuration for tracing.\n * - \"always\": Sample all traces\n * - \"never\": Never sample traces\n * - { ratio: number }: Sample a percentage of traces (0-1)\n */\nexport type Sampler = \"always\" | \"never\" | { ratio: number };\n\n/**\n * Determine if a trace should be sampled based on the sampler configuration.\n *\n * @param sampler - Sampling configuration\n * @param traceId - Optional trace ID for deterministic sampling\n * @returns Whether the 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\n/**\n * Options for creating a span.\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 for tracing an operation.\n *\n * @param options - Span configuration options\n * @returns A new span instance\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 *\n * @param span - The span to measure\n * @returns Duration in milliseconds, or undefined if not ended\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 a span is completed (has an end time).\n *\n * @param span - The span to check\n * @returns True if the span has been ended\n */\nexport function isSpanCompleted(span: Span): boolean {\n return span.endTime !== undefined;\n}\n\n/**\n * Convert a span to a simplified object for logging.\n *\n * @param span - The span to convert\n * @returns A plain object representation of the span\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\n/**\n * Interface for span exporters.\n * Exporters receive completed spans and send them to a backend.\n */\nexport interface SpanExporter {\n /** Exporter name */\n readonly name: string;\n /** Export spans to the backend */\n export(spans: Span[]): Promise<void>;\n /** Shutdown exporter and flush pending spans */\n shutdown(): Promise<void>;\n}\n\n/**\n * Base options for span exporters.\n */\nexport interface ExporterOptions {\n /** Logger */\n logger?: Logger;\n}\n\n// ============================================================================\n// CONSOLE EXPORTER\n// ============================================================================\n\n/**\n * Options for the console exporter.\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 and debugging.\n * Outputs spans to the console with optional pretty formatting.\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 for local development.\n *\n * @param options - Exporter configuration options\n * @returns A new console exporter instance\n */\nexport function createConsoleExporter(options?: ConsoleExporterOptions): ConsoleExporter {\n return new ConsoleExporter(options);\n}\n\n// ============================================================================\n// OTLP EXPORTER\n// ============================================================================\n\n/**\n * Options for the OTLP exporter.\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 * Sends spans to an OpenTelemetry-compatible backend via HTTP.\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 for production tracing.\n *\n * @param options - Exporter configuration options\n * @returns A new OTLP exporter instance\n *\n * @example\n * ```typescript\n * const exporter = createOtlpExporter({\n * endpoint: 'https://otel-collector.example.com:4318',\n * serviceName: 'payments',\n * });\n * ```\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\n/**\n * Options for creating a tracer.\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 for distributed tracing.\n *\n * @param options - Tracer configuration options\n * @returns A new tracer instance\n *\n * @example\n * ```typescript\n * const tracer = createTracer({\n * serviceName: 'payments',\n * config: { sampler: { ratio: 0.1 } },\n * });\n * await tracer.trace('processPayment', async (span) => {\n * // Processing logic\n * });\n * ```\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 * Automatically creates spans for incoming HTTP requests.\n *\n * @param tracer - The tracer instance to use\n * @returns Middleware function for HTTP frameworks\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 for instrumenting RPC calls.\n * Provides methods to trace outgoing calls and incoming handlers.\n *\n * @param tracer - The tracer instance to use\n * @returns Object with traceCall and traceHandler methods\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":"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","names":["createLogger","createLogger"]}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
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-
|
|
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-DHZaZwAt.js';
|
|
3
3
|
import { Serializer } from '../../serialization/index.js';
|
|
4
|
-
import { R as RpcServer } from '../../server-
|
|
5
|
-
import { E as EventHandlerRegistry } from '../../handler-
|
|
4
|
+
import { R as RpcServer } from '../../server-BB9AbnkP.js';
|
|
5
|
+
import { E as EventHandlerRegistry } from '../../handler-eCIZLODd.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* @parsrun/service - Cloudflare Service Binding Transport
|
|
9
9
|
* RPC transport using Cloudflare Workers Service Bindings
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Options for creating a service binding transport.
|
|
14
|
+
*/
|
|
12
15
|
interface ServiceBindingTransportOptions {
|
|
13
16
|
/** Service name */
|
|
14
17
|
serviceName: string;
|
|
@@ -38,7 +41,18 @@ declare class ServiceBindingTransport implements RpcTransport {
|
|
|
38
41
|
close(): Promise<void>;
|
|
39
42
|
}
|
|
40
43
|
/**
|
|
41
|
-
* Create a service binding transport
|
|
44
|
+
* Create a service binding transport for Cloudflare Workers.
|
|
45
|
+
*
|
|
46
|
+
* @param options - Transport configuration options
|
|
47
|
+
* @returns A new service binding transport instance
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const transport = createServiceBindingTransport({
|
|
52
|
+
* serviceName: 'payments',
|
|
53
|
+
* binding: env.PAYMENTS_SERVICE,
|
|
54
|
+
* });
|
|
55
|
+
* ```
|
|
42
56
|
*/
|
|
43
57
|
declare function createServiceBindingTransport(options: ServiceBindingTransportOptions): ServiceBindingTransport;
|
|
44
58
|
|
|
@@ -64,36 +78,53 @@ declare function createServiceBindingHandler(server: RpcServer, options?: {
|
|
|
64
78
|
*/
|
|
65
79
|
|
|
66
80
|
/**
|
|
67
|
-
* Cloudflare Queue interface
|
|
81
|
+
* Cloudflare Queue binding interface.
|
|
82
|
+
* Represents a Cloudflare Queue for sending messages.
|
|
68
83
|
*/
|
|
69
84
|
interface CloudflareQueue {
|
|
85
|
+
/** Send a single message to the queue */
|
|
70
86
|
send(message: unknown, options?: {
|
|
71
87
|
contentType?: string;
|
|
72
88
|
}): Promise<void>;
|
|
89
|
+
/** Send multiple messages to the queue in a batch */
|
|
73
90
|
sendBatch(messages: Array<{
|
|
74
91
|
body: unknown;
|
|
75
92
|
contentType?: string;
|
|
76
93
|
}>): Promise<void>;
|
|
77
94
|
}
|
|
78
95
|
/**
|
|
79
|
-
* Queue message from Cloudflare
|
|
96
|
+
* Queue message received from Cloudflare.
|
|
97
|
+
* Contains the message body and methods to acknowledge or retry.
|
|
80
98
|
*/
|
|
81
99
|
interface QueueMessage<T = unknown> {
|
|
100
|
+
/** Unique message identifier */
|
|
82
101
|
id: string;
|
|
102
|
+
/** Message timestamp */
|
|
83
103
|
timestamp: Date;
|
|
104
|
+
/** Message body */
|
|
84
105
|
body: T;
|
|
106
|
+
/** Acknowledge successful processing */
|
|
85
107
|
ack(): void;
|
|
108
|
+
/** Retry processing the message */
|
|
86
109
|
retry(): void;
|
|
87
110
|
}
|
|
88
111
|
/**
|
|
89
|
-
*
|
|
112
|
+
* Batch of queue messages from Cloudflare.
|
|
113
|
+
* Received by queue consumers for batch processing.
|
|
90
114
|
*/
|
|
91
115
|
interface QueueBatch<T = unknown> {
|
|
116
|
+
/** Queue name */
|
|
92
117
|
queue: string;
|
|
118
|
+
/** Messages in the batch */
|
|
93
119
|
messages: QueueMessage<T>[];
|
|
120
|
+
/** Acknowledge all messages in the batch */
|
|
94
121
|
ackAll(): void;
|
|
122
|
+
/** Retry all messages in the batch */
|
|
95
123
|
retryAll(): void;
|
|
96
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Options for creating a Cloudflare Queue transport.
|
|
127
|
+
*/
|
|
97
128
|
interface CloudflareQueueTransportOptions {
|
|
98
129
|
/** Cloudflare Queue binding */
|
|
99
130
|
queue: CloudflareQueue;
|
|
@@ -156,11 +187,28 @@ declare class CloudflareQueueTransport implements EventTransport {
|
|
|
156
187
|
close(): Promise<void>;
|
|
157
188
|
}
|
|
158
189
|
/**
|
|
159
|
-
* Create a Cloudflare Queue transport
|
|
190
|
+
* Create a Cloudflare Queue transport for event distribution.
|
|
191
|
+
*
|
|
192
|
+
* @param options - Transport configuration options
|
|
193
|
+
* @returns A new Cloudflare Queue transport instance
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* const transport = createCloudflareQueueTransport({
|
|
198
|
+
* queue: env.EVENTS_QUEUE,
|
|
199
|
+
* queueName: 'events',
|
|
200
|
+
* batchSize: 100,
|
|
201
|
+
* });
|
|
202
|
+
* ```
|
|
160
203
|
*/
|
|
161
204
|
declare function createCloudflareQueueTransport(options: CloudflareQueueTransportOptions): CloudflareQueueTransport;
|
|
162
205
|
/**
|
|
163
|
-
* Create a queue consumer handler
|
|
206
|
+
* Create a queue consumer handler for processing queue messages.
|
|
207
|
+
* Use this to handle incoming events from a Cloudflare Queue.
|
|
208
|
+
*
|
|
209
|
+
* @param registry - Event handler registry for processing events
|
|
210
|
+
* @param options - Consumer configuration options
|
|
211
|
+
* @returns Queue batch handler function
|
|
164
212
|
*
|
|
165
213
|
* @example
|
|
166
214
|
* ```typescript
|
|
@@ -203,6 +251,9 @@ interface DurableObjectId {
|
|
|
203
251
|
interface DurableObjectStub {
|
|
204
252
|
fetch(input: string | Request | URL, init?: RequestInit): Promise<Response>;
|
|
205
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* Options for creating a Durable Object transport.
|
|
256
|
+
*/
|
|
206
257
|
interface DurableObjectTransportOptions {
|
|
207
258
|
/** Durable Object namespace */
|
|
208
259
|
namespace: DurableObjectNamespace;
|
|
@@ -230,7 +281,18 @@ declare class DurableObjectTransport implements RpcTransport {
|
|
|
230
281
|
close(): Promise<void>;
|
|
231
282
|
}
|
|
232
283
|
/**
|
|
233
|
-
* Create a Durable Object transport
|
|
284
|
+
* Create a Durable Object transport for stateful RPC.
|
|
285
|
+
*
|
|
286
|
+
* @param options - Transport configuration options
|
|
287
|
+
* @returns A new Durable Object transport instance
|
|
288
|
+
*
|
|
289
|
+
* @example
|
|
290
|
+
* ```typescript
|
|
291
|
+
* const transport = createDurableObjectTransport({
|
|
292
|
+
* namespace: env.PAYMENTS_DO,
|
|
293
|
+
* objectId: (req) => req.metadata?.tenantId ?? 'default',
|
|
294
|
+
* });
|
|
295
|
+
* ```
|
|
234
296
|
*/
|
|
235
297
|
declare function createDurableObjectTransport(options: DurableObjectTransportOptions): DurableObjectTransport;
|
|
236
298
|
|