@rivetkit/traces 2.1.5 → 2.1.6-rc.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/traces.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Buffer } from \"node:buffer\";\nimport { randomBytes } from \"node:crypto\";\nimport { performance } from \"node:perf_hooks\";\nimport { decode as decodeCbor, encode as encodeCbor } from \"cbor-x\";\nimport { pack, unpack } from \"fdb-tuple\";\nimport {\n\tCHUNK_VERSIONED,\n\tCURRENT_VERSION,\n\tencodeRecord,\n\ttype ActiveSpanRef,\n\ttype Attributes,\n\ttype Chunk,\n\ttype KeyValue,\n\ttype Record as TraceRecord,\n\ttype RecordBody,\n\ttype SpanEnd,\n\ttype SpanEvent,\n\ttype SpanId,\n\ttype SpanLink,\n\ttype SpanRecordKey,\n\ttype SpanSnapshot,\n\ttype SpanStart,\n\ttype SpanStatus,\n\tSpanStatusCode,\n\ttype SpanUpdate,\n\ttype StringId,\n\ttype TraceId,\n} from \"../schemas/versioned.js\";\nimport {\n\thexFromBytes,\n\ttype OtlpExportTraceServiceRequestJson,\n\ttype OtlpResource,\n} from \"./otlp.js\";\nimport { readRangeWireToOtlp } from \"./read-range.js\";\nimport type {\n\tEndSpanOptions,\n\tEventOptions,\n\tReadRangeOptions,\n\tReadRangeResult,\n\tReadRangeWire,\n\tSpanHandle,\n\tSpanStatusInput,\n\tStartSpanOptions,\n\tTraces,\n\tTracesDriver,\n\tTracesOptions,\n\tUpdateSpanOptions,\n} from \"./types.js\";\n\n// OTLP v1 JSON reference: https://opentelemetry.io/docs/specs/otlp/\n// Span data model reference: https://opentelemetry.io/docs/specs/otel/trace/api/\n\nconst KEY_PREFIX = {\n\tDATA: 1,\n};\n\nconst MAX_CHUNK_ID = 0xffff_ffff;\nconst AFTER_MAX_CHUNK_ID = 0x1_0000_0000;\n\nconst DEFAULT_BUCKET_SIZE_SEC = 3600;\nconst DEFAULT_TARGET_CHUNK_BYTES = 512 * 1024;\nconst DEFAULT_MAX_CHUNK_BYTES = 1024 * 1024;\nconst DEFAULT_MAX_CHUNK_AGE_MS = 5000;\nconst DEFAULT_SNAPSHOT_INTERVAL_MS = 300_000;\nconst DEFAULT_SNAPSHOT_BYTES_THRESHOLD = 256 * 1024;\nconst DEFAULT_MAX_READ_LIMIT = 10_000;\nconst DEFAULT_MAX_ACTIVE_SPANS = 10_000;\n\nconst SPAN_ID_BYTES = 8;\nconst TRACE_ID_BYTES = 16;\n\ntype AttributeMap = Map<string, unknown>;\n\ntype SpanState = {\n\tspanId: SpanId;\n\ttraceId: TraceId;\n\tparentSpanId: SpanId | null;\n\tname: string;\n\tkind: number;\n\ttraceState: string | null;\n\tflags: number;\n\tattributes: AttributeMap;\n\tdroppedAttributesCount: number;\n\tlinks: LinkState[];\n\tdroppedLinksCount: number;\n\tstatus: SpanStatus | null;\n\tstartTimeUnixNs: bigint;\n\tdepth: number;\n\tbytesSinceSnapshot: number;\n\tlastSnapshotMonoMs: number;\n};\n\ntype LinkState = {\n\ttraceId: TraceId;\n\tspanId: SpanId;\n\ttraceState: string | null;\n\tattributes: AttributeMap;\n\tdroppedAttributesCount: number;\n};\n\ntype ChunkState = {\n\tbucketStartSec: number;\n\tchunkId: number;\n\tbaseUnixNs: bigint;\n\tstrings: string[];\n\tstringIds: Map<string, number>;\n\trecords: TraceRecord[];\n\tsizeBytes: number;\n\tcreatedAtMonoMs: number;\n};\n\ntype PendingChunk = {\n\tkey: Uint8Array;\n\tbucketStartSec: number;\n\tchunkId: number;\n\tchunk: Chunk;\n\tbytes: Uint8Array;\n\tmaxRecordNs: bigint;\n};\n\nconst spanContext = new AsyncLocalStorage<SpanHandle | null>();\n\nfunction spanKey(spanId: Uint8Array | SpanId): string {\n\treturn hexFromBytes(normalizeBytes(spanId));\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n\tconst copy = new Uint8Array(bytes.byteLength);\n\tcopy.set(bytes);\n\treturn copy.buffer;\n}\n\nfunction toUint8Array(buffer: ArrayBuffer): Uint8Array {\n\treturn new Uint8Array(buffer);\n}\n\nfunction normalizeBytes(input: Uint8Array | ArrayBuffer): Uint8Array {\n\treturn input instanceof Uint8Array ? input : new Uint8Array(input);\n}\n\nexport function createTraces(\n\toptions: TracesOptions<OtlpResource>,\n): Traces<OtlpExportTraceServiceRequestJson> {\n\tconst driver = options.driver;\n\tconst bucketSizeSec = options.bucketSizeSec ?? DEFAULT_BUCKET_SIZE_SEC;\n\tconst maxChunkBytes = options.maxChunkBytes ?? DEFAULT_MAX_CHUNK_BYTES;\n\tconst targetChunkBytes = Math.min(\n\t\toptions.targetChunkBytes ?? DEFAULT_TARGET_CHUNK_BYTES,\n\t\tmaxChunkBytes,\n\t);\n\tconst maxChunkAgeMs = options.maxChunkAgeMs ?? DEFAULT_MAX_CHUNK_AGE_MS;\n\tconst snapshotIntervalMs =\n\t\toptions.snapshotIntervalMs ?? DEFAULT_SNAPSHOT_INTERVAL_MS;\n\tconst snapshotBytesThreshold =\n\t\toptions.snapshotBytesThreshold ?? DEFAULT_SNAPSHOT_BYTES_THRESHOLD;\n\tconst maxActiveSpans = options.maxActiveSpans ?? DEFAULT_MAX_ACTIVE_SPANS;\n\tconst maxReadLimit = options.maxReadLimit ?? DEFAULT_MAX_READ_LIMIT;\n\tconst resource = options.resource;\n\n\tconst timeAnchor = {\n\t\tunixMs: Date.now(),\n\t\tmonoMs: performance.now(),\n\t};\n\n\tconst activeSpans = new Map<string, SpanState>();\n\tconst activeSpanRefs = new Map<string, ActiveSpanRef>();\n\tconst pendingChunks: PendingChunk[] = [];\n\tlet writeChain = Promise.resolve();\n\tconst bucketChunkCounters = new Map<number, number>();\n\n\tfunction nowUnixMs(): number {\n\t\treturn timeAnchor.unixMs + (performance.now() - timeAnchor.monoMs);\n\t}\n\n\tfunction nowUnixNs(anchor: { unixMs: number; monoMs: number }): bigint {\n\t\tconst unixMs = anchor.unixMs + (performance.now() - anchor.monoMs);\n\t\tconst wholeMs = Math.floor(unixMs);\n\t\tconst fracMs = unixMs - wholeMs;\n\t\treturn BigInt(wholeMs) * 1_000_000n + BigInt(Math.floor(fracMs * 1_000_000));\n\t}\n\n\tfunction createChunkState(bucketStartSec: number): ChunkState {\n\t\treturn {\n\t\t\tbucketStartSec,\n\t\t\tchunkId: nextChunkId(bucketStartSec),\n\t\t\tbaseUnixNs: BigInt(bucketStartSec) * 1_000_000_000n,\n\t\t\tstrings: [],\n\t\t\tstringIds: new Map(),\n\t\t\trecords: [],\n\t\t\tsizeBytes: 0,\n\t\t\tcreatedAtMonoMs: performance.now(),\n\t\t};\n\t}\n\n\tfunction nextChunkId(bucketStartSec: number): number {\n\t\tconst current = bucketChunkCounters.get(bucketStartSec) ?? 0;\n\t\tbucketChunkCounters.set(bucketStartSec, current + 1);\n\t\treturn current;\n\t}\n\n\tconst currentChunk = createChunkState(\n\t\tcomputeBucketStartSec(nowUnixNs(timeAnchor), bucketSizeSec),\n\t);\n\n\tfunction computeBucketStartSec(\n\t\tabsoluteUnixNs: bigint,\n\t\tbucketSize: number,\n\t): number {\n\t\tconst sec = absoluteUnixNs / 1_000_000_000n;\n\t\tconst bucket = sec / BigInt(bucketSize);\n\t\treturn Number(bucket * BigInt(bucketSize));\n\t}\n\n\tfunction internString(value: string): StringId {\n\t\tconst existing = currentChunk.stringIds.get(value);\n\t\tif (existing !== undefined) {\n\t\t\treturn existing;\n\t\t}\n\t\tconst id = currentChunk.strings.length;\n\t\tcurrentChunk.strings.push(value);\n\t\tcurrentChunk.stringIds.set(value, id);\n\t\treturn id;\n\t}\n\n\tfunction encodeAttributes(\n\t\tattributes?: Record<string, unknown>,\n\t): { attributes: Attributes; dropped: number } {\n\t\tconst list: KeyValue[] = [];\n\t\tlet dropped = 0;\n\t\tif (!attributes) {\n\t\t\treturn { attributes: list, dropped };\n\t\t}\n\t\tfor (const [key, value] of Object.entries(attributes)) {\n\t\t\tconst sanitized = sanitizeAttributeValue(value);\n\t\t\tif (sanitized === undefined) {\n\t\t\t\tdropped++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst encoded = encodeCbor(sanitized);\n\t\t\t\tlist.push({ key: internString(key), value: toArrayBuffer(encoded) });\n\t\t\t} catch {\n\t\t\t\tdropped++;\n\t\t\t}\n\t\t}\n\t\treturn { attributes: list, dropped };\n\t}\n\n\tfunction sanitizeAttributeValue(value: unknown): unknown | undefined {\n\t\tif (value === undefined || typeof value === \"function\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (typeof value === \"symbol\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (value instanceof Map) {\n\t\t\tconst obj: Record<string, unknown> = {};\n\t\t\tfor (const [key, mapValue] of value.entries()) {\n\t\t\t\tif (typeof key !== \"string\") {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst sanitized = sanitizeAttributeValue(mapValue);\n\t\t\t\tif (sanitized !== undefined) {\n\t\t\t\t\tobj[key] = sanitized;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj;\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value\n\t\t\t\t.map((entry) => sanitizeAttributeValue(entry))\n\t\t\t\t.filter((entry) => entry !== undefined);\n\t\t}\n\t\treturn value;\n\t}\n\n\tfunction encodeLinks(\n\t\tlinks?: StartSpanOptions[\"links\"],\n\t): { links: SpanLink[]; dropped: number } {\n\t\tconst result: SpanLink[] = [];\n\t\tlet dropped = 0;\n\t\tif (!links) {\n\t\t\treturn { links: result, dropped };\n\t\t}\n\t\tfor (const link of links) {\n\t\t\tconst { attributes, dropped: droppedAttributes } = encodeAttributes(\n\t\t\t\tlink.attributes,\n\t\t\t);\n\t\t\tresult.push({\n\t\t\t\ttraceId: toArrayBuffer(link.traceId),\n\t\t\t\tspanId: toArrayBuffer(link.spanId),\n\t\t\t\ttraceState: link.traceState ?? null,\n\t\t\t\tattributes,\n\t\t\t\tdroppedAttributesCount: droppedAttributes,\n\t\t\t});\n\t\t}\n\t\treturn { links: result, dropped };\n\t}\n\n\tfunction createSpanStartRecord(\n\t\tspanId: SpanId,\n\t\ttraceId: TraceId,\n\t\tname: string,\n\t\toptions: StartSpanOptions | undefined,\n\t\tparentSpanId: SpanId | null,\n\t): SpanStart {\n\t\tconst { attributes, dropped } = encodeAttributes(options?.attributes);\n\t\tconst { links, dropped: droppedLinks } = encodeLinks(options?.links);\n\t\treturn {\n\t\t\ttraceId,\n\t\t\tspanId,\n\t\t\tparentSpanId,\n\t\t\tname: internString(name),\n\t\t\tkind: options?.kind ?? 0,\n\t\t\ttraceState: options?.traceState ?? null,\n\t\t\tflags: options?.flags ?? 0,\n\t\t\tattributes,\n\t\t\tdroppedAttributesCount: dropped,\n\t\t\tlinks,\n\t\t\tdroppedLinksCount: droppedLinks,\n\t\t};\n\t}\n\n\tfunction createSpanUpdateRecord(\n\t\tspanId: SpanId,\n\t\toptions: UpdateSpanOptions,\n\t): SpanUpdate {\n\t\tconst { attributes, dropped } = encodeAttributes(options.attributes);\n\t\treturn {\n\t\t\tspanId,\n\t\t\tattributes,\n\t\t\tdroppedAttributesCount: dropped,\n\t\t\tstatus: options.status ? toBareStatus(options.status) : null,\n\t\t};\n\t}\n\n\tfunction createSpanEventRecord(\n\t\tspanId: SpanId,\n\t\tname: string,\n\t\toptions: EventOptions | undefined,\n\t): SpanEvent {\n\t\tconst { attributes, dropped } = encodeAttributes(options?.attributes);\n\t\treturn {\n\t\t\tspanId,\n\t\t\tname: internString(name),\n\t\t\tattributes,\n\t\t\tdroppedAttributesCount: dropped,\n\t\t};\n\t}\n\n\tfunction createSpanEndRecord(\n\t\tspanId: SpanId,\n\t\toptions: EndSpanOptions | undefined,\n\t): SpanEnd {\n\t\treturn {\n\t\t\tspanId,\n\t\t\tstatus: options?.status ? toBareStatus(options.status) : null,\n\t\t};\n\t}\n\n\tfunction createSpanSnapshotRecord(state: SpanState): SpanSnapshot {\n\t\tconst { attributes, dropped } = encodeAttributeMap(state.attributes);\n\t\tconst { links, dropped: droppedLinks } = encodeLinkState(state.links);\n\t\treturn {\n\t\t\ttraceId: state.traceId,\n\t\t\tspanId: state.spanId,\n\t\t\tparentSpanId: state.parentSpanId,\n\t\t\tname: internString(state.name),\n\t\t\tkind: state.kind,\n\t\t\tstartTimeUnixNs: state.startTimeUnixNs,\n\t\t\ttraceState: state.traceState,\n\t\t\tflags: state.flags,\n\t\t\tattributes,\n\t\t\tdroppedAttributesCount: state.droppedAttributesCount + dropped,\n\t\t\tlinks,\n\t\t\tdroppedLinksCount: state.droppedLinksCount + droppedLinks,\n\t\t\tstatus: state.status,\n\t\t};\n\t}\n\n\tfunction encodeAttributeMap(\n\t\tattributes: AttributeMap,\n\t): { attributes: Attributes; dropped: number } {\n\t\tconst list: KeyValue[] = [];\n\t\tlet dropped = 0;\n\t\tfor (const [key, value] of attributes.entries()) {\n\t\t\tconst sanitized = sanitizeAttributeValue(value);\n\t\t\tif (sanitized === undefined) {\n\t\t\t\tdropped++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst encoded = encodeCbor(sanitized);\n\t\t\t\tlist.push({ key: internString(key), value: toArrayBuffer(encoded) });\n\t\t\t} catch {\n\t\t\t\tdropped++;\n\t\t\t}\n\t\t}\n\t\treturn { attributes: list, dropped };\n\t}\n\n\tfunction buildAttributeMapFromInput(\n\t\tattributes?: Record<string, unknown>,\n\t): AttributeMap {\n\t\tconst map = new Map<string, unknown>();\n\t\tif (!attributes) {\n\t\t\treturn map;\n\t\t}\n\t\tfor (const [key, value] of Object.entries(attributes)) {\n\t\t\tconst sanitized = sanitizeAttributeValue(value);\n\t\t\tif (sanitized !== undefined) {\n\t\t\t\tmap.set(key, sanitized);\n\t\t\t}\n\t\t}\n\t\treturn map;\n\t}\n\n\tfunction decodeAttributeList(\n\t\tattributes: Attributes,\n\t\tstrings: readonly string[],\n\t): AttributeMap {\n\t\tconst map = new Map<string, unknown>();\n\t\tfor (const kv of attributes) {\n\t\t\tconst key = strings[kv.key] ?? \"\";\n\t\t\ttry {\n\t\t\t\tmap.set(key, decodeCbor(toUint8Array(kv.value)) as unknown);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\treturn map;\n\t}\n\n\tfunction decodeLinks(\n\t\tlinks: readonly SpanLink[],\n\t\tstrings: readonly string[],\n\t): LinkState[] {\n\t\treturn links.map((link) => ({\n\t\t\ttraceId: link.traceId,\n\t\t\tspanId: link.spanId,\n\t\t\ttraceState: link.traceState,\n\t\t\tattributes: decodeAttributeList(link.attributes, strings),\n\t\t\tdroppedAttributesCount: link.droppedAttributesCount,\n\t\t}));\n\t}\n\n\tfunction encodeLinkState(\n\t\tlinks: LinkState[],\n\t): { links: SpanLink[]; dropped: number } {\n\t\tconst result: SpanLink[] = [];\n\t\tlet dropped = 0;\n\t\tfor (const link of links) {\n\t\t\tconst { attributes, dropped: droppedAttributes } = encodeAttributeMap(\n\t\t\t\tlink.attributes,\n\t\t\t);\n\t\t\tresult.push({\n\t\t\t\ttraceId: link.traceId,\n\t\t\t\tspanId: link.spanId,\n\t\t\t\ttraceState: link.traceState,\n\t\t\t\tattributes,\n\t\t\t\tdroppedAttributesCount: droppedAttributes,\n\t\t\t});\n\t\t}\n\t\treturn { links: result, dropped };\n\t}\n\n\tfunction appendRecord(\n\t\tbuildBody: () => RecordBody,\n\t\tprovidedTimeUnixMs?: number,\n\t): { recordIndex: number; encodedBytes: number; body: RecordBody } {\n\t\tconst absoluteUnixNs =\n\t\t\tprovidedTimeUnixMs !== undefined\n\t\t\t\t? BigInt(Math.floor(providedTimeUnixMs)) * 1_000_000n\n\t\t\t\t: nowUnixNs(timeAnchor);\n\t\tconst recordBucketStart = computeBucketStartSec(\n\t\t\tabsoluteUnixNs,\n\t\t\tbucketSizeSec,\n\t\t);\n\t\tif (recordBucketStart !== currentChunk.bucketStartSec) {\n\t\t\tflushChunk();\n\t\t\tresetChunkState(recordBucketStart);\n\t\t}\n\t\tif (performance.now() - currentChunk.createdAtMonoMs >= maxChunkAgeMs) {\n\t\t\tflushChunk();\n\t\t\tresetChunkState(recordBucketStart);\n\t\t}\n\t\tlet body = buildBody();\n\t\tconst timeOffsetNs = absoluteUnixNs - currentChunk.baseUnixNs;\n\t\tlet record: TraceRecord = { timeOffsetNs, body };\n\t\tlet encodedRecord = encodeRecord(record);\n\t\tif (encodedRecord.length > maxChunkBytes) {\n\t\t\tthrow new Error(\"Record exceeds maxChunkBytes\");\n\t\t}\n\t\tif (currentChunk.sizeBytes + encodedRecord.length > targetChunkBytes) {\n\t\t\tflushChunk();\n\t\t\tresetChunkState(recordBucketStart);\n\t\t\tbody = buildBody();\n\t\t\trecord = { timeOffsetNs, body };\n\t\t\tencodedRecord = encodeRecord(record);\n\t\t\tif (encodedRecord.length > maxChunkBytes) {\n\t\t\t\tthrow new Error(\"Record exceeds maxChunkBytes\");\n\t\t\t}\n\t\t}\n\t\tcurrentChunk.records.push(record);\n\t\tcurrentChunk.sizeBytes += encodedRecord.length;\n\t\tconst recordIndex = currentChunk.records.length - 1;\n\t\treturn { recordIndex, encodedBytes: encodedRecord.length, body };\n\t}\n\n\tfunction flushChunk(): boolean {\n\t\tif (currentChunk.records.length === 0) {\n\t\t\treturn false;\n\t\t}\n\t\tconst chunk: Chunk = {\n\t\t\tbaseUnixNs: currentChunk.baseUnixNs,\n\t\t\tstrings: currentChunk.strings,\n\t\t\trecords: currentChunk.records,\n\t\t\tactiveSpans: Array.from(activeSpanRefs.values()),\n\t\t};\n\t\tconst bytes = CHUNK_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\tchunk,\n\t\t\tCURRENT_VERSION,\n\t\t);\n\t\tconst key = buildChunkKey(currentChunk.bucketStartSec, currentChunk.chunkId);\n\t\tconst maxRecordNs =\n\t\t\tchunk.records.length > 0\n\t\t\t\t? chunk.baseUnixNs +\n\t\t\t\t\tchunk.records[chunk.records.length - 1].timeOffsetNs\n\t\t\t\t: chunk.baseUnixNs;\n\t\tconst pending: PendingChunk = {\n\t\t\tkey,\n\t\t\tbucketStartSec: currentChunk.bucketStartSec,\n\t\t\tchunkId: currentChunk.chunkId,\n\t\t\tchunk,\n\t\t\tbytes,\n\t\t\tmaxRecordNs,\n\t\t};\n\t\tpendingChunks.push(pending);\n\t\tenqueueWrite(pending);\n\t\treturn true;\n\t}\n\n\tfunction enqueueWrite(pending: PendingChunk): void {\n\t\twriteChain = writeChain.then(async () => {\n\t\t\tawait driver.set(pending.key, pending.bytes);\n\t\t\tconst index = pendingChunks.indexOf(pending);\n\t\t\tif (index !== -1) {\n\t\t\t\tpendingChunks.splice(index, 1);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction resetChunkState(bucketStartSec: number): void {\n\t\tcurrentChunk.bucketStartSec = bucketStartSec;\n\t\tcurrentChunk.chunkId = nextChunkId(bucketStartSec);\n\t\tcurrentChunk.baseUnixNs = BigInt(bucketStartSec) * 1_000_000_000n;\n\t\tcurrentChunk.strings = [];\n\t\tcurrentChunk.stringIds = new Map();\n\t\tcurrentChunk.records = [];\n\t\tcurrentChunk.sizeBytes = 0;\n\t\tcurrentChunk.createdAtMonoMs = performance.now();\n\t}\n\n\tfunction enforceMaxActiveSpans(): void {\n\t\tif (activeSpans.size <= maxActiveSpans) {\n\t\t\treturn;\n\t\t}\n\t\tconst candidates = Array.from(activeSpans.values()).sort((a, b) => {\n\t\t\tif (a.depth !== b.depth) {\n\t\t\t\treturn b.depth - a.depth;\n\t\t\t}\n\t\t\tif (a.startTimeUnixNs > b.startTimeUnixNs) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a.startTimeUnixNs < b.startTimeUnixNs) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\t\tfor (const span of candidates) {\n\t\t\tdropSpan(span.spanId);\n\t\t\tif (activeSpans.size <= maxActiveSpans) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dropSpan(spanId: SpanId | Uint8Array): void {\n\t\tconst key = spanKey(spanId);\n\t\tactiveSpans.delete(key);\n\t\tactiveSpanRefs.delete(key);\n\t}\n\n\tfunction assertActive(handle: SpanHandle): void {\n\t\tif (!isActive(handle)) {\n\t\t\tthrow new Error(\"Span handle is not active\");\n\t\t}\n\t}\n\n\tfunction isActive(handle: SpanHandle): boolean {\n\t\treturn activeSpans.has(spanKey(handle.spanId));\n\t}\n\n\tfunction startSpan(name: string, options?: StartSpanOptions): SpanHandle {\n\t\tconst parent = options?.parent ?? getCurrentSpan();\n\t\tif (parent) {\n\t\t\tassertActive(parent);\n\t\t}\n\t\tconst spanIdBytes = randomBytes(SPAN_ID_BYTES);\n\t\tconst traceIdBytes = parent ? parent.traceId : randomBytes(TRACE_ID_BYTES);\n\t\tconst spanId = toArrayBuffer(spanIdBytes);\n\t\tconst traceId = toArrayBuffer(traceIdBytes);\n\t\tconst parentSpanId = parent ? toArrayBuffer(parent.spanId) : null;\n\t\tconst { recordIndex, encodedBytes, body } = appendRecord(() => ({\n\t\t\ttag: \"SpanStart\",\n\t\t\tval: createSpanStartRecord(\n\t\t\t\tspanId,\n\t\t\t\ttraceId,\n\t\t\t\tname,\n\t\t\t\toptions,\n\t\t\t\tparentSpanId,\n\t\t\t),\n\t\t}));\n\t\tconst spanStart = body.val as SpanStart;\n\t\tconst key = spanKey(spanId);\n\t\tconst startKey: SpanRecordKey = {\n\t\t\tprefix: KEY_PREFIX.DATA,\n\t\t\tbucketStartSec: BigInt(currentChunk.bucketStartSec),\n\t\t\tchunkId: currentChunk.chunkId,\n\t\t\trecordIndex,\n\t\t};\n\t\tactiveSpanRefs.set(key, {\n\t\t\tspanId,\n\t\t\tstartKey,\n\t\t\tlatestSnapshotKey: null,\n\t\t});\n\t\tconst depth = computeSpanDepth(parentSpanId);\n\t\tactiveSpans.set(key, {\n\t\t\tspanId,\n\t\t\ttraceId,\n\t\t\tparentSpanId,\n\t\t\tname,\n\t\t\tkind: options?.kind ?? 0,\n\t\t\ttraceState: options?.traceState ?? null,\n\t\t\tflags: options?.flags ?? 0,\n\t\t\tattributes: buildAttributeMapFromInput(options?.attributes),\n\t\t\tdroppedAttributesCount: spanStart.droppedAttributesCount,\n\t\t\tlinks: decodeLinks(spanStart.links, currentChunk.strings),\n\t\t\tdroppedLinksCount: spanStart.droppedLinksCount,\n\t\t\tstatus: null,\n\t\t\tstartTimeUnixNs:\n\t\t\t\tcurrentChunk.baseUnixNs + currentChunk.records[recordIndex].timeOffsetNs,\n\t\t\tdepth,\n\t\t\tbytesSinceSnapshot: encodedBytes,\n\t\t\tlastSnapshotMonoMs: performance.now(),\n\t\t});\n\t\tenforceMaxActiveSpans();\n\t\treturn {\n\t\t\tspanId: spanIdBytes,\n\t\t\ttraceId: traceIdBytes,\n\t\t\tisActive: () => activeSpans.has(key),\n\t\t};\n\t}\n\n\tfunction updateSpan(handle: SpanHandle, options: UpdateSpanOptions): void {\n\t\tif (!options.attributes && !options.status) {\n\t\t\treturn;\n\t\t}\n\t\tassertActive(handle);\n\t\tconst { encodedBytes, body } = appendRecord(() => ({\n\t\t\ttag: \"SpanUpdate\",\n\t\t\tval: createSpanUpdateRecord(toArrayBuffer(handle.spanId), options),\n\t\t}));\n\t\tconst spanUpdate = body.val as SpanUpdate;\n\t\tconst state = activeSpans.get(spanKey(handle.spanId));\n\t\tif (!state) {\n\t\t\treturn;\n\t\t}\n\t\tif (options.attributes) {\n\t\t\tconst updates = buildAttributeMapFromInput(options.attributes);\n\t\t\tfor (const [key, value] of updates.entries()) {\n\t\t\t\tstate.attributes.set(key, value);\n\t\t\t}\n\t\t}\n\t\tstate.droppedAttributesCount += spanUpdate.droppedAttributesCount;\n\t\tif (options.status) {\n\t\t\tstate.status = toBareStatus(options.status);\n\t\t}\n\t\tstate.bytesSinceSnapshot += encodedBytes;\n\t\tmaybeSnapshot(handle.spanId, state);\n\t}\n\n\tfunction setAttributes(\n\t\thandle: SpanHandle,\n\t\tattributes: Record<string, unknown>,\n\t): void {\n\t\tupdateSpan(handle, { attributes });\n\t}\n\n\tfunction setStatus(handle: SpanHandle, status: SpanStatusInput): void {\n\t\tupdateSpan(handle, { status });\n\t}\n\n\tfunction emitEvent(\n\t\thandle: SpanHandle,\n\t\tname: string,\n\t\toptions?: EventOptions,\n\t): void {\n\t\tassertActive(handle);\n\t\tconst { encodedBytes } = appendRecord(\n\t\t\t() => ({\n\t\t\t\ttag: \"SpanEvent\",\n\t\t\t\tval: createSpanEventRecord(toArrayBuffer(handle.spanId), name, options),\n\t\t\t}),\n\t\t\toptions?.timeUnixMs,\n\t\t);\n\t\tconst state = activeSpans.get(spanKey(handle.spanId));\n\t\tif (state) {\n\t\t\tstate.bytesSinceSnapshot += encodedBytes;\n\t\t\tmaybeSnapshot(handle.spanId, state);\n\t\t}\n\t}\n\n\tfunction endSpan(handle: SpanHandle, options?: EndSpanOptions): void {\n\t\tassertActive(handle);\n\t\tappendRecord(() => ({\n\t\t\ttag: \"SpanEnd\",\n\t\t\tval: createSpanEndRecord(toArrayBuffer(handle.spanId), options),\n\t\t}));\n\t\tdropSpan(handle.spanId);\n\t}\n\n\tfunction maybeSnapshot(spanId: SpanId | Uint8Array, state: SpanState): void {\n\t\tif (\n\t\t\tstate.bytesSinceSnapshot < snapshotBytesThreshold &&\n\t\t\tperformance.now() - state.lastSnapshotMonoMs < snapshotIntervalMs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst { recordIndex } = appendRecord(() => ({\n\t\t\ttag: \"SpanSnapshot\",\n\t\t\tval: createSpanSnapshotRecord(state),\n\t\t}));\n\t\tconst key = spanKey(spanId);\n\t\tconst ref = activeSpanRefs.get(key);\n\t\tif (ref) {\n\t\t\tactiveSpanRefs.set(key, {\n\t\t\t\t...ref,\n\t\t\t\tlatestSnapshotKey: {\n\t\t\t\tprefix: KEY_PREFIX.DATA,\n\t\t\t\tbucketStartSec: BigInt(currentChunk.bucketStartSec),\n\t\t\t\tchunkId: currentChunk.chunkId,\n\t\t\t\trecordIndex,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tstate.bytesSinceSnapshot = 0;\n\t\tstate.lastSnapshotMonoMs = performance.now();\n\t}\n\n\tasync function flush(): Promise<boolean> {\n\t\tconst didFlush = flushChunk();\n\t\tif (didFlush) {\n\t\t\tresetChunkState(currentChunk.bucketStartSec);\n\t\t}\n\t\tawait writeChain;\n\t\treturn didFlush;\n\t}\n\n\tfunction withSpan<T>(handle: SpanHandle, fn: () => T): T {\n\t\treturn spanContext.run(handle, fn);\n\t}\n\n\tfunction getCurrentSpan(): SpanHandle | null {\n\t\tconst handle = spanContext.getStore() ?? null;\n\t\tif (!handle) {\n\t\t\treturn null;\n\t\t}\n\t\treturn isActive(handle) ? handle : null;\n\t}\n\n\tasync function readRangeWire(\n\t\toptions: ReadRangeOptions,\n\t): Promise<ReadRangeWire> {\n\t\tconst startMs = Math.floor(options.startMs);\n\t\tconst endMs = Math.floor(options.endMs);\n\t\tif (options.limit <= 0 || endMs <= startMs) {\n\t\t\treturn {\n\t\t\t\tstartTimeMs: BigInt(startMs),\n\t\t\t\tendTimeMs: BigInt(endMs),\n\t\t\t\tlimit: 0,\n\t\t\t\tclamped: false,\n\t\t\t\tbaseChunks: [],\n\t\t\t\tchunks: [],\n\t\t\t};\n\t\t}\n\t\tconst limitWasClamped = options.limit > maxReadLimit;\n\t\tconst limit = Math.min(options.limit, maxReadLimit);\n\t\tconst startNs = BigInt(startMs) * 1_000_000n;\n\t\tconst endNs = BigInt(endMs) * 1_000_000n;\n\n\t\tconst previousChunk = await findPreviousChunk(startNs, bucketSizeSec);\n\t\tconst activeRefs = previousChunk?.activeSpans ?? [];\n\t\tconst baseChunks: Chunk[] = [];\n\t\tfor (const ref of activeRefs) {\n\t\t\tconst baseRecord = await loadBaseRecord(ref);\n\t\t\tif (!baseRecord) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst baseUnixNs =\n\t\t\t\tbaseRecord.absNs - baseRecord.record.timeOffsetNs;\n\t\t\tbaseChunks.push({\n\t\t\t\tbaseUnixNs,\n\t\t\t\tstrings: baseRecord.strings,\n\t\t\t\trecords: [baseRecord.record],\n\t\t\t\tactiveSpans: [],\n\t\t\t});\n\t\t}\n\n\t\tconst chunks: Chunk[] = [];\n\t\tconst diskChunks = await listRangeChunks(startNs, endNs, bucketSizeSec);\n\t\tfor (const chunk of diskChunks) {\n\t\t\tconst filtered = filterChunkRecords(chunk.chunk, startNs, endNs);\n\t\t\tif (filtered) {\n\t\t\t\tchunks.push(filtered);\n\t\t\t}\n\t\t}\n\t\tfor (const pending of pendingChunks) {\n\t\t\tconst filtered = filterChunkRecords(pending.chunk, startNs, endNs);\n\t\t\tif (filtered) {\n\t\t\t\tchunks.push(filtered);\n\t\t\t}\n\t\t}\n\t\tconst currentFiltered = filterChunkRecords(\n\t\t\tcurrentChunkAsChunk(),\n\t\t\tstartNs,\n\t\t\tendNs,\n\t\t);\n\t\tif (currentFiltered) {\n\t\t\tchunks.push(currentFiltered);\n\t\t}\n\n\t\tconst reachedSpanLimit = countUniqueSpanIds(chunks, limit);\n\t\treturn {\n\t\t\tstartTimeMs: BigInt(startMs),\n\t\t\tendTimeMs: BigInt(endMs),\n\t\t\tlimit,\n\t\t\tclamped: limitWasClamped || reachedSpanLimit,\n\t\t\tbaseChunks,\n\t\t\tchunks,\n\t\t};\n\t}\n\n\tasync function readRange(\n\t\toptions: ReadRangeOptions,\n\t): Promise<ReadRangeResult<OtlpExportTraceServiceRequestJson>> {\n\t\tconst wire = await readRangeWire(options);\n\t\treturn readRangeWireToOtlp(wire, resource);\n\t}\n\n\tfunction filterChunkRecords(\n\t\tchunk: Chunk,\n\t\tstartNs: bigint,\n\t\tendNs: bigint,\n\t): Chunk | null {\n\t\tconst filtered: TraceRecord[] = [];\n\t\tfor (const record of chunk.records) {\n\t\t\tconst absNs = chunk.baseUnixNs + record.timeOffsetNs;\n\t\t\tif (absNs < startNs || absNs >= endNs) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfiltered.push(record);\n\t\t}\n\t\tif (filtered.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\tbaseUnixNs: chunk.baseUnixNs,\n\t\t\tstrings: chunk.strings,\n\t\t\trecords: filtered,\n\t\t\tactiveSpans: chunk.activeSpans,\n\t\t};\n\t}\n\n\tfunction countUniqueSpanIds(chunks: Chunk[], limit: number): boolean {\n\t\tif (limit <= 0) {\n\t\t\treturn true;\n\t\t}\n\t\tconst seen = new Set<string>();\n\t\tfor (const chunk of chunks) {\n\t\t\tfor (const record of chunk.records) {\n\t\t\t\tconst key = spanKey(recordSpanId(record.body));\n\t\t\t\tif (seen.has(key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (seen.size >= limit) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tseen.add(key);\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction recordSpanId(body: RecordBody): SpanId {\n\t\tswitch (body.tag) {\n\t\t\tcase \"SpanStart\":\n\t\t\t\treturn body.val.spanId;\n\t\t\tcase \"SpanEvent\":\n\t\t\t\treturn body.val.spanId;\n\t\t\tcase \"SpanUpdate\":\n\t\t\t\treturn body.val.spanId;\n\t\t\tcase \"SpanEnd\":\n\t\t\t\treturn body.val.spanId;\n\t\t\tcase \"SpanSnapshot\":\n\t\t\t\treturn body.val.spanId;\n\t\t}\n\t}\n\n\tfunction currentChunkAsChunk(): Chunk {\n\t\treturn {\n\t\t\tbaseUnixNs: currentChunk.baseUnixNs,\n\t\t\tstrings: currentChunk.strings,\n\t\t\trecords: currentChunk.records,\n\t\t\tactiveSpans: Array.from(activeSpanRefs.values()),\n\t\t};\n\t}\n\n\tasync function listRangeChunks(\n\t\tstartNs: bigint,\n\t\tendNs: bigint,\n\t\tbucketSize: number,\n\t): Promise<Array<{ key: Uint8Array; chunk: Chunk }>> {\n\t\tconst startBucket = computeBucketStartSec(startNs, bucketSize);\n\t\tconst endBucket = computeBucketStartSec(endNs, bucketSize);\n\t\tconst startKey = buildChunkKey(startBucket, 0);\n\t\tconst endKey = buildChunkKey(endBucket + bucketSize, 0);\n\t\tconst entries = await driver.listRange(startKey, endKey);\n\t\tconst output: Array<{ key: Uint8Array; chunk: Chunk }> = [];\n\t\tfor (const entry of entries) {\n\t\t\tconst chunk = deserializeChunkSafe(entry.value);\n\t\t\tif (!chunk) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\toutput.push({ key: entry.key, chunk });\n\t\t}\n\t\treturn output;\n\t}\n\n\tasync function findPreviousChunk(\n\t\tstartNs: bigint,\n\t\tbucketSize: number,\n\t): Promise<Chunk | null> {\n\t\tconst startBucket = computeBucketStartSec(startNs, bucketSize);\n\t\tlet cursor = {\n\t\t\tbucketStartSec: startBucket,\n\t\t\tchunkId: AFTER_MAX_CHUNK_ID,\n\t\t};\n\n\t\twhile (true) {\n\t\t\tconst pendingCandidate = findLatestPendingBefore(cursor);\n\t\t\tconst diskCandidate = await findLatestDiskBefore(cursor);\n\t\t\tconst candidate = selectLatestCandidate(\n\t\t\t\tpendingCandidate,\n\t\t\t\tdiskCandidate,\n\t\t\t);\n\t\t\tif (!candidate) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (candidate.maxRecordNs < startNs) {\n\t\t\t\treturn candidate.chunk;\n\t\t\t}\n\t\t\tcursor = {\n\t\t\t\tbucketStartSec: candidate.bucketStartSec,\n\t\t\t\tchunkId: candidate.chunkId,\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction findLatestPendingBefore(cursor: {\n\t\tbucketStartSec: number;\n\t\tchunkId: number;\n\t}): PendingChunk | null {\n\t\tlet best: PendingChunk | null = null;\n\t\tfor (const pending of pendingChunks) {\n\t\t\tif (compareChunkKey(pending, cursor) >= 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!best || compareChunkKey(pending, best) > 0) {\n\t\t\t\tbest = pending;\n\t\t\t}\n\t\t}\n\t\treturn best;\n\t}\n\n\tasync function findLatestDiskBefore(cursor: {\n\t\tbucketStartSec: number;\n\t\tchunkId: number;\n\t}): Promise<PendingChunk | null> {\n\t\tconst startKey = buildChunkKey(0, 0);\n\t\tlet endKey = buildChunkKey(cursor.bucketStartSec, cursor.chunkId);\n\n\t\twhile (true) {\n\t\t\tconst entries = await driver.listRange(startKey, endKey, {\n\t\t\t\treverse: true,\n\t\t\t\tlimit: 10,\n\t\t\t});\n\t\t\tif (entries.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst chunk = deserializeChunkSafe(entry.value);\n\t\t\t\tif (!chunk) {\n\t\t\t\t\tendKey = entry.key;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst { bucketStartSec, chunkId } = decodeChunkKey(entry.key);\n\t\t\t\tconst maxRecordNs =\n\t\t\t\t\tchunk.records.length > 0\n\t\t\t\t\t\t? chunk.baseUnixNs +\n\t\t\t\t\t\t\tchunk.records[chunk.records.length - 1].timeOffsetNs\n\t\t\t\t\t\t: chunk.baseUnixNs;\n\t\t\t\treturn {\n\t\t\t\t\tkey: entry.key,\n\t\t\t\t\tbucketStartSec,\n\t\t\t\t\tchunkId,\n\t\t\t\t\tchunk,\n\t\t\t\t\tbytes: entry.value,\n\t\t\t\t\tmaxRecordNs,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction selectLatestCandidate(\n\t\tpending: PendingChunk | null,\n\t\tdisk: PendingChunk | null,\n\t): PendingChunk | null {\n\t\tif (pending && disk) {\n\t\t\treturn compareChunkKey(pending, disk) >= 0 ? pending : disk;\n\t\t}\n\t\treturn pending ?? disk;\n\t}\n\n\tfunction compareChunkKey(\n\t\ta: { bucketStartSec: number; chunkId: number },\n\t\tb: { bucketStartSec: number; chunkId: number },\n\t): number {\n\t\tif (a.bucketStartSec !== b.bucketStartSec) {\n\t\t\treturn a.bucketStartSec - b.bucketStartSec;\n\t\t}\n\t\treturn a.chunkId - b.chunkId;\n\t}\n\n\tfunction decodeChunkKey(key: Uint8Array): {\n\t\tbucketStartSec: number;\n\t\tchunkId: number;\n\t} {\n\t\tconst tuple = unpack(Buffer.from(key)) as [number, number, number];\n\t\treturn { bucketStartSec: tuple[1], chunkId: tuple[2] };\n\t}\n\n\tfunction buildChunkKey(bucketStartSec: number, chunkId: number): Uint8Array {\n\t\treturn pack([KEY_PREFIX.DATA, bucketStartSec, chunkId]);\n\t}\n\n\tfunction deserializeChunkSafe(bytes: Uint8Array): Chunk | null {\n\t\ttry {\n\t\t\treturn CHUNK_VERSIONED.deserializeWithEmbeddedVersion(bytes);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync function loadBaseRecord(\n\t\tref: ActiveSpanRef,\n\t): Promise<\n\t\t{ record: TraceRecord; strings: readonly string[]; absNs: bigint } | null\n\t> {\n\t\tconst key = ref.latestSnapshotKey ?? ref.startKey;\n\t\tconst bucketStartSec = toNumber(key.bucketStartSec);\n\t\tconst fromMemory = findChunkInMemory(bucketStartSec, key.chunkId);\n\t\tif (fromMemory) {\n\t\t\tconst record = fromMemory.records[key.recordIndex];\n\t\t\tif (!record) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst absNs = fromMemory.baseUnixNs + record.timeOffsetNs;\n\t\t\treturn { record, strings: fromMemory.strings, absNs };\n\t\t}\n\t\tconst chunkKey = buildChunkKey(bucketStartSec, key.chunkId);\n\t\tconst bytes = await driver.get(chunkKey);\n\t\tif (!bytes) {\n\t\t\treturn null;\n\t\t}\n\t\tconst chunk = deserializeChunkSafe(bytes);\n\t\tif (!chunk) {\n\t\t\treturn null;\n\t\t}\n\t\tconst record = chunk.records[key.recordIndex];\n\t\tif (!record) {\n\t\t\treturn null;\n\t\t}\n\t\tconst absNs = chunk.baseUnixNs + record.timeOffsetNs;\n\t\treturn { record, strings: chunk.strings, absNs };\n\t}\n\n\tfunction findChunkInMemory(\n\t\tbucketStartSec: number,\n\t\tchunkId: number,\n\t): Chunk | null {\n\t\tif (\n\t\t\tcurrentChunk.bucketStartSec === bucketStartSec &&\n\t\t\tcurrentChunk.chunkId === chunkId\n\t\t) {\n\t\t\treturn currentChunkAsChunk();\n\t\t}\n\t\tconst pending = pendingChunks.find(\n\t\t\t(candidate) =>\n\t\t\t\tcandidate.bucketStartSec === bucketStartSec &&\n\t\t\t\tcandidate.chunkId === chunkId,\n\t\t);\n\t\treturn pending?.chunk ?? null;\n\t}\n\n\tfunction toNumber(value: bigint): number {\n\t\tconst asNumber = Number(value);\n\t\tif (!Number.isSafeInteger(asNumber)) {\n\t\t\tthrow new Error(\"Value exceeds safe integer range\");\n\t\t}\n\t\treturn asNumber;\n\t}\n\n\tfunction computeSpanDepth(parentSpanId: SpanId | null): number {\n\t\tif (!parentSpanId) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst parent = activeSpans.get(spanKey(parentSpanId));\n\t\tif (!parent) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn parent.depth + 1;\n\t}\n\n\tfunction randomSpanId(): SpanId {\n\t\treturn toArrayBuffer(randomBytes(SPAN_ID_BYTES));\n\t}\n\n\tfunction randomTraceId(): TraceId {\n\t\treturn toArrayBuffer(randomBytes(TRACE_ID_BYTES));\n\t}\n\n\tfunction toBareStatus(status: SpanStatusInput): SpanStatus {\n\t\treturn {\n\t\t\tcode: toBareStatusCode(status.code),\n\t\t\tmessage: status.message ?? null,\n\t\t};\n\t}\n\n\tfunction toBareStatusCode(code: SpanStatusInput[\"code\"]): SpanStatusCode {\n\t\tswitch (code) {\n\t\t\tcase \"OK\":\n\t\t\t\treturn SpanStatusCode.OK;\n\t\t\tcase \"ERROR\":\n\t\t\t\treturn SpanStatusCode.ERROR;\n\t\t\tcase \"UNSET\":\n\t\t\tdefault:\n\t\t\t\treturn SpanStatusCode.UNSET;\n\t\t}\n\t}\n\n\treturn {\n\t\tstartSpan,\n\t\tupdateSpan,\n\t\tsetAttributes,\n\t\tsetStatus,\n\t\tendSpan,\n\t\temitEvent,\n\t\twithSpan,\n\t\tgetCurrentSpan,\n\t\tflush,\n\t\treadRange,\n\t\treadRangeWire,\n\t};\n}\n"],"mappings":"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","names":["options","record","absNs"]}
1
+ {"version":3,"sources":["../../src/traces.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Buffer } from \"node:buffer\";\nimport { randomBytes } from \"node:crypto\";\nimport { performance } from \"node:perf_hooks\";\nimport { decode as decodeCbor, encode as encodeCbor } from \"cbor-x\";\nimport { pack, unpack } from \"fdb-tuple\";\nimport {\n\tCHUNK_VERSIONED,\n\tCURRENT_VERSION,\n\tencodeRecord,\n\ttype ActiveSpanRef,\n\ttype Attributes,\n\ttype Chunk,\n\ttype KeyValue,\n\ttype Record as TraceRecord,\n\ttype RecordBody,\n\ttype SpanEnd,\n\ttype SpanEvent,\n\ttype SpanId,\n\ttype SpanLink,\n\ttype SpanRecordKey,\n\ttype SpanSnapshot,\n\ttype SpanStart,\n\ttype SpanStatus,\n\tSpanStatusCode,\n\ttype SpanUpdate,\n\ttype StringId,\n\ttype TraceId,\n} from \"../schemas/versioned.js\";\nimport {\n\thexFromBytes,\n\ttype OtlpExportTraceServiceRequestJson,\n\ttype OtlpResource,\n} from \"./otlp.js\";\nimport { readRangeWireToOtlp } from \"./read-range.js\";\nimport type {\n\tEndSpanOptions,\n\tEventOptions,\n\tReadRangeOptions,\n\tReadRangeResult,\n\tReadRangeWire,\n\tSpanHandle,\n\tSpanStatusInput,\n\tStartSpanOptions,\n\tTraces,\n\tTracesDriver,\n\tTracesOptions,\n\tUpdateSpanOptions,\n} from \"./types.js\";\n\n// OTLP v1 JSON reference: https://opentelemetry.io/docs/specs/otlp/\n// Span data model reference: https://opentelemetry.io/docs/specs/otel/trace/api/\n\nconst KEY_PREFIX = {\n\tDATA: 1,\n};\n\nconst MAX_CHUNK_ID = 0xffff_ffff;\nconst AFTER_MAX_CHUNK_ID = 0x1_0000_0000;\n\nconst DEFAULT_BUCKET_SIZE_SEC = 3600;\nconst DEFAULT_TARGET_CHUNK_BYTES = 512 * 1024;\nconst DEFAULT_MAX_CHUNK_BYTES = 1024 * 1024;\nconst DEFAULT_MAX_CHUNK_AGE_MS = 5000;\nconst DEFAULT_SNAPSHOT_INTERVAL_MS = 300_000;\nconst DEFAULT_SNAPSHOT_BYTES_THRESHOLD = 256 * 1024;\nconst DEFAULT_MAX_READ_LIMIT = 10_000;\nconst DEFAULT_MAX_ACTIVE_SPANS = 10_000;\n\nconst SPAN_ID_BYTES = 8;\nconst TRACE_ID_BYTES = 16;\n\ntype AttributeMap = Map<string, unknown>;\n\ntype SpanState = {\n\tspanId: SpanId;\n\ttraceId: TraceId;\n\tparentSpanId: SpanId | null;\n\tname: string;\n\tkind: number;\n\ttraceState: string | null;\n\tflags: number;\n\tattributes: AttributeMap;\n\tdroppedAttributesCount: number;\n\tlinks: LinkState[];\n\tdroppedLinksCount: number;\n\tstatus: SpanStatus | null;\n\tstartTimeUnixNs: bigint;\n\tdepth: number;\n\tbytesSinceSnapshot: number;\n\tlastSnapshotMonoMs: number;\n};\n\ntype LinkState = {\n\ttraceId: TraceId;\n\tspanId: SpanId;\n\ttraceState: string | null;\n\tattributes: AttributeMap;\n\tdroppedAttributesCount: number;\n};\n\ntype ChunkState = {\n\tbucketStartSec: number;\n\tchunkId: number;\n\tbaseUnixNs: bigint;\n\tstrings: string[];\n\tstringIds: Map<string, number>;\n\trecords: TraceRecord[];\n\tsizeBytes: number;\n\tcreatedAtMonoMs: number;\n};\n\ntype PendingChunk = {\n\tkey: Uint8Array;\n\tbucketStartSec: number;\n\tchunkId: number;\n\tchunk: Chunk;\n\tbytes: Uint8Array;\n\tmaxRecordNs: bigint;\n};\n\nconst spanContext = new AsyncLocalStorage<SpanHandle | null>();\n\nfunction spanKey(spanId: Uint8Array | SpanId): string {\n\treturn hexFromBytes(normalizeBytes(spanId));\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n\tconst copy = new Uint8Array(bytes.byteLength);\n\tcopy.set(bytes);\n\treturn copy.buffer;\n}\n\nfunction toUint8Array(buffer: ArrayBuffer): Uint8Array {\n\treturn new Uint8Array(buffer);\n}\n\nfunction normalizeBytes(input: Uint8Array | ArrayBuffer): Uint8Array {\n\treturn input instanceof Uint8Array ? input : new Uint8Array(input);\n}\n\nexport function createTraces(\n\toptions: TracesOptions<OtlpResource>,\n): Traces<OtlpExportTraceServiceRequestJson> {\n\tconst driver = options.driver;\n\tconst bucketSizeSec = options.bucketSizeSec ?? DEFAULT_BUCKET_SIZE_SEC;\n\tconst maxChunkBytes = options.maxChunkBytes ?? DEFAULT_MAX_CHUNK_BYTES;\n\tconst targetChunkBytes = Math.min(\n\t\toptions.targetChunkBytes ?? DEFAULT_TARGET_CHUNK_BYTES,\n\t\tmaxChunkBytes,\n\t);\n\tconst maxChunkAgeMs = options.maxChunkAgeMs ?? DEFAULT_MAX_CHUNK_AGE_MS;\n\tconst snapshotIntervalMs =\n\t\toptions.snapshotIntervalMs ?? DEFAULT_SNAPSHOT_INTERVAL_MS;\n\tconst snapshotBytesThreshold =\n\t\toptions.snapshotBytesThreshold ?? DEFAULT_SNAPSHOT_BYTES_THRESHOLD;\n\tconst maxActiveSpans = options.maxActiveSpans ?? DEFAULT_MAX_ACTIVE_SPANS;\n\tconst maxReadLimit = options.maxReadLimit ?? DEFAULT_MAX_READ_LIMIT;\n\tconst resource = options.resource;\n\n\tconst timeAnchor = {\n\t\tunixMs: Date.now(),\n\t\tmonoMs: performance.now(),\n\t};\n\n\tconst activeSpans = new Map<string, SpanState>();\n\tconst activeSpanRefs = new Map<string, ActiveSpanRef>();\n\tconst pendingChunks: PendingChunk[] = [];\n\tlet writeChain = Promise.resolve();\n\tconst bucketChunkCounters = new Map<number, number>();\n\n\tfunction nowUnixMs(): number {\n\t\treturn timeAnchor.unixMs + (performance.now() - timeAnchor.monoMs);\n\t}\n\n\tfunction nowUnixNs(anchor: { unixMs: number; monoMs: number }): bigint {\n\t\tconst unixMs = anchor.unixMs + (performance.now() - anchor.monoMs);\n\t\tconst wholeMs = Math.floor(unixMs);\n\t\tconst fracMs = unixMs - wholeMs;\n\t\treturn (\n\t\t\tBigInt(wholeMs) * 1_000_000n +\n\t\t\tBigInt(Math.floor(fracMs * 1_000_000))\n\t\t);\n\t}\n\n\tfunction createChunkState(bucketStartSec: number): ChunkState {\n\t\treturn {\n\t\t\tbucketStartSec,\n\t\t\tchunkId: nextChunkId(bucketStartSec),\n\t\t\tbaseUnixNs: BigInt(bucketStartSec) * 1_000_000_000n,\n\t\t\tstrings: [],\n\t\t\tstringIds: new Map(),\n\t\t\trecords: [],\n\t\t\tsizeBytes: 0,\n\t\t\tcreatedAtMonoMs: performance.now(),\n\t\t};\n\t}\n\n\tfunction nextChunkId(bucketStartSec: number): number {\n\t\tconst current = bucketChunkCounters.get(bucketStartSec) ?? 0;\n\t\tbucketChunkCounters.set(bucketStartSec, current + 1);\n\t\treturn current;\n\t}\n\n\tconst currentChunk = createChunkState(\n\t\tcomputeBucketStartSec(nowUnixNs(timeAnchor), bucketSizeSec),\n\t);\n\n\tfunction computeBucketStartSec(\n\t\tabsoluteUnixNs: bigint,\n\t\tbucketSize: number,\n\t): number {\n\t\tconst sec = absoluteUnixNs / 1_000_000_000n;\n\t\tconst bucket = sec / BigInt(bucketSize);\n\t\treturn Number(bucket * BigInt(bucketSize));\n\t}\n\n\tfunction internString(value: string): StringId {\n\t\tconst existing = currentChunk.stringIds.get(value);\n\t\tif (existing !== undefined) {\n\t\t\treturn existing;\n\t\t}\n\t\tconst id = currentChunk.strings.length;\n\t\tcurrentChunk.strings.push(value);\n\t\tcurrentChunk.stringIds.set(value, id);\n\t\treturn id;\n\t}\n\n\tfunction encodeAttributes(attributes?: Record<string, unknown>): {\n\t\tattributes: Attributes;\n\t\tdropped: number;\n\t} {\n\t\tconst list: KeyValue[] = [];\n\t\tlet dropped = 0;\n\t\tif (!attributes) {\n\t\t\treturn { attributes: list, dropped };\n\t\t}\n\t\tfor (const [key, value] of Object.entries(attributes)) {\n\t\t\tconst sanitized = sanitizeAttributeValue(value);\n\t\t\tif (sanitized === undefined) {\n\t\t\t\tdropped++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst encoded = encodeCbor(sanitized);\n\t\t\t\tlist.push({\n\t\t\t\t\tkey: internString(key),\n\t\t\t\t\tvalue: toArrayBuffer(encoded),\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\tdropped++;\n\t\t\t}\n\t\t}\n\t\treturn { attributes: list, dropped };\n\t}\n\n\tfunction sanitizeAttributeValue(value: unknown): unknown | undefined {\n\t\tif (value === undefined || typeof value === \"function\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (typeof value === \"symbol\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (value instanceof Map) {\n\t\t\tconst obj: Record<string, unknown> = {};\n\t\t\tfor (const [key, mapValue] of value.entries()) {\n\t\t\t\tif (typeof key !== \"string\") {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tconst sanitized = sanitizeAttributeValue(mapValue);\n\t\t\t\tif (sanitized !== undefined) {\n\t\t\t\t\tobj[key] = sanitized;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn obj;\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value\n\t\t\t\t.map((entry) => sanitizeAttributeValue(entry))\n\t\t\t\t.filter((entry) => entry !== undefined);\n\t\t}\n\t\treturn value;\n\t}\n\n\tfunction encodeLinks(links?: StartSpanOptions[\"links\"]): {\n\t\tlinks: SpanLink[];\n\t\tdropped: number;\n\t} {\n\t\tconst result: SpanLink[] = [];\n\t\tlet dropped = 0;\n\t\tif (!links) {\n\t\t\treturn { links: result, dropped };\n\t\t}\n\t\tfor (const link of links) {\n\t\t\tconst { attributes, dropped: droppedAttributes } = encodeAttributes(\n\t\t\t\tlink.attributes,\n\t\t\t);\n\t\t\tresult.push({\n\t\t\t\ttraceId: toArrayBuffer(link.traceId),\n\t\t\t\tspanId: toArrayBuffer(link.spanId),\n\t\t\t\ttraceState: link.traceState ?? null,\n\t\t\t\tattributes,\n\t\t\t\tdroppedAttributesCount: droppedAttributes,\n\t\t\t});\n\t\t}\n\t\treturn { links: result, dropped };\n\t}\n\n\tfunction createSpanStartRecord(\n\t\tspanId: SpanId,\n\t\ttraceId: TraceId,\n\t\tname: string,\n\t\toptions: StartSpanOptions | undefined,\n\t\tparentSpanId: SpanId | null,\n\t): SpanStart {\n\t\tconst { attributes, dropped } = encodeAttributes(options?.attributes);\n\t\tconst { links, dropped: droppedLinks } = encodeLinks(options?.links);\n\t\treturn {\n\t\t\ttraceId,\n\t\t\tspanId,\n\t\t\tparentSpanId,\n\t\t\tname: internString(name),\n\t\t\tkind: options?.kind ?? 0,\n\t\t\ttraceState: options?.traceState ?? null,\n\t\t\tflags: options?.flags ?? 0,\n\t\t\tattributes,\n\t\t\tdroppedAttributesCount: dropped,\n\t\t\tlinks,\n\t\t\tdroppedLinksCount: droppedLinks,\n\t\t};\n\t}\n\n\tfunction createSpanUpdateRecord(\n\t\tspanId: SpanId,\n\t\toptions: UpdateSpanOptions,\n\t): SpanUpdate {\n\t\tconst { attributes, dropped } = encodeAttributes(options.attributes);\n\t\treturn {\n\t\t\tspanId,\n\t\t\tattributes,\n\t\t\tdroppedAttributesCount: dropped,\n\t\t\tstatus: options.status ? toBareStatus(options.status) : null,\n\t\t};\n\t}\n\n\tfunction createSpanEventRecord(\n\t\tspanId: SpanId,\n\t\tname: string,\n\t\toptions: EventOptions | undefined,\n\t): SpanEvent {\n\t\tconst { attributes, dropped } = encodeAttributes(options?.attributes);\n\t\treturn {\n\t\t\tspanId,\n\t\t\tname: internString(name),\n\t\t\tattributes,\n\t\t\tdroppedAttributesCount: dropped,\n\t\t};\n\t}\n\n\tfunction createSpanEndRecord(\n\t\tspanId: SpanId,\n\t\toptions: EndSpanOptions | undefined,\n\t): SpanEnd {\n\t\treturn {\n\t\t\tspanId,\n\t\t\tstatus: options?.status ? toBareStatus(options.status) : null,\n\t\t};\n\t}\n\n\tfunction createSpanSnapshotRecord(state: SpanState): SpanSnapshot {\n\t\tconst { attributes, dropped } = encodeAttributeMap(state.attributes);\n\t\tconst { links, dropped: droppedLinks } = encodeLinkState(state.links);\n\t\treturn {\n\t\t\ttraceId: state.traceId,\n\t\t\tspanId: state.spanId,\n\t\t\tparentSpanId: state.parentSpanId,\n\t\t\tname: internString(state.name),\n\t\t\tkind: state.kind,\n\t\t\tstartTimeUnixNs: state.startTimeUnixNs,\n\t\t\ttraceState: state.traceState,\n\t\t\tflags: state.flags,\n\t\t\tattributes,\n\t\t\tdroppedAttributesCount: state.droppedAttributesCount + dropped,\n\t\t\tlinks,\n\t\t\tdroppedLinksCount: state.droppedLinksCount + droppedLinks,\n\t\t\tstatus: state.status,\n\t\t};\n\t}\n\n\tfunction encodeAttributeMap(attributes: AttributeMap): {\n\t\tattributes: Attributes;\n\t\tdropped: number;\n\t} {\n\t\tconst list: KeyValue[] = [];\n\t\tlet dropped = 0;\n\t\tfor (const [key, value] of attributes.entries()) {\n\t\t\tconst sanitized = sanitizeAttributeValue(value);\n\t\t\tif (sanitized === undefined) {\n\t\t\t\tdropped++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst encoded = encodeCbor(sanitized);\n\t\t\t\tlist.push({\n\t\t\t\t\tkey: internString(key),\n\t\t\t\t\tvalue: toArrayBuffer(encoded),\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\tdropped++;\n\t\t\t}\n\t\t}\n\t\treturn { attributes: list, dropped };\n\t}\n\n\tfunction buildAttributeMapFromInput(\n\t\tattributes?: Record<string, unknown>,\n\t): AttributeMap {\n\t\tconst map = new Map<string, unknown>();\n\t\tif (!attributes) {\n\t\t\treturn map;\n\t\t}\n\t\tfor (const [key, value] of Object.entries(attributes)) {\n\t\t\tconst sanitized = sanitizeAttributeValue(value);\n\t\t\tif (sanitized !== undefined) {\n\t\t\t\tmap.set(key, sanitized);\n\t\t\t}\n\t\t}\n\t\treturn map;\n\t}\n\n\tfunction decodeAttributeList(\n\t\tattributes: Attributes,\n\t\tstrings: readonly string[],\n\t): AttributeMap {\n\t\tconst map = new Map<string, unknown>();\n\t\tfor (const kv of attributes) {\n\t\t\tconst key = strings[kv.key] ?? \"\";\n\t\t\ttry {\n\t\t\t\tmap.set(key, decodeCbor(toUint8Array(kv.value)) as unknown);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\treturn map;\n\t}\n\n\tfunction decodeLinks(\n\t\tlinks: readonly SpanLink[],\n\t\tstrings: readonly string[],\n\t): LinkState[] {\n\t\treturn links.map((link) => ({\n\t\t\ttraceId: link.traceId,\n\t\t\tspanId: link.spanId,\n\t\t\ttraceState: link.traceState,\n\t\t\tattributes: decodeAttributeList(link.attributes, strings),\n\t\t\tdroppedAttributesCount: link.droppedAttributesCount,\n\t\t}));\n\t}\n\n\tfunction encodeLinkState(links: LinkState[]): {\n\t\tlinks: SpanLink[];\n\t\tdropped: number;\n\t} {\n\t\tconst result: SpanLink[] = [];\n\t\tlet dropped = 0;\n\t\tfor (const link of links) {\n\t\t\tconst { attributes, dropped: droppedAttributes } =\n\t\t\t\tencodeAttributeMap(link.attributes);\n\t\t\tresult.push({\n\t\t\t\ttraceId: link.traceId,\n\t\t\t\tspanId: link.spanId,\n\t\t\t\ttraceState: link.traceState,\n\t\t\t\tattributes,\n\t\t\t\tdroppedAttributesCount: droppedAttributes,\n\t\t\t});\n\t\t}\n\t\treturn { links: result, dropped };\n\t}\n\n\tfunction appendRecord(\n\t\tbuildBody: () => RecordBody,\n\t\tprovidedTimeUnixMs?: number,\n\t): { recordIndex: number; encodedBytes: number; body: RecordBody } {\n\t\tconst absoluteUnixNs =\n\t\t\tprovidedTimeUnixMs !== undefined\n\t\t\t\t? BigInt(Math.floor(providedTimeUnixMs)) * 1_000_000n\n\t\t\t\t: nowUnixNs(timeAnchor);\n\t\tconst recordBucketStart = computeBucketStartSec(\n\t\t\tabsoluteUnixNs,\n\t\t\tbucketSizeSec,\n\t\t);\n\t\tif (recordBucketStart !== currentChunk.bucketStartSec) {\n\t\t\tflushChunk();\n\t\t\tresetChunkState(recordBucketStart);\n\t\t}\n\t\tif (performance.now() - currentChunk.createdAtMonoMs >= maxChunkAgeMs) {\n\t\t\tflushChunk();\n\t\t\tresetChunkState(recordBucketStart);\n\t\t}\n\t\tlet body = buildBody();\n\t\tconst timeOffsetNs = absoluteUnixNs - currentChunk.baseUnixNs;\n\t\tlet record: TraceRecord = { timeOffsetNs, body };\n\t\tlet encodedRecord = encodeRecord(record);\n\t\tif (encodedRecord.length > maxChunkBytes) {\n\t\t\tthrow new Error(\"Record exceeds maxChunkBytes\");\n\t\t}\n\t\tif (currentChunk.sizeBytes + encodedRecord.length > targetChunkBytes) {\n\t\t\tflushChunk();\n\t\t\tresetChunkState(recordBucketStart);\n\t\t\tbody = buildBody();\n\t\t\trecord = { timeOffsetNs, body };\n\t\t\tencodedRecord = encodeRecord(record);\n\t\t\tif (encodedRecord.length > maxChunkBytes) {\n\t\t\t\tthrow new Error(\"Record exceeds maxChunkBytes\");\n\t\t\t}\n\t\t}\n\t\tcurrentChunk.records.push(record);\n\t\tcurrentChunk.sizeBytes += encodedRecord.length;\n\t\tconst recordIndex = currentChunk.records.length - 1;\n\t\treturn { recordIndex, encodedBytes: encodedRecord.length, body };\n\t}\n\n\tfunction flushChunk(): boolean {\n\t\tif (currentChunk.records.length === 0) {\n\t\t\treturn false;\n\t\t}\n\t\tconst chunk: Chunk = {\n\t\t\tbaseUnixNs: currentChunk.baseUnixNs,\n\t\t\tstrings: currentChunk.strings,\n\t\t\trecords: currentChunk.records,\n\t\t\tactiveSpans: Array.from(activeSpanRefs.values()),\n\t\t};\n\t\tconst bytes = CHUNK_VERSIONED.serializeWithEmbeddedVersion(\n\t\t\tchunk,\n\t\t\tCURRENT_VERSION,\n\t\t);\n\t\tconst key = buildChunkKey(\n\t\t\tcurrentChunk.bucketStartSec,\n\t\t\tcurrentChunk.chunkId,\n\t\t);\n\t\tconst maxRecordNs =\n\t\t\tchunk.records.length > 0\n\t\t\t\t? chunk.baseUnixNs +\n\t\t\t\t\tchunk.records[chunk.records.length - 1].timeOffsetNs\n\t\t\t\t: chunk.baseUnixNs;\n\t\tconst pending: PendingChunk = {\n\t\t\tkey,\n\t\t\tbucketStartSec: currentChunk.bucketStartSec,\n\t\t\tchunkId: currentChunk.chunkId,\n\t\t\tchunk,\n\t\t\tbytes,\n\t\t\tmaxRecordNs,\n\t\t};\n\t\tpendingChunks.push(pending);\n\t\tenqueueWrite(pending);\n\t\treturn true;\n\t}\n\n\tfunction enqueueWrite(pending: PendingChunk): void {\n\t\twriteChain = writeChain.then(async () => {\n\t\t\tawait driver.set(pending.key, pending.bytes);\n\t\t\tconst index = pendingChunks.indexOf(pending);\n\t\t\tif (index !== -1) {\n\t\t\t\tpendingChunks.splice(index, 1);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction resetChunkState(bucketStartSec: number): void {\n\t\tcurrentChunk.bucketStartSec = bucketStartSec;\n\t\tcurrentChunk.chunkId = nextChunkId(bucketStartSec);\n\t\tcurrentChunk.baseUnixNs = BigInt(bucketStartSec) * 1_000_000_000n;\n\t\tcurrentChunk.strings = [];\n\t\tcurrentChunk.stringIds = new Map();\n\t\tcurrentChunk.records = [];\n\t\tcurrentChunk.sizeBytes = 0;\n\t\tcurrentChunk.createdAtMonoMs = performance.now();\n\t}\n\n\tfunction enforceMaxActiveSpans(): void {\n\t\tif (activeSpans.size <= maxActiveSpans) {\n\t\t\treturn;\n\t\t}\n\t\tconst candidates = Array.from(activeSpans.values()).sort((a, b) => {\n\t\t\tif (a.depth !== b.depth) {\n\t\t\t\treturn b.depth - a.depth;\n\t\t\t}\n\t\t\tif (a.startTimeUnixNs > b.startTimeUnixNs) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a.startTimeUnixNs < b.startTimeUnixNs) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\t\tfor (const span of candidates) {\n\t\t\tdropSpan(span.spanId);\n\t\t\tif (activeSpans.size <= maxActiveSpans) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction dropSpan(spanId: SpanId | Uint8Array): void {\n\t\tconst key = spanKey(spanId);\n\t\tactiveSpans.delete(key);\n\t\tactiveSpanRefs.delete(key);\n\t}\n\n\tfunction assertActive(handle: SpanHandle): void {\n\t\tif (!isActive(handle)) {\n\t\t\tthrow new Error(\"Span handle is not active\");\n\t\t}\n\t}\n\n\tfunction isActive(handle: SpanHandle): boolean {\n\t\treturn activeSpans.has(spanKey(handle.spanId));\n\t}\n\n\tfunction startSpan(name: string, options?: StartSpanOptions): SpanHandle {\n\t\tconst parent = options?.parent ?? getCurrentSpan();\n\t\tif (parent) {\n\t\t\tassertActive(parent);\n\t\t}\n\t\tconst spanIdBytes = randomBytes(SPAN_ID_BYTES);\n\t\tconst traceIdBytes = parent\n\t\t\t? parent.traceId\n\t\t\t: randomBytes(TRACE_ID_BYTES);\n\t\tconst spanId = toArrayBuffer(spanIdBytes);\n\t\tconst traceId = toArrayBuffer(traceIdBytes);\n\t\tconst parentSpanId = parent ? toArrayBuffer(parent.spanId) : null;\n\t\tconst { recordIndex, encodedBytes, body } = appendRecord(() => ({\n\t\t\ttag: \"SpanStart\",\n\t\t\tval: createSpanStartRecord(\n\t\t\t\tspanId,\n\t\t\t\ttraceId,\n\t\t\t\tname,\n\t\t\t\toptions,\n\t\t\t\tparentSpanId,\n\t\t\t),\n\t\t}));\n\t\tconst spanStart = body.val as SpanStart;\n\t\tconst key = spanKey(spanId);\n\t\tconst startKey: SpanRecordKey = {\n\t\t\tprefix: KEY_PREFIX.DATA,\n\t\t\tbucketStartSec: BigInt(currentChunk.bucketStartSec),\n\t\t\tchunkId: currentChunk.chunkId,\n\t\t\trecordIndex,\n\t\t};\n\t\tactiveSpanRefs.set(key, {\n\t\t\tspanId,\n\t\t\tstartKey,\n\t\t\tlatestSnapshotKey: null,\n\t\t});\n\t\tconst depth = computeSpanDepth(parentSpanId);\n\t\tactiveSpans.set(key, {\n\t\t\tspanId,\n\t\t\ttraceId,\n\t\t\tparentSpanId,\n\t\t\tname,\n\t\t\tkind: options?.kind ?? 0,\n\t\t\ttraceState: options?.traceState ?? null,\n\t\t\tflags: options?.flags ?? 0,\n\t\t\tattributes: buildAttributeMapFromInput(options?.attributes),\n\t\t\tdroppedAttributesCount: spanStart.droppedAttributesCount,\n\t\t\tlinks: decodeLinks(spanStart.links, currentChunk.strings),\n\t\t\tdroppedLinksCount: spanStart.droppedLinksCount,\n\t\t\tstatus: null,\n\t\t\tstartTimeUnixNs:\n\t\t\t\tcurrentChunk.baseUnixNs +\n\t\t\t\tcurrentChunk.records[recordIndex].timeOffsetNs,\n\t\t\tdepth,\n\t\t\tbytesSinceSnapshot: encodedBytes,\n\t\t\tlastSnapshotMonoMs: performance.now(),\n\t\t});\n\t\tenforceMaxActiveSpans();\n\t\treturn {\n\t\t\tspanId: spanIdBytes,\n\t\t\ttraceId: traceIdBytes,\n\t\t\tisActive: () => activeSpans.has(key),\n\t\t};\n\t}\n\n\tfunction updateSpan(handle: SpanHandle, options: UpdateSpanOptions): void {\n\t\tif (!options.attributes && !options.status) {\n\t\t\treturn;\n\t\t}\n\t\tassertActive(handle);\n\t\tconst { encodedBytes, body } = appendRecord(() => ({\n\t\t\ttag: \"SpanUpdate\",\n\t\t\tval: createSpanUpdateRecord(toArrayBuffer(handle.spanId), options),\n\t\t}));\n\t\tconst spanUpdate = body.val as SpanUpdate;\n\t\tconst state = activeSpans.get(spanKey(handle.spanId));\n\t\tif (!state) {\n\t\t\treturn;\n\t\t}\n\t\tif (options.attributes) {\n\t\t\tconst updates = buildAttributeMapFromInput(options.attributes);\n\t\t\tfor (const [key, value] of updates.entries()) {\n\t\t\t\tstate.attributes.set(key, value);\n\t\t\t}\n\t\t}\n\t\tstate.droppedAttributesCount += spanUpdate.droppedAttributesCount;\n\t\tif (options.status) {\n\t\t\tstate.status = toBareStatus(options.status);\n\t\t}\n\t\tstate.bytesSinceSnapshot += encodedBytes;\n\t\tmaybeSnapshot(handle.spanId, state);\n\t}\n\n\tfunction setAttributes(\n\t\thandle: SpanHandle,\n\t\tattributes: Record<string, unknown>,\n\t): void {\n\t\tupdateSpan(handle, { attributes });\n\t}\n\n\tfunction setStatus(handle: SpanHandle, status: SpanStatusInput): void {\n\t\tupdateSpan(handle, { status });\n\t}\n\n\tfunction emitEvent(\n\t\thandle: SpanHandle,\n\t\tname: string,\n\t\toptions?: EventOptions,\n\t): void {\n\t\tassertActive(handle);\n\t\tconst { encodedBytes } = appendRecord(\n\t\t\t() => ({\n\t\t\t\ttag: \"SpanEvent\",\n\t\t\t\tval: createSpanEventRecord(\n\t\t\t\t\ttoArrayBuffer(handle.spanId),\n\t\t\t\t\tname,\n\t\t\t\t\toptions,\n\t\t\t\t),\n\t\t\t}),\n\t\t\toptions?.timeUnixMs,\n\t\t);\n\t\tconst state = activeSpans.get(spanKey(handle.spanId));\n\t\tif (state) {\n\t\t\tstate.bytesSinceSnapshot += encodedBytes;\n\t\t\tmaybeSnapshot(handle.spanId, state);\n\t\t}\n\t}\n\n\tfunction endSpan(handle: SpanHandle, options?: EndSpanOptions): void {\n\t\tassertActive(handle);\n\t\tappendRecord(() => ({\n\t\t\ttag: \"SpanEnd\",\n\t\t\tval: createSpanEndRecord(toArrayBuffer(handle.spanId), options),\n\t\t}));\n\t\tdropSpan(handle.spanId);\n\t}\n\n\tfunction maybeSnapshot(\n\t\tspanId: SpanId | Uint8Array,\n\t\tstate: SpanState,\n\t): void {\n\t\tif (\n\t\t\tstate.bytesSinceSnapshot < snapshotBytesThreshold &&\n\t\t\tperformance.now() - state.lastSnapshotMonoMs < snapshotIntervalMs\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst { recordIndex } = appendRecord(() => ({\n\t\t\ttag: \"SpanSnapshot\",\n\t\t\tval: createSpanSnapshotRecord(state),\n\t\t}));\n\t\tconst key = spanKey(spanId);\n\t\tconst ref = activeSpanRefs.get(key);\n\t\tif (ref) {\n\t\t\tactiveSpanRefs.set(key, {\n\t\t\t\t...ref,\n\t\t\t\tlatestSnapshotKey: {\n\t\t\t\t\tprefix: KEY_PREFIX.DATA,\n\t\t\t\t\tbucketStartSec: BigInt(currentChunk.bucketStartSec),\n\t\t\t\t\tchunkId: currentChunk.chunkId,\n\t\t\t\t\trecordIndex,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tstate.bytesSinceSnapshot = 0;\n\t\tstate.lastSnapshotMonoMs = performance.now();\n\t}\n\n\tasync function flush(): Promise<boolean> {\n\t\tconst didFlush = flushChunk();\n\t\tif (didFlush) {\n\t\t\tresetChunkState(currentChunk.bucketStartSec);\n\t\t}\n\t\tawait writeChain;\n\t\treturn didFlush;\n\t}\n\n\tfunction withSpan<T>(handle: SpanHandle, fn: () => T): T {\n\t\treturn spanContext.run(handle, fn);\n\t}\n\n\tfunction getCurrentSpan(): SpanHandle | null {\n\t\tconst handle = spanContext.getStore() ?? null;\n\t\tif (!handle) {\n\t\t\treturn null;\n\t\t}\n\t\treturn isActive(handle) ? handle : null;\n\t}\n\n\tasync function readRangeWire(\n\t\toptions: ReadRangeOptions,\n\t): Promise<ReadRangeWire> {\n\t\tconst startMs = Math.floor(options.startMs);\n\t\tconst endMs = Math.floor(options.endMs);\n\t\tif (options.limit <= 0 || endMs <= startMs) {\n\t\t\treturn {\n\t\t\t\tstartTimeMs: BigInt(startMs),\n\t\t\t\tendTimeMs: BigInt(endMs),\n\t\t\t\tlimit: 0,\n\t\t\t\tclamped: false,\n\t\t\t\tbaseChunks: [],\n\t\t\t\tchunks: [],\n\t\t\t};\n\t\t}\n\t\tconst limitWasClamped = options.limit > maxReadLimit;\n\t\tconst limit = Math.min(options.limit, maxReadLimit);\n\t\tconst startNs = BigInt(startMs) * 1_000_000n;\n\t\tconst endNs = BigInt(endMs) * 1_000_000n;\n\n\t\tconst previousChunk = await findPreviousChunk(startNs, bucketSizeSec);\n\t\tconst activeRefs = previousChunk?.activeSpans ?? [];\n\t\tconst baseChunks: Chunk[] = [];\n\t\tfor (const ref of activeRefs) {\n\t\t\tconst baseRecord = await loadBaseRecord(ref);\n\t\t\tif (!baseRecord) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst baseUnixNs =\n\t\t\t\tbaseRecord.absNs - baseRecord.record.timeOffsetNs;\n\t\t\tbaseChunks.push({\n\t\t\t\tbaseUnixNs,\n\t\t\t\tstrings: baseRecord.strings,\n\t\t\t\trecords: [baseRecord.record],\n\t\t\t\tactiveSpans: [],\n\t\t\t});\n\t\t}\n\n\t\tconst chunks: Chunk[] = [];\n\t\tconst diskChunks = await listRangeChunks(startNs, endNs, bucketSizeSec);\n\t\tfor (const chunk of diskChunks) {\n\t\t\tconst filtered = filterChunkRecords(chunk.chunk, startNs, endNs);\n\t\t\tif (filtered) {\n\t\t\t\tchunks.push(filtered);\n\t\t\t}\n\t\t}\n\t\tfor (const pending of pendingChunks) {\n\t\t\tconst filtered = filterChunkRecords(pending.chunk, startNs, endNs);\n\t\t\tif (filtered) {\n\t\t\t\tchunks.push(filtered);\n\t\t\t}\n\t\t}\n\t\tconst currentFiltered = filterChunkRecords(\n\t\t\tcurrentChunkAsChunk(),\n\t\t\tstartNs,\n\t\t\tendNs,\n\t\t);\n\t\tif (currentFiltered) {\n\t\t\tchunks.push(currentFiltered);\n\t\t}\n\n\t\tconst reachedSpanLimit = countUniqueSpanIds(chunks, limit);\n\t\treturn {\n\t\t\tstartTimeMs: BigInt(startMs),\n\t\t\tendTimeMs: BigInt(endMs),\n\t\t\tlimit,\n\t\t\tclamped: limitWasClamped || reachedSpanLimit,\n\t\t\tbaseChunks,\n\t\t\tchunks,\n\t\t};\n\t}\n\n\tasync function readRange(\n\t\toptions: ReadRangeOptions,\n\t): Promise<ReadRangeResult<OtlpExportTraceServiceRequestJson>> {\n\t\tconst wire = await readRangeWire(options);\n\t\treturn readRangeWireToOtlp(wire, resource);\n\t}\n\n\tfunction filterChunkRecords(\n\t\tchunk: Chunk,\n\t\tstartNs: bigint,\n\t\tendNs: bigint,\n\t): Chunk | null {\n\t\tconst filtered: TraceRecord[] = [];\n\t\tfor (const record of chunk.records) {\n\t\t\tconst absNs = chunk.baseUnixNs + record.timeOffsetNs;\n\t\t\tif (absNs < startNs || absNs >= endNs) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfiltered.push(record);\n\t\t}\n\t\tif (filtered.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn {\n\t\t\tbaseUnixNs: chunk.baseUnixNs,\n\t\t\tstrings: chunk.strings,\n\t\t\trecords: filtered,\n\t\t\tactiveSpans: chunk.activeSpans,\n\t\t};\n\t}\n\n\tfunction countUniqueSpanIds(chunks: Chunk[], limit: number): boolean {\n\t\tif (limit <= 0) {\n\t\t\treturn true;\n\t\t}\n\t\tconst seen = new Set<string>();\n\t\tfor (const chunk of chunks) {\n\t\t\tfor (const record of chunk.records) {\n\t\t\t\tconst key = spanKey(recordSpanId(record.body));\n\t\t\t\tif (seen.has(key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (seen.size >= limit) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tseen.add(key);\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction recordSpanId(body: RecordBody): SpanId {\n\t\tswitch (body.tag) {\n\t\t\tcase \"SpanStart\":\n\t\t\t\treturn body.val.spanId;\n\t\t\tcase \"SpanEvent\":\n\t\t\t\treturn body.val.spanId;\n\t\t\tcase \"SpanUpdate\":\n\t\t\t\treturn body.val.spanId;\n\t\t\tcase \"SpanEnd\":\n\t\t\t\treturn body.val.spanId;\n\t\t\tcase \"SpanSnapshot\":\n\t\t\t\treturn body.val.spanId;\n\t\t}\n\t}\n\n\tfunction currentChunkAsChunk(): Chunk {\n\t\treturn {\n\t\t\tbaseUnixNs: currentChunk.baseUnixNs,\n\t\t\tstrings: currentChunk.strings,\n\t\t\trecords: currentChunk.records,\n\t\t\tactiveSpans: Array.from(activeSpanRefs.values()),\n\t\t};\n\t}\n\n\tasync function listRangeChunks(\n\t\tstartNs: bigint,\n\t\tendNs: bigint,\n\t\tbucketSize: number,\n\t): Promise<Array<{ key: Uint8Array; chunk: Chunk }>> {\n\t\tconst startBucket = computeBucketStartSec(startNs, bucketSize);\n\t\tconst endBucket = computeBucketStartSec(endNs, bucketSize);\n\t\tconst startKey = buildChunkKey(startBucket, 0);\n\t\tconst endKey = buildChunkKey(endBucket + bucketSize, 0);\n\t\tconst entries = await driver.listRange(startKey, endKey);\n\t\tconst output: Array<{ key: Uint8Array; chunk: Chunk }> = [];\n\t\tfor (const entry of entries) {\n\t\t\tconst chunk = deserializeChunkSafe(entry.value);\n\t\t\tif (!chunk) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\toutput.push({ key: entry.key, chunk });\n\t\t}\n\t\treturn output;\n\t}\n\n\tasync function findPreviousChunk(\n\t\tstartNs: bigint,\n\t\tbucketSize: number,\n\t): Promise<Chunk | null> {\n\t\tconst startBucket = computeBucketStartSec(startNs, bucketSize);\n\t\tlet cursor = {\n\t\t\tbucketStartSec: startBucket,\n\t\t\tchunkId: AFTER_MAX_CHUNK_ID,\n\t\t};\n\n\t\twhile (true) {\n\t\t\tconst pendingCandidate = findLatestPendingBefore(cursor);\n\t\t\tconst diskCandidate = await findLatestDiskBefore(cursor);\n\t\t\tconst candidate = selectLatestCandidate(\n\t\t\t\tpendingCandidate,\n\t\t\t\tdiskCandidate,\n\t\t\t);\n\t\t\tif (!candidate) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (candidate.maxRecordNs < startNs) {\n\t\t\t\treturn candidate.chunk;\n\t\t\t}\n\t\t\tcursor = {\n\t\t\t\tbucketStartSec: candidate.bucketStartSec,\n\t\t\t\tchunkId: candidate.chunkId,\n\t\t\t};\n\t\t}\n\t}\n\n\tfunction findLatestPendingBefore(cursor: {\n\t\tbucketStartSec: number;\n\t\tchunkId: number;\n\t}): PendingChunk | null {\n\t\tlet best: PendingChunk | null = null;\n\t\tfor (const pending of pendingChunks) {\n\t\t\tif (compareChunkKey(pending, cursor) >= 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!best || compareChunkKey(pending, best) > 0) {\n\t\t\t\tbest = pending;\n\t\t\t}\n\t\t}\n\t\treturn best;\n\t}\n\n\tasync function findLatestDiskBefore(cursor: {\n\t\tbucketStartSec: number;\n\t\tchunkId: number;\n\t}): Promise<PendingChunk | null> {\n\t\tconst startKey = buildChunkKey(0, 0);\n\t\tlet endKey = buildChunkKey(cursor.bucketStartSec, cursor.chunkId);\n\n\t\twhile (true) {\n\t\t\tconst entries = await driver.listRange(startKey, endKey, {\n\t\t\t\treverse: true,\n\t\t\t\tlimit: 10,\n\t\t\t});\n\t\t\tif (entries.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst chunk = deserializeChunkSafe(entry.value);\n\t\t\t\tif (!chunk) {\n\t\t\t\t\tendKey = entry.key;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst { bucketStartSec, chunkId } = decodeChunkKey(entry.key);\n\t\t\t\tconst maxRecordNs =\n\t\t\t\t\tchunk.records.length > 0\n\t\t\t\t\t\t? chunk.baseUnixNs +\n\t\t\t\t\t\t\tchunk.records[chunk.records.length - 1].timeOffsetNs\n\t\t\t\t\t\t: chunk.baseUnixNs;\n\t\t\t\treturn {\n\t\t\t\t\tkey: entry.key,\n\t\t\t\t\tbucketStartSec,\n\t\t\t\t\tchunkId,\n\t\t\t\t\tchunk,\n\t\t\t\t\tbytes: entry.value,\n\t\t\t\t\tmaxRecordNs,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction selectLatestCandidate(\n\t\tpending: PendingChunk | null,\n\t\tdisk: PendingChunk | null,\n\t): PendingChunk | null {\n\t\tif (pending && disk) {\n\t\t\treturn compareChunkKey(pending, disk) >= 0 ? pending : disk;\n\t\t}\n\t\treturn pending ?? disk;\n\t}\n\n\tfunction compareChunkKey(\n\t\ta: { bucketStartSec: number; chunkId: number },\n\t\tb: { bucketStartSec: number; chunkId: number },\n\t): number {\n\t\tif (a.bucketStartSec !== b.bucketStartSec) {\n\t\t\treturn a.bucketStartSec - b.bucketStartSec;\n\t\t}\n\t\treturn a.chunkId - b.chunkId;\n\t}\n\n\tfunction decodeChunkKey(key: Uint8Array): {\n\t\tbucketStartSec: number;\n\t\tchunkId: number;\n\t} {\n\t\tconst tuple = unpack(Buffer.from(key)) as [number, number, number];\n\t\treturn { bucketStartSec: tuple[1], chunkId: tuple[2] };\n\t}\n\n\tfunction buildChunkKey(\n\t\tbucketStartSec: number,\n\t\tchunkId: number,\n\t): Uint8Array {\n\t\treturn pack([KEY_PREFIX.DATA, bucketStartSec, chunkId]);\n\t}\n\n\tfunction deserializeChunkSafe(bytes: Uint8Array): Chunk | null {\n\t\ttry {\n\t\t\treturn CHUNK_VERSIONED.deserializeWithEmbeddedVersion(bytes);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync function loadBaseRecord(ref: ActiveSpanRef): Promise<{\n\t\trecord: TraceRecord;\n\t\tstrings: readonly string[];\n\t\tabsNs: bigint;\n\t} | null> {\n\t\tconst key = ref.latestSnapshotKey ?? ref.startKey;\n\t\tconst bucketStartSec = toNumber(key.bucketStartSec);\n\t\tconst fromMemory = findChunkInMemory(bucketStartSec, key.chunkId);\n\t\tif (fromMemory) {\n\t\t\tconst record = fromMemory.records[key.recordIndex];\n\t\t\tif (!record) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst absNs = fromMemory.baseUnixNs + record.timeOffsetNs;\n\t\t\treturn { record, strings: fromMemory.strings, absNs };\n\t\t}\n\t\tconst chunkKey = buildChunkKey(bucketStartSec, key.chunkId);\n\t\tconst bytes = await driver.get(chunkKey);\n\t\tif (!bytes) {\n\t\t\treturn null;\n\t\t}\n\t\tconst chunk = deserializeChunkSafe(bytes);\n\t\tif (!chunk) {\n\t\t\treturn null;\n\t\t}\n\t\tconst record = chunk.records[key.recordIndex];\n\t\tif (!record) {\n\t\t\treturn null;\n\t\t}\n\t\tconst absNs = chunk.baseUnixNs + record.timeOffsetNs;\n\t\treturn { record, strings: chunk.strings, absNs };\n\t}\n\n\tfunction findChunkInMemory(\n\t\tbucketStartSec: number,\n\t\tchunkId: number,\n\t): Chunk | null {\n\t\tif (\n\t\t\tcurrentChunk.bucketStartSec === bucketStartSec &&\n\t\t\tcurrentChunk.chunkId === chunkId\n\t\t) {\n\t\t\treturn currentChunkAsChunk();\n\t\t}\n\t\tconst pending = pendingChunks.find(\n\t\t\t(candidate) =>\n\t\t\t\tcandidate.bucketStartSec === bucketStartSec &&\n\t\t\t\tcandidate.chunkId === chunkId,\n\t\t);\n\t\treturn pending?.chunk ?? null;\n\t}\n\n\tfunction toNumber(value: bigint): number {\n\t\tconst asNumber = Number(value);\n\t\tif (!Number.isSafeInteger(asNumber)) {\n\t\t\tthrow new Error(\"Value exceeds safe integer range\");\n\t\t}\n\t\treturn asNumber;\n\t}\n\n\tfunction computeSpanDepth(parentSpanId: SpanId | null): number {\n\t\tif (!parentSpanId) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst parent = activeSpans.get(spanKey(parentSpanId));\n\t\tif (!parent) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn parent.depth + 1;\n\t}\n\n\tfunction randomSpanId(): SpanId {\n\t\treturn toArrayBuffer(randomBytes(SPAN_ID_BYTES));\n\t}\n\n\tfunction randomTraceId(): TraceId {\n\t\treturn toArrayBuffer(randomBytes(TRACE_ID_BYTES));\n\t}\n\n\tfunction toBareStatus(status: SpanStatusInput): SpanStatus {\n\t\treturn {\n\t\t\tcode: toBareStatusCode(status.code),\n\t\t\tmessage: status.message ?? null,\n\t\t};\n\t}\n\n\tfunction toBareStatusCode(code: SpanStatusInput[\"code\"]): SpanStatusCode {\n\t\tswitch (code) {\n\t\t\tcase \"OK\":\n\t\t\t\treturn SpanStatusCode.OK;\n\t\t\tcase \"ERROR\":\n\t\t\t\treturn SpanStatusCode.ERROR;\n\t\t\tcase \"UNSET\":\n\t\t\tdefault:\n\t\t\t\treturn SpanStatusCode.UNSET;\n\t\t}\n\t}\n\n\treturn {\n\t\tstartSpan,\n\t\tupdateSpan,\n\t\tsetAttributes,\n\t\tsetStatus,\n\t\tendSpan,\n\t\temitEvent,\n\t\twithSpan,\n\t\tgetCurrentSpan,\n\t\tflush,\n\t\treadRange,\n\t\treadRangeWire,\n\t};\n}\n"],"mappings":"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","names":["options","record","absNs"]}
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkZTVH74GCcjs = require('./chunk-ZTVH74GC.cjs');
7
+ var _chunkAQ2YFUDScjs = require('./chunk-AQ2YFUDS.cjs');
8
8
  require('./chunk-QOSSO6CN.cjs');
9
9
 
10
10
 
@@ -12,5 +12,5 @@ require('./chunk-QOSSO6CN.cjs');
12
12
 
13
13
 
14
14
 
15
- exports.anyValueFromCborBytes = _chunkZTVH74GCcjs.anyValueFromCborBytes; exports.anyValueFromJs = _chunkZTVH74GCcjs.anyValueFromJs; exports.base64FromBytes = _chunkZTVH74GCcjs.base64FromBytes; exports.hexFromBytes = _chunkZTVH74GCcjs.hexFromBytes; exports.readRangeWireToOtlp = _chunkZTVH74GCcjs.readRangeWireToOtlp;
15
+ exports.anyValueFromCborBytes = _chunkAQ2YFUDScjs.anyValueFromCborBytes; exports.anyValueFromJs = _chunkAQ2YFUDScjs.anyValueFromJs; exports.base64FromBytes = _chunkAQ2YFUDScjs.base64FromBytes; exports.hexFromBytes = _chunkAQ2YFUDScjs.hexFromBytes; exports.readRangeWireToOtlp = _chunkAQ2YFUDScjs.readRangeWireToOtlp;
16
16
  //# sourceMappingURL=otlp-entry.cjs.map
@@ -4,7 +4,7 @@ import {
4
4
  base64FromBytes,
5
5
  hexFromBytes,
6
6
  readRangeWireToOtlp
7
- } from "./chunk-UNGPFJ4C.js";
7
+ } from "./chunk-EFMYWW4F.js";
8
8
  import "./chunk-7RQXHEKZ.js";
9
9
  export {
10
10
  anyValueFromCborBytes,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rivetkit/traces",
3
- "version": "2.1.5",
3
+ "version": "2.1.6-rc.1",
4
4
  "description": "Generic tracing storage and OTLP export for RivetKit",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
package/src/index.ts CHANGED
@@ -1,6 +1,4 @@
1
- export {
2
- createTraces,
3
- } from "./traces.js";
1
+ export { createTraces } from "./traces.js";
4
2
  export { createNoopTraces } from "./noop.js";
5
3
  export type {
6
4
  EndSpanOptions,
package/src/noop.ts CHANGED
@@ -71,7 +71,10 @@ export function createNoopTraces(): Traces<OtlpExportTraceServiceRequestJson> {
71
71
  return {
72
72
  startTimeMs: BigInt(options.startMs),
73
73
  endTimeMs: BigInt(options.endMs),
74
- limit: Math.max(0, Math.min(U32_MAX, Math.floor(options.limit))),
74
+ limit: Math.max(
75
+ 0,
76
+ Math.min(U32_MAX, Math.floor(options.limit)),
77
+ ),
75
78
  clamped: false,
76
79
  baseChunks: [],
77
80
  chunks: [],
package/src/otlp.ts CHANGED
@@ -91,7 +91,15 @@ export function hexFromBytes(bytes: Uint8Array): string {
91
91
  }
92
92
 
93
93
  export function base64FromBytes(bytes: Uint8Array): string {
94
- const bufferCtor = (globalThis as { Buffer?: { from: (data: Uint8Array) => { toString: (encoding: string) => string } } }).Buffer;
94
+ const bufferCtor = (
95
+ globalThis as {
96
+ Buffer?: {
97
+ from: (data: Uint8Array) => {
98
+ toString: (encoding: string) => string;
99
+ };
100
+ };
101
+ }
102
+ ).Buffer;
95
103
  if (bufferCtor) {
96
104
  return bufferCtor.from(bytes).toString("base64");
97
105
  }
package/src/read-range.ts CHANGED
@@ -196,11 +196,7 @@ function buildSpansFromRecords(
196
196
  );
197
197
  }
198
198
  if (!span) {
199
- span = initSpanFromRecord(
200
- body,
201
- entry.absNs,
202
- entry.strings,
203
- );
199
+ span = initSpanFromRecord(body, entry.absNs, entry.strings);
204
200
  }
205
201
  if (!span) {
206
202
  continue;
@@ -324,10 +320,7 @@ function applyRecord(
324
320
  span.kind = body.val.kind;
325
321
  span.traceState = body.val.traceState;
326
322
  span.flags = body.val.flags;
327
- span.attributes = decodeAttributeList(
328
- body.val.attributes,
329
- strings,
330
- );
323
+ span.attributes = decodeAttributeList(body.val.attributes, strings);
331
324
  span.droppedAttributesCount = body.val.droppedAttributesCount;
332
325
  span.links = decodeLinks(body.val.links, strings);
333
326
  span.droppedLinksCount = body.val.droppedLinksCount;
@@ -345,10 +338,7 @@ function applyRecord(
345
338
  span.events.push({
346
339
  name: strings[body.val.name] ?? "",
347
340
  timeUnixNs: absNs,
348
- attributes: decodeAttributeList(
349
- body.val.attributes,
350
- strings,
351
- ),
341
+ attributes: decodeAttributeList(body.val.attributes, strings),
352
342
  droppedAttributesCount: body.val.droppedAttributesCount,
353
343
  });
354
344
  return;
package/src/traces.ts CHANGED
@@ -177,7 +177,10 @@ export function createTraces(
177
177
  const unixMs = anchor.unixMs + (performance.now() - anchor.monoMs);
178
178
  const wholeMs = Math.floor(unixMs);
179
179
  const fracMs = unixMs - wholeMs;
180
- return BigInt(wholeMs) * 1_000_000n + BigInt(Math.floor(fracMs * 1_000_000));
180
+ return (
181
+ BigInt(wholeMs) * 1_000_000n +
182
+ BigInt(Math.floor(fracMs * 1_000_000))
183
+ );
181
184
  }
182
185
 
183
186
  function createChunkState(bucketStartSec: number): ChunkState {
@@ -223,9 +226,10 @@ export function createTraces(
223
226
  return id;
224
227
  }
225
228
 
226
- function encodeAttributes(
227
- attributes?: Record<string, unknown>,
228
- ): { attributes: Attributes; dropped: number } {
229
+ function encodeAttributes(attributes?: Record<string, unknown>): {
230
+ attributes: Attributes;
231
+ dropped: number;
232
+ } {
229
233
  const list: KeyValue[] = [];
230
234
  let dropped = 0;
231
235
  if (!attributes) {
@@ -239,7 +243,10 @@ export function createTraces(
239
243
  }
240
244
  try {
241
245
  const encoded = encodeCbor(sanitized);
242
- list.push({ key: internString(key), value: toArrayBuffer(encoded) });
246
+ list.push({
247
+ key: internString(key),
248
+ value: toArrayBuffer(encoded),
249
+ });
243
250
  } catch {
244
251
  dropped++;
245
252
  }
@@ -275,9 +282,10 @@ export function createTraces(
275
282
  return value;
276
283
  }
277
284
 
278
- function encodeLinks(
279
- links?: StartSpanOptions["links"],
280
- ): { links: SpanLink[]; dropped: number } {
285
+ function encodeLinks(links?: StartSpanOptions["links"]): {
286
+ links: SpanLink[];
287
+ dropped: number;
288
+ } {
281
289
  const result: SpanLink[] = [];
282
290
  let dropped = 0;
283
291
  if (!links) {
@@ -379,9 +387,10 @@ export function createTraces(
379
387
  };
380
388
  }
381
389
 
382
- function encodeAttributeMap(
383
- attributes: AttributeMap,
384
- ): { attributes: Attributes; dropped: number } {
390
+ function encodeAttributeMap(attributes: AttributeMap): {
391
+ attributes: Attributes;
392
+ dropped: number;
393
+ } {
385
394
  const list: KeyValue[] = [];
386
395
  let dropped = 0;
387
396
  for (const [key, value] of attributes.entries()) {
@@ -392,7 +401,10 @@ export function createTraces(
392
401
  }
393
402
  try {
394
403
  const encoded = encodeCbor(sanitized);
395
- list.push({ key: internString(key), value: toArrayBuffer(encoded) });
404
+ list.push({
405
+ key: internString(key),
406
+ value: toArrayBuffer(encoded),
407
+ });
396
408
  } catch {
397
409
  dropped++;
398
410
  }
@@ -445,15 +457,15 @@ export function createTraces(
445
457
  }));
446
458
  }
447
459
 
448
- function encodeLinkState(
449
- links: LinkState[],
450
- ): { links: SpanLink[]; dropped: number } {
460
+ function encodeLinkState(links: LinkState[]): {
461
+ links: SpanLink[];
462
+ dropped: number;
463
+ } {
451
464
  const result: SpanLink[] = [];
452
465
  let dropped = 0;
453
466
  for (const link of links) {
454
- const { attributes, dropped: droppedAttributes } = encodeAttributeMap(
455
- link.attributes,
456
- );
467
+ const { attributes, dropped: droppedAttributes } =
468
+ encodeAttributeMap(link.attributes);
457
469
  result.push({
458
470
  traceId: link.traceId,
459
471
  spanId: link.spanId,
@@ -522,7 +534,10 @@ export function createTraces(
522
534
  chunk,
523
535
  CURRENT_VERSION,
524
536
  );
525
- const key = buildChunkKey(currentChunk.bucketStartSec, currentChunk.chunkId);
537
+ const key = buildChunkKey(
538
+ currentChunk.bucketStartSec,
539
+ currentChunk.chunkId,
540
+ );
526
541
  const maxRecordNs =
527
542
  chunk.records.length > 0
528
543
  ? chunk.baseUnixNs +
@@ -608,7 +623,9 @@ export function createTraces(
608
623
  assertActive(parent);
609
624
  }
610
625
  const spanIdBytes = randomBytes(SPAN_ID_BYTES);
611
- const traceIdBytes = parent ? parent.traceId : randomBytes(TRACE_ID_BYTES);
626
+ const traceIdBytes = parent
627
+ ? parent.traceId
628
+ : randomBytes(TRACE_ID_BYTES);
612
629
  const spanId = toArrayBuffer(spanIdBytes);
613
630
  const traceId = toArrayBuffer(traceIdBytes);
614
631
  const parentSpanId = parent ? toArrayBuffer(parent.spanId) : null;
@@ -650,7 +667,8 @@ export function createTraces(
650
667
  droppedLinksCount: spanStart.droppedLinksCount,
651
668
  status: null,
652
669
  startTimeUnixNs:
653
- currentChunk.baseUnixNs + currentChunk.records[recordIndex].timeOffsetNs,
670
+ currentChunk.baseUnixNs +
671
+ currentChunk.records[recordIndex].timeOffsetNs,
654
672
  depth,
655
673
  bytesSinceSnapshot: encodedBytes,
656
674
  lastSnapshotMonoMs: performance.now(),
@@ -711,7 +729,11 @@ export function createTraces(
711
729
  const { encodedBytes } = appendRecord(
712
730
  () => ({
713
731
  tag: "SpanEvent",
714
- val: createSpanEventRecord(toArrayBuffer(handle.spanId), name, options),
732
+ val: createSpanEventRecord(
733
+ toArrayBuffer(handle.spanId),
734
+ name,
735
+ options,
736
+ ),
715
737
  }),
716
738
  options?.timeUnixMs,
717
739
  );
@@ -731,7 +753,10 @@ export function createTraces(
731
753
  dropSpan(handle.spanId);
732
754
  }
733
755
 
734
- function maybeSnapshot(spanId: SpanId | Uint8Array, state: SpanState): void {
756
+ function maybeSnapshot(
757
+ spanId: SpanId | Uint8Array,
758
+ state: SpanState,
759
+ ): void {
735
760
  if (
736
761
  state.bytesSinceSnapshot < snapshotBytesThreshold &&
737
762
  performance.now() - state.lastSnapshotMonoMs < snapshotIntervalMs
@@ -748,10 +773,10 @@ export function createTraces(
748
773
  activeSpanRefs.set(key, {
749
774
  ...ref,
750
775
  latestSnapshotKey: {
751
- prefix: KEY_PREFIX.DATA,
752
- bucketStartSec: BigInt(currentChunk.bucketStartSec),
753
- chunkId: currentChunk.chunkId,
754
- recordIndex,
776
+ prefix: KEY_PREFIX.DATA,
777
+ bucketStartSec: BigInt(currentChunk.bucketStartSec),
778
+ chunkId: currentChunk.chunkId,
779
+ recordIndex,
755
780
  },
756
781
  });
757
782
  }
@@ -1061,7 +1086,10 @@ export function createTraces(
1061
1086
  return { bucketStartSec: tuple[1], chunkId: tuple[2] };
1062
1087
  }
1063
1088
 
1064
- function buildChunkKey(bucketStartSec: number, chunkId: number): Uint8Array {
1089
+ function buildChunkKey(
1090
+ bucketStartSec: number,
1091
+ chunkId: number,
1092
+ ): Uint8Array {
1065
1093
  return pack([KEY_PREFIX.DATA, bucketStartSec, chunkId]);
1066
1094
  }
1067
1095
 
@@ -1073,11 +1101,11 @@ export function createTraces(
1073
1101
  }
1074
1102
  }
1075
1103
 
1076
- async function loadBaseRecord(
1077
- ref: ActiveSpanRef,
1078
- ): Promise<
1079
- { record: TraceRecord; strings: readonly string[]; absNs: bigint } | null
1080
- > {
1104
+ async function loadBaseRecord(ref: ActiveSpanRef): Promise<{
1105
+ record: TraceRecord;
1106
+ strings: readonly string[];
1107
+ absNs: bigint;
1108
+ } | null> {
1081
1109
  const key = ref.latestSnapshotKey ?? ref.startKey;
1082
1110
  const bucketStartSec = toNumber(key.bucketStartSec);
1083
1111
  const fromMemory = findChunkInMemory(bucketStartSec, key.chunkId);
package/src/types.ts CHANGED
@@ -5,7 +5,9 @@ export interface TracesDriver {
5
5
  set(key: Uint8Array, value: Uint8Array): Promise<void>;
6
6
  delete(key: Uint8Array): Promise<void>;
7
7
  deletePrefix(prefix: Uint8Array): Promise<void>;
8
- list(prefix: Uint8Array): Promise<Array<{ key: Uint8Array; value: Uint8Array }>>;
8
+ list(
9
+ prefix: Uint8Array,
10
+ ): Promise<Array<{ key: Uint8Array; value: Uint8Array }>>;
9
11
  listRange(
10
12
  start: Uint8Array,
11
13
  end: Uint8Array,
@@ -82,7 +84,10 @@ export interface TracesOptions<TResource> {
82
84
  export interface Traces<TExport> {
83
85
  startSpan(name: string, options?: StartSpanOptions): SpanHandle;
84
86
  updateSpan(handle: SpanHandle, options: UpdateSpanOptions): void;
85
- setAttributes(handle: SpanHandle, attributes: Record<string, unknown>): void;
87
+ setAttributes(
88
+ handle: SpanHandle,
89
+ attributes: Record<string, unknown>,
90
+ ): void;
86
91
  setStatus(handle: SpanHandle, status: SpanStatusInput): void;
87
92
  endSpan(handle: SpanHandle, options?: EndSpanOptions): void;
88
93
  emitEvent(handle: SpanHandle, name: string, options?: EventOptions): void;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/traces/dist/tsup/chunk-DXS2HLRN.cjs","../../src/noop.ts"],"names":[],"mappings":"AAAA;ACcA,IAAM,QAAA,EAAU,UAAA;AAEhB,IAAM,UAAA,EAAwB;AAAA,EAC7B,MAAA,EAAQ,IAAI,UAAA,CAAW,CAAC,CAAA;AAAA,EACxB,OAAA,EAAS,IAAI,UAAA,CAAW,EAAE,CAAA;AAAA,EAC1B,QAAA,EAAU,CAAA,EAAA,GAAM;AACjB,CAAA;AAEA,SAAS,qBAAA,CAAA,EAA2D;AACnE,EAAA,OAAO;AAAA,IACN,aAAA,EAAe;AAAA,MACd;AAAA,QACC,UAAA,EAAY,CAAC,EAAE,KAAA,EAAO,CAAC,EAAE,CAAC;AAAA,MAC3B;AAAA,IACD;AAAA,EACD,CAAA;AACD;AAKO,SAAS,gBAAA,CAAA,EAA8D;AAC7E,EAAA,OAAO;AAAA,IACN,SAAA,CAAU,KAAA,EAAe,QAAA,EAAyC;AACjE,MAAA,OAAO,SAAA;AAAA,IACR,CAAA;AAAA,IACA,UAAA,CAAW,OAAA,EAAqB,QAAA,EAAmC;AAAA,IAAC,CAAA;AAAA,IACpE,aAAA,CACC,OAAA,EACA,WAAA,EACO;AAAA,IAAC,CAAA;AAAA,IACT,SAAA,CAAU,OAAA,EAAqB,OAAA,EAAgC;AAAA,IAAC,CAAA;AAAA,IAChE,OAAA,CAAQ,OAAA,EAAqB,QAAA,EAAiC;AAAA,IAAC,CAAA;AAAA,IAC/D,SAAA,CACC,OAAA,EACA,KAAA,EACA,QAAA,EACO;AAAA,IAAC,CAAA;AAAA,IACT,QAAA,CAAY,OAAA,EAAqB,EAAA,EAAgB;AAChD,MAAA,OAAO,EAAA,CAAG,CAAA;AAAA,IACX,CAAA;AAAA,IACA,cAAA,CAAA,EAAoC;AACnC,MAAA,OAAO,IAAA;AAAA,IACR,CAAA;AAAA,IACA,MAAM,KAAA,CAAA,EAA0B;AAC/B,MAAA,OAAO,KAAA;AAAA,IACR,CAAA;AAAA,IACA,MAAM,SAAA,CACL,QAAA,EAC8D;AAC9D,MAAA,OAAO;AAAA,QACN,IAAA,EAAM,qBAAA,CAAsB,CAAA;AAAA,QAC5B,OAAA,EAAS;AAAA,MACV,CAAA;AAAA,IACD,CAAA;AAAA,IACA,MAAM,aAAA,CAAc,OAAA,EAAmD;AACtE,MAAA,OAAO;AAAA,QACN,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,QACnC,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,QAC/B,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAAA,QAC/D,OAAA,EAAS,KAAA;AAAA,QACT,UAAA,EAAY,CAAC,CAAA;AAAA,QACb,MAAA,EAAQ,CAAC;AAAA,MACV,CAAA;AAAA,IACD;AAAA,EACD,CAAA;AACD;ADtBA;AACA;AACE;AACF,4CAAC","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/traces/dist/tsup/chunk-DXS2HLRN.cjs","sourcesContent":[null,"import type { OtlpExportTraceServiceRequestJson } from \"./otlp.js\";\nimport type {\n\tEndSpanOptions,\n\tEventOptions,\n\tReadRangeOptions,\n\tReadRangeResult,\n\tReadRangeWire,\n\tSpanHandle,\n\tSpanStatusInput,\n\tStartSpanOptions,\n\tTraces,\n\tUpdateSpanOptions,\n} from \"./types.js\";\n\nconst U32_MAX = 0xffff_ffff;\n\nconst NOOP_SPAN: SpanHandle = {\n\tspanId: new Uint8Array(8),\n\ttraceId: new Uint8Array(16),\n\tisActive: () => false,\n};\n\nfunction createEmptyOtlpExport(): OtlpExportTraceServiceRequestJson {\n\treturn {\n\t\tresourceSpans: [\n\t\t\t{\n\t\t\t\tscopeSpans: [{ spans: [] }],\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Implements the Traces contract without persisting or exporting trace data.\n */\nexport function createNoopTraces(): Traces<OtlpExportTraceServiceRequestJson> {\n\treturn {\n\t\tstartSpan(_name: string, _options?: StartSpanOptions): SpanHandle {\n\t\t\treturn NOOP_SPAN;\n\t\t},\n\t\tupdateSpan(_handle: SpanHandle, _options: UpdateSpanOptions): void {},\n\t\tsetAttributes(\n\t\t\t_handle: SpanHandle,\n\t\t\t_attributes: Record<string, unknown>,\n\t\t): void {},\n\t\tsetStatus(_handle: SpanHandle, _status: SpanStatusInput): void {},\n\t\tendSpan(_handle: SpanHandle, _options?: EndSpanOptions): void {},\n\t\temitEvent(\n\t\t\t_handle: SpanHandle,\n\t\t\t_name: string,\n\t\t\t_options?: EventOptions,\n\t\t): void {},\n\t\twithSpan<T>(_handle: SpanHandle, fn: () => T): T {\n\t\t\treturn fn();\n\t\t},\n\t\tgetCurrentSpan(): SpanHandle | null {\n\t\t\treturn null;\n\t\t},\n\t\tasync flush(): Promise<boolean> {\n\t\t\treturn false;\n\t\t},\n\t\tasync readRange(\n\t\t\t_options: ReadRangeOptions,\n\t\t): Promise<ReadRangeResult<OtlpExportTraceServiceRequestJson>> {\n\t\t\treturn {\n\t\t\t\totlp: createEmptyOtlpExport(),\n\t\t\t\tclamped: false,\n\t\t\t};\n\t\t},\n\t\tasync readRangeWire(options: ReadRangeOptions): Promise<ReadRangeWire> {\n\t\t\treturn {\n\t\t\t\tstartTimeMs: BigInt(options.startMs),\n\t\t\t\tendTimeMs: BigInt(options.endMs),\n\t\t\t\tlimit: Math.max(0, Math.min(U32_MAX, Math.floor(options.limit))),\n\t\t\t\tclamped: false,\n\t\t\t\tbaseChunks: [],\n\t\t\t\tchunks: [],\n\t\t\t};\n\t\t},\n\t};\n}\n"]}