@rivetkit/traces 2.3.0-rc.3 → 2.3.0-rc.5

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.
@@ -38,6 +38,9 @@ function createNoopTraces() {
38
38
  async flush() {
39
39
  return false;
40
40
  },
41
+ getLastWriteError() {
42
+ return null;
43
+ },
41
44
  async readRange(_options) {
42
45
  return {
43
46
  otlp: createEmptyOtlpExport(),
@@ -63,4 +66,4 @@ function createNoopTraces() {
63
66
 
64
67
 
65
68
  exports.createNoopTraces = createNoopTraces;
66
- //# sourceMappingURL=chunk-PEQOL4YP.cjs.map
69
+ //# sourceMappingURL=chunk-MFBM65UR.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/traces/dist/tsup/chunk-MFBM65UR.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,iBAAA,CAAA,EAAoC;AACnC,MAAA,OAAO,IAAA;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;AAAA,UACX,CAAA;AAAA,UACA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAC;AAAA,QAC5C,CAAA;AAAA,QACA,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-MFBM65UR.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\tgetLastWriteError(): unknown | null {\n\t\t\treturn null;\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(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(U32_MAX, Math.floor(options.limit)),\n\t\t\t\t),\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"]}
@@ -38,6 +38,9 @@ function createNoopTraces() {
38
38
  async flush() {
39
39
  return false;
40
40
  },
41
+ getLastWriteError() {
42
+ return null;
43
+ },
41
44
  async readRange(_options) {
42
45
  return {
43
46
  otlp: createEmptyOtlpExport(),
@@ -63,4 +66,4 @@ function createNoopTraces() {
63
66
  export {
64
67
  createNoopTraces
65
68
  };
66
- //# sourceMappingURL=chunk-W73DVHQG.js.map
69
+ //# sourceMappingURL=chunk-QSXOZKO5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/noop.ts"],"sourcesContent":["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\tgetLastWriteError(): unknown | null {\n\t\t\treturn null;\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(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(U32_MAX, Math.floor(options.limit)),\n\t\t\t\t),\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"],"mappings":";AAcA,IAAM,UAAU;AAEhB,IAAM,YAAwB;AAAA,EAC7B,QAAQ,IAAI,WAAW,CAAC;AAAA,EACxB,SAAS,IAAI,WAAW,EAAE;AAAA,EAC1B,UAAU,MAAM;AACjB;AAEA,SAAS,wBAA2D;AACnE,SAAO;AAAA,IACN,eAAe;AAAA,MACd;AAAA,QACC,YAAY,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,MAC3B;AAAA,IACD;AAAA,EACD;AACD;AAKO,SAAS,mBAA8D;AAC7E,SAAO;AAAA,IACN,UAAU,OAAe,UAAyC;AACjE,aAAO;AAAA,IACR;AAAA,IACA,WAAW,SAAqB,UAAmC;AAAA,IAAC;AAAA,IACpE,cACC,SACA,aACO;AAAA,IAAC;AAAA,IACT,UAAU,SAAqB,SAAgC;AAAA,IAAC;AAAA,IAChE,QAAQ,SAAqB,UAAiC;AAAA,IAAC;AAAA,IAC/D,UACC,SACA,OACA,UACO;AAAA,IAAC;AAAA,IACT,SAAY,SAAqB,IAAgB;AAChD,aAAO,GAAG;AAAA,IACX;AAAA,IACA,iBAAoC;AACnC,aAAO;AAAA,IACR;AAAA,IACA,MAAM,QAA0B;AAC/B,aAAO;AAAA,IACR;AAAA,IACA,oBAAoC;AACnC,aAAO;AAAA,IACR;AAAA,IACA,MAAM,UACL,UAC8D;AAC9D,aAAO;AAAA,QACN,MAAM,sBAAsB;AAAA,QAC5B,SAAS;AAAA,MACV;AAAA,IACD;AAAA,IACA,MAAM,cAAc,SAAmD;AACtE,aAAO;AAAA,QACN,aAAa,OAAO,QAAQ,OAAO;AAAA,QACnC,WAAW,OAAO,QAAQ,KAAK;AAAA,QAC/B,OAAO,KAAK;AAAA,UACX;AAAA,UACA,KAAK,IAAI,SAAS,KAAK,MAAM,QAAQ,KAAK,CAAC;AAAA,QAC5C;AAAA,QACA,SAAS;AAAA,QACT,YAAY,CAAC;AAAA,QACb,QAAQ,CAAC;AAAA,MACV;AAAA,IACD;AAAA,EACD;AACD;","names":[]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkPEQOL4YPcjs = require('./chunk-PEQOL4YP.cjs');
3
+ var _chunkMFBM65URcjs = require('./chunk-MFBM65UR.cjs');
4
4
 
5
5
  // src/index.browser.ts
6
6
  function createTraces() {
@@ -11,5 +11,5 @@ function createTraces() {
11
11
 
12
12
 
13
13
 
14
- exports.createNoopTraces = _chunkPEQOL4YPcjs.createNoopTraces; exports.createTraces = createTraces;
14
+ exports.createNoopTraces = _chunkMFBM65URcjs.createNoopTraces; exports.createTraces = createTraces;
15
15
  //# sourceMappingURL=index.browser.cjs.map
@@ -1,4 +1,4 @@
1
- export { c as createNoopTraces } from './noop-CcgjEgCu.cjs';
1
+ export { c as createNoopTraces } from './noop-D4rXyhrZ.cjs';
2
2
  import './otlp-Da4Yz0xC.cjs';
3
3
  import './v1-DovAIc7f.cjs';
4
4
 
@@ -1,4 +1,4 @@
1
- export { c as createNoopTraces } from './noop-D-YAZiGa.js';
1
+ export { c as createNoopTraces } from './noop-DvHwAqWy.js';
2
2
  import './otlp-Da4Yz0xC.js';
3
3
  import './v1-DovAIc7f.js';
4
4
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createNoopTraces
3
- } from "./chunk-W73DVHQG.js";
3
+ } from "./chunk-QSXOZKO5.js";
4
4
 
5
5
  // src/index.browser.ts
6
6
  function createTraces() {
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
- var _chunkPEQOL4YPcjs = require('./chunk-PEQOL4YP.cjs');
3
+ var _chunkMFBM65URcjs = require('./chunk-MFBM65UR.cjs');
4
4
 
5
5
 
6
6
 
@@ -24,7 +24,7 @@ var KEY_PREFIX = {
24
24
  var AFTER_MAX_CHUNK_ID = 4294967296;
25
25
  var DEFAULT_BUCKET_SIZE_SEC = 3600;
26
26
  var DEFAULT_TARGET_CHUNK_BYTES = 512 * 1024;
27
- var DEFAULT_MAX_CHUNK_BYTES = 1024 * 1024;
27
+ var DEFAULT_MAX_CHUNK_BYTES = 96 * 1024;
28
28
  var DEFAULT_MAX_CHUNK_AGE_MS = 5e3;
29
29
  var DEFAULT_SNAPSHOT_INTERVAL_MS = 3e5;
30
30
  var DEFAULT_SNAPSHOT_BYTES_THRESHOLD = 256 * 1024;
@@ -69,6 +69,7 @@ function createTraces(options) {
69
69
  const activeSpanRefs = /* @__PURE__ */ new Map();
70
70
  const pendingChunks = [];
71
71
  let writeChain = Promise.resolve();
72
+ let lastWriteError = null;
72
73
  const bucketChunkCounters = /* @__PURE__ */ new Map();
73
74
  function nowUnixMs() {
74
75
  return timeAnchor.unixMs + (_perf_hooks.performance.now() - timeAnchor.monoMs);
@@ -387,7 +388,12 @@ function createTraces(options) {
387
388
  if (index !== -1) {
388
389
  pendingChunks.splice(index, 1);
389
390
  }
390
- });
391
+ }).catch(recoverWriteChain);
392
+ }
393
+ function recoverWriteChain(error) {
394
+ lastWriteError = error;
395
+ console.warn("[rivetkit/traces] trace chunk write failed", error);
396
+ return void 0;
391
397
  }
392
398
  function resetChunkState(bucketStartSec) {
393
399
  currentChunk.bucketStartSec = bucketStartSec;
@@ -583,9 +589,12 @@ function createTraces(options) {
583
589
  if (didFlush) {
584
590
  resetChunkState(currentChunk.bucketStartSec);
585
591
  }
586
- await writeChain;
592
+ await writeChain.catch(recoverWriteChain);
587
593
  return didFlush;
588
594
  }
595
+ function getLastWriteError() {
596
+ return lastWriteError;
597
+ }
589
598
  function withSpan(handle, fn) {
590
599
  return spanContext.run(handle, fn);
591
600
  }
@@ -921,6 +930,7 @@ function createTraces(options) {
921
930
  withSpan,
922
931
  getCurrentSpan,
923
932
  flush,
933
+ getLastWriteError,
924
934
  readRange,
925
935
  readRangeWire
926
936
  };
@@ -928,5 +938,5 @@ function createTraces(options) {
928
938
 
929
939
 
930
940
 
931
- exports.createNoopTraces = _chunkPEQOL4YPcjs.createNoopTraces; exports.createTraces = createTraces;
941
+ exports.createNoopTraces = _chunkMFBM65URcjs.createNoopTraces; exports.createTraces = createTraces;
932
942
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/traces/dist/tsup/index.cjs","../../src/traces.ts"],"names":["options","record","absNs"],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/traces/dist/tsup/index.cjs","sourcesContent":[null,"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"]}
1
+ {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/traces/dist/tsup/index.cjs","../../src/traces.ts"],"names":["options","record","absNs"],"mappings":"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","file":"/home/runner/work/rivet/rivet/rivetkit-typescript/packages/traces/dist/tsup/index.cjs","sourcesContent":[null,"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 = 96 * 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<void> = Promise.resolve();\n\tlet lastWriteError: unknown = null;\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\n\t\t\t.then(async () => {\n\t\t\t\tawait driver.set(pending.key, pending.bytes);\n\t\t\t\tconst index = pendingChunks.indexOf(pending);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tpendingChunks.splice(index, 1);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(recoverWriteChain);\n\t}\n\n\tfunction recoverWriteChain(error: unknown): undefined {\n\t\tlastWriteError = error;\n\t\tconsole.warn(\"[rivetkit/traces] trace chunk write failed\", error);\n\t\treturn undefined;\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.catch(recoverWriteChain);\n\t\treturn didFlush;\n\t}\n\n\tfunction getLastWriteError(): unknown | null {\n\t\treturn lastWriteError;\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\tgetLastWriteError,\n\t\treadRange,\n\t\treadRangeWire,\n\t};\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { O as OtlpResource, a as OtlpExportTraceServiceRequestJson } from './otlp-Da4Yz0xC.cjs';
2
2
  export { b as OtlpAnyValue, c as OtlpInstrumentationScope, d as OtlpKeyValue, e as OtlpResourceSpans, f as OtlpScopeSpans, g as OtlpSpan, h as OtlpSpanEvent, i as OtlpSpanLink, j as OtlpSpanStatus } from './otlp-Da4Yz0xC.cjs';
3
- import { T as TracesOptions, a as Traces } from './noop-CcgjEgCu.cjs';
4
- export { E as EndSpanOptions, b as EventOptions, R as ReadRangeOptions, d as ReadRangeResult, e as ReadRangeWire, S as SpanHandle, f as SpanStatusInput, g as StartSpanOptions, h as TracesDriver, U as UpdateSpanOptions, c as createNoopTraces } from './noop-CcgjEgCu.cjs';
3
+ import { T as TracesOptions, a as Traces } from './noop-D4rXyhrZ.cjs';
4
+ export { E as EndSpanOptions, b as EventOptions, R as ReadRangeOptions, d as ReadRangeResult, e as ReadRangeWire, S as SpanHandle, f as SpanStatusInput, g as StartSpanOptions, h as TracesDriver, U as UpdateSpanOptions, c as createNoopTraces } from './noop-D4rXyhrZ.cjs';
5
5
  import './v1-DovAIc7f.cjs';
6
6
 
7
7
  declare function createTraces(options: TracesOptions<OtlpResource>): Traces<OtlpExportTraceServiceRequestJson>;
@@ -1,7 +1,7 @@
1
1
  import { O as OtlpResource, a as OtlpExportTraceServiceRequestJson } from './otlp-Da4Yz0xC.js';
2
2
  export { b as OtlpAnyValue, c as OtlpInstrumentationScope, d as OtlpKeyValue, e as OtlpResourceSpans, f as OtlpScopeSpans, g as OtlpSpan, h as OtlpSpanEvent, i as OtlpSpanLink, j as OtlpSpanStatus } from './otlp-Da4Yz0xC.js';
3
- import { T as TracesOptions, a as Traces } from './noop-D-YAZiGa.js';
4
- export { E as EndSpanOptions, b as EventOptions, R as ReadRangeOptions, d as ReadRangeResult, e as ReadRangeWire, S as SpanHandle, f as SpanStatusInput, g as StartSpanOptions, h as TracesDriver, U as UpdateSpanOptions, c as createNoopTraces } from './noop-D-YAZiGa.js';
3
+ import { T as TracesOptions, a as Traces } from './noop-DvHwAqWy.js';
4
+ export { E as EndSpanOptions, b as EventOptions, R as ReadRangeOptions, d as ReadRangeResult, e as ReadRangeWire, S as SpanHandle, f as SpanStatusInput, g as StartSpanOptions, h as TracesDriver, U as UpdateSpanOptions, c as createNoopTraces } from './noop-DvHwAqWy.js';
5
5
  import './v1-DovAIc7f.js';
6
6
 
7
7
  declare function createTraces(options: TracesOptions<OtlpResource>): Traces<OtlpExportTraceServiceRequestJson>;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createNoopTraces
3
- } from "./chunk-W73DVHQG.js";
3
+ } from "./chunk-QSXOZKO5.js";
4
4
  import {
5
5
  hexFromBytes,
6
6
  readRangeWireToOtlp
@@ -24,7 +24,7 @@ var KEY_PREFIX = {
24
24
  var AFTER_MAX_CHUNK_ID = 4294967296;
25
25
  var DEFAULT_BUCKET_SIZE_SEC = 3600;
26
26
  var DEFAULT_TARGET_CHUNK_BYTES = 512 * 1024;
27
- var DEFAULT_MAX_CHUNK_BYTES = 1024 * 1024;
27
+ var DEFAULT_MAX_CHUNK_BYTES = 96 * 1024;
28
28
  var DEFAULT_MAX_CHUNK_AGE_MS = 5e3;
29
29
  var DEFAULT_SNAPSHOT_INTERVAL_MS = 3e5;
30
30
  var DEFAULT_SNAPSHOT_BYTES_THRESHOLD = 256 * 1024;
@@ -69,6 +69,7 @@ function createTraces(options) {
69
69
  const activeSpanRefs = /* @__PURE__ */ new Map();
70
70
  const pendingChunks = [];
71
71
  let writeChain = Promise.resolve();
72
+ let lastWriteError = null;
72
73
  const bucketChunkCounters = /* @__PURE__ */ new Map();
73
74
  function nowUnixMs() {
74
75
  return timeAnchor.unixMs + (performance.now() - timeAnchor.monoMs);
@@ -387,7 +388,12 @@ function createTraces(options) {
387
388
  if (index !== -1) {
388
389
  pendingChunks.splice(index, 1);
389
390
  }
390
- });
391
+ }).catch(recoverWriteChain);
392
+ }
393
+ function recoverWriteChain(error) {
394
+ lastWriteError = error;
395
+ console.warn("[rivetkit/traces] trace chunk write failed", error);
396
+ return void 0;
391
397
  }
392
398
  function resetChunkState(bucketStartSec) {
393
399
  currentChunk.bucketStartSec = bucketStartSec;
@@ -583,9 +589,12 @@ function createTraces(options) {
583
589
  if (didFlush) {
584
590
  resetChunkState(currentChunk.bucketStartSec);
585
591
  }
586
- await writeChain;
592
+ await writeChain.catch(recoverWriteChain);
587
593
  return didFlush;
588
594
  }
595
+ function getLastWriteError() {
596
+ return lastWriteError;
597
+ }
589
598
  function withSpan(handle, fn) {
590
599
  return spanContext.run(handle, fn);
591
600
  }
@@ -921,6 +930,7 @@ function createTraces(options) {
921
930
  withSpan,
922
931
  getCurrentSpan,
923
932
  flush,
933
+ getLastWriteError,
924
934
  readRange,
925
935
  readRangeWire
926
936
  };
@@ -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 (\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"]}
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 = 96 * 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<void> = Promise.resolve();\n\tlet lastWriteError: unknown = null;\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\n\t\t\t.then(async () => {\n\t\t\t\tawait driver.set(pending.key, pending.bytes);\n\t\t\t\tconst index = pendingChunks.indexOf(pending);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tpendingChunks.splice(index, 1);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(recoverWriteChain);\n\t}\n\n\tfunction recoverWriteChain(error: unknown): undefined {\n\t\tlastWriteError = error;\n\t\tconsole.warn(\"[rivetkit/traces] trace chunk write failed\", error);\n\t\treturn undefined;\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.catch(recoverWriteChain);\n\t\treturn didFlush;\n\t}\n\n\tfunction getLastWriteError(): unknown | null {\n\t\treturn lastWriteError;\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\tgetLastWriteError,\n\t\treadRange,\n\t\treadRangeWire,\n\t};\n}\n"],"mappings":"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","names":["options","record","absNs"]}
@@ -87,6 +87,7 @@ interface Traces<TExport> {
87
87
  withSpan<T>(handle: SpanHandle, fn: () => T): T;
88
88
  getCurrentSpan(): SpanHandle | null;
89
89
  flush(): Promise<boolean>;
90
+ getLastWriteError(): unknown | null;
90
91
  readRange(options: ReadRangeOptions): Promise<ReadRangeResult<TExport>>;
91
92
  readRangeWire(options: ReadRangeOptions): Promise<ReadRangeWire>;
92
93
  }
@@ -87,6 +87,7 @@ interface Traces<TExport> {
87
87
  withSpan<T>(handle: SpanHandle, fn: () => T): T;
88
88
  getCurrentSpan(): SpanHandle | null;
89
89
  flush(): Promise<boolean>;
90
+ getLastWriteError(): unknown | null;
90
91
  readRange(options: ReadRangeOptions): Promise<ReadRangeResult<TExport>>;
91
92
  readRangeWire(options: ReadRangeOptions): Promise<ReadRangeWire>;
92
93
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rivetkit/traces",
3
- "version": "2.3.0-rc.3",
3
+ "version": "2.3.0-rc.5",
4
4
  "description": "Generic tracing storage and OTLP export for RivetKit",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
package/src/noop.ts CHANGED
@@ -59,6 +59,9 @@ export function createNoopTraces(): Traces<OtlpExportTraceServiceRequestJson> {
59
59
  async flush(): Promise<boolean> {
60
60
  return false;
61
61
  },
62
+ getLastWriteError(): unknown | null {
63
+ return null;
64
+ },
62
65
  async readRange(
63
66
  _options: ReadRangeOptions,
64
67
  ): Promise<ReadRangeResult<OtlpExportTraceServiceRequestJson>> {
package/src/traces.ts CHANGED
@@ -60,7 +60,7 @@ const AFTER_MAX_CHUNK_ID = 0x1_0000_0000;
60
60
 
61
61
  const DEFAULT_BUCKET_SIZE_SEC = 3600;
62
62
  const DEFAULT_TARGET_CHUNK_BYTES = 512 * 1024;
63
- const DEFAULT_MAX_CHUNK_BYTES = 1024 * 1024;
63
+ const DEFAULT_MAX_CHUNK_BYTES = 96 * 1024;
64
64
  const DEFAULT_MAX_CHUNK_AGE_MS = 5000;
65
65
  const DEFAULT_SNAPSHOT_INTERVAL_MS = 300_000;
66
66
  const DEFAULT_SNAPSHOT_BYTES_THRESHOLD = 256 * 1024;
@@ -166,7 +166,8 @@ export function createTraces(
166
166
  const activeSpans = new Map<string, SpanState>();
167
167
  const activeSpanRefs = new Map<string, ActiveSpanRef>();
168
168
  const pendingChunks: PendingChunk[] = [];
169
- let writeChain = Promise.resolve();
169
+ let writeChain: Promise<void> = Promise.resolve();
170
+ let lastWriteError: unknown = null;
170
171
  const bucketChunkCounters = new Map<number, number>();
171
172
 
172
173
  function nowUnixMs(): number {
@@ -557,13 +558,21 @@ export function createTraces(
557
558
  }
558
559
 
559
560
  function enqueueWrite(pending: PendingChunk): void {
560
- writeChain = writeChain.then(async () => {
561
- await driver.set(pending.key, pending.bytes);
562
- const index = pendingChunks.indexOf(pending);
563
- if (index !== -1) {
564
- pendingChunks.splice(index, 1);
565
- }
566
- });
561
+ writeChain = writeChain
562
+ .then(async () => {
563
+ await driver.set(pending.key, pending.bytes);
564
+ const index = pendingChunks.indexOf(pending);
565
+ if (index !== -1) {
566
+ pendingChunks.splice(index, 1);
567
+ }
568
+ })
569
+ .catch(recoverWriteChain);
570
+ }
571
+
572
+ function recoverWriteChain(error: unknown): undefined {
573
+ lastWriteError = error;
574
+ console.warn("[rivetkit/traces] trace chunk write failed", error);
575
+ return undefined;
567
576
  }
568
577
 
569
578
  function resetChunkState(bucketStartSec: number): void {
@@ -789,10 +798,14 @@ export function createTraces(
789
798
  if (didFlush) {
790
799
  resetChunkState(currentChunk.bucketStartSec);
791
800
  }
792
- await writeChain;
801
+ await writeChain.catch(recoverWriteChain);
793
802
  return didFlush;
794
803
  }
795
804
 
805
+ function getLastWriteError(): unknown | null {
806
+ return lastWriteError;
807
+ }
808
+
796
809
  function withSpan<T>(handle: SpanHandle, fn: () => T): T {
797
810
  return spanContext.run(handle, fn);
798
811
  }
@@ -1208,6 +1221,7 @@ export function createTraces(
1208
1221
  withSpan,
1209
1222
  getCurrentSpan,
1210
1223
  flush,
1224
+ getLastWriteError,
1211
1225
  readRange,
1212
1226
  readRangeWire,
1213
1227
  };
package/src/types.ts CHANGED
@@ -94,6 +94,7 @@ export interface Traces<TExport> {
94
94
  withSpan<T>(handle: SpanHandle, fn: () => T): T;
95
95
  getCurrentSpan(): SpanHandle | null;
96
96
  flush(): Promise<boolean>;
97
+ getLastWriteError(): unknown | null;
97
98
  readRange(options: ReadRangeOptions): Promise<ReadRangeResult<TExport>>;
98
99
  readRangeWire(options: ReadRangeOptions): Promise<ReadRangeWire>;
99
100
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/rivet/rivet/rivetkit-typescript/packages/traces/dist/tsup/chunk-PEQOL4YP.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;AAAA,UACX,CAAA;AAAA,UACA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAC;AAAA,QAC5C,CAAA;AAAA,QACA,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-PEQOL4YP.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(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(U32_MAX, Math.floor(options.limit)),\n\t\t\t\t),\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"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/noop.ts"],"sourcesContent":["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(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.min(U32_MAX, Math.floor(options.limit)),\n\t\t\t\t),\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"],"mappings":";AAcA,IAAM,UAAU;AAEhB,IAAM,YAAwB;AAAA,EAC7B,QAAQ,IAAI,WAAW,CAAC;AAAA,EACxB,SAAS,IAAI,WAAW,EAAE;AAAA,EAC1B,UAAU,MAAM;AACjB;AAEA,SAAS,wBAA2D;AACnE,SAAO;AAAA,IACN,eAAe;AAAA,MACd;AAAA,QACC,YAAY,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,MAC3B;AAAA,IACD;AAAA,EACD;AACD;AAKO,SAAS,mBAA8D;AAC7E,SAAO;AAAA,IACN,UAAU,OAAe,UAAyC;AACjE,aAAO;AAAA,IACR;AAAA,IACA,WAAW,SAAqB,UAAmC;AAAA,IAAC;AAAA,IACpE,cACC,SACA,aACO;AAAA,IAAC;AAAA,IACT,UAAU,SAAqB,SAAgC;AAAA,IAAC;AAAA,IAChE,QAAQ,SAAqB,UAAiC;AAAA,IAAC;AAAA,IAC/D,UACC,SACA,OACA,UACO;AAAA,IAAC;AAAA,IACT,SAAY,SAAqB,IAAgB;AAChD,aAAO,GAAG;AAAA,IACX;AAAA,IACA,iBAAoC;AACnC,aAAO;AAAA,IACR;AAAA,IACA,MAAM,QAA0B;AAC/B,aAAO;AAAA,IACR;AAAA,IACA,MAAM,UACL,UAC8D;AAC9D,aAAO;AAAA,QACN,MAAM,sBAAsB;AAAA,QAC5B,SAAS;AAAA,MACV;AAAA,IACD;AAAA,IACA,MAAM,cAAc,SAAmD;AACtE,aAAO;AAAA,QACN,aAAa,OAAO,QAAQ,OAAO;AAAA,QACnC,WAAW,OAAO,QAAQ,KAAK;AAAA,QAC/B,OAAO,KAAK;AAAA,UACX;AAAA,UACA,KAAK,IAAI,SAAS,KAAK,MAAM,QAAQ,KAAK,CAAC;AAAA,QAC5C;AAAA,QACA,SAAS;AAAA,QACT,YAAY,CAAC;AAAA,QACb,QAAQ,CAAC;AAAA,MACV;AAAA,IACD;AAAA,EACD;AACD;","names":[]}