@noego/telemetry 0.0.2 → 0.0.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.
Files changed (48) hide show
  1. package/dist/browser/index.cjs +21 -0
  2. package/dist/browser/index.cjs.map +1 -1
  3. package/dist/browser/index.d.cts +3 -3
  4. package/dist/browser/index.d.ts +3 -3
  5. package/dist/browser/index.js +21 -0
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/{browser_telemetry_client-BzBPQm4m.d.cts → browser_telemetry_client-BSAMZ8Qb.d.cts} +1 -1
  8. package/dist/{browser_telemetry_client-Ch_VzwEa.d.ts → browser_telemetry_client-DPBU6NGw.d.ts} +1 -1
  9. package/dist/{client_defaults-C9LnSX4j.d.cts → client_defaults-Dk0MMzvx.d.cts} +1 -1
  10. package/dist/{client_defaults-B5tC-TgG.d.ts → client_defaults-ShVYQYmn.d.ts} +1 -1
  11. package/dist/core/index.cjs +21 -0
  12. package/dist/core/index.cjs.map +1 -1
  13. package/dist/core/index.d.cts +3 -3
  14. package/dist/core/index.d.ts +3 -3
  15. package/dist/core/index.js +21 -0
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/electron/index.cjs +21 -0
  18. package/dist/electron/index.cjs.map +1 -1
  19. package/dist/electron/index.d.cts +2 -2
  20. package/dist/electron/index.d.ts +2 -2
  21. package/dist/electron/index.js +21 -0
  22. package/dist/electron/index.js.map +1 -1
  23. package/dist/index.cjs +21 -0
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +2 -2
  26. package/dist/index.d.ts +2 -2
  27. package/dist/index.js +21 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/node/index.cjs +33 -1
  30. package/dist/node/index.cjs.map +1 -1
  31. package/dist/node/index.d.cts +53 -3
  32. package/dist/node/index.d.ts +53 -3
  33. package/dist/node/index.js +32 -1
  34. package/dist/node/index.js.map +1 -1
  35. package/dist/node/producer/index.cjs +21 -0
  36. package/dist/node/producer/index.cjs.map +1 -1
  37. package/dist/node/producer/index.d.cts +2 -2
  38. package/dist/node/producer/index.d.ts +2 -2
  39. package/dist/node/producer/index.js +21 -0
  40. package/dist/node/producer/index.js.map +1 -1
  41. package/dist/{telemetry_client-CYaPYfOl.d.cts → telemetry_client-BO5Pjp41.d.cts} +9 -1
  42. package/dist/{telemetry_client-BXw8WH_F.d.ts → telemetry_client-D8uZ-mTL.d.ts} +9 -1
  43. package/dist/trace-adapter/index.d.cts +1 -1
  44. package/dist/trace-adapter/index.d.ts +1 -1
  45. package/migrations/1786100000000_animation_artifacts.down.sql +5 -0
  46. package/migrations/1786100000000_animation_artifacts.up.sql +41 -0
  47. package/native/noego_telemetry_native.node +0 -0
  48. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/platform/node/node_telemetry_host.ts","../../src/maintenance/maintenance_coordinator.ts","../../src/runtime/in_memory_batch_transport.ts","../../src/core/metric_definition_contract.ts","../../src/core/helper/canonical_json.ts","../../src/core/metric_extractor.ts","../../src/core/helper/client_defaults.ts","../../src/core/telemetry_batch_contract.ts","../../src/core/helper/telemetry_deadline_guard.ts","../../src/core/telemetry_acknowledgement_contract.ts","../../src/core/telemetry_storage_router.ts","../../src/plugins/telemetry_plugin_registry.ts","../../src/runtime/telemetry_runtime.ts","../../src/transports/sqlite_transport.ts","../../src/storage/helper/sqlite_table_names.ts","../../src/storage/sqlite_ownership_lease.ts","../../src/storage/telemetry_proper_sql_runner.ts","../../src/storage/telemetry_repository.ts","../../src/storage/schema/telemetry_repository_rows.ts","../../src/storage/telemetry_repository_row_parser.ts","../../src/storage/telemetry_table_map.ts","../../src/transports/schema/telemetry_schema_manifest.ts","../../src/platform/node/node_telemetry_producer_host.ts","../../src/core/bounded_metadata_snapshotter.ts","../../src/core/telemetry_client.ts","../../src/platform/node/native_telemetry_host.ts","../../src/platform/node/telemetry_configuration_parser.ts","../../src/platform/node/helper/telemetry_duration_parser.ts","../../src/platform/node/schema/telemetry_configuration_schema.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { TelemetryClient } from '../../core/telemetry_client.js';\nimport type {\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n} from '../../core/types/storage.types.js';\nimport { MaintenanceCoordinator } from '../../maintenance/maintenance_coordinator.js';\nimport { InMemoryBatchTransport } from '../../runtime/in_memory_batch_transport.js';\nimport { TelemetryCollectorRuntime } from '../../runtime/telemetry_runtime.js';\nimport { SQLiteTelemetryTransport } from '../../transports/sqlite_transport.js';\nimport { NodeTelemetryProducerHost } from './node_telemetry_producer_host.js';\nimport type {\n NodeCombinedTelemetryOptions,\n NodeLocalTelemetryProducerOptions,\n NodeTelemetryCollectorOptions,\n NodeTelemetryProducerOptions,\n} from './types/node_telemetry_host.types.js';\n\nexport class NodeTelemetryHost {\n private readonly localClients = new Set<TelemetryClient>();\n private acceptingLocalProducers = true;\n\n private constructor(\n readonly client: TelemetryClient | null,\n readonly collector: TelemetryCollectorRuntime | null,\n private readonly maintenance: MaintenanceCoordinator<ReturnType<typeof setInterval>> | null,\n ) {}\n\n static producer(options: NodeTelemetryProducerOptions): NodeTelemetryHost {\n return new NodeTelemetryHost(new NodeTelemetryProducerHost(options).client, null, null);\n }\n\n static collector(options: NodeTelemetryCollectorOptions): NodeTelemetryHost {\n const maintenanceConfiguration = options.maintenance\n ?? this.inferMaintenanceConfiguration(options.storage);\n const collector = new TelemetryCollectorRuntime({\n storage: options.storage,\n definitions: options.definitions,\n sinkPlugins: options.sinkPlugins,\n schemaVersions: [1],\n volatile: options.volatile,\n defaultTargetId: options.defaultTargetId,\n requiredCapabilities: this.requiredCollectorCapabilities(\n maintenanceConfiguration !== null,\n options.requiredCapabilities,\n ),\n ...(options.batchValidation === undefined ? {} : { batchValidation: options.batchValidation }),\n now: () => Date.now(),\n });\n if (collector.storageTransport().capabilities.maintenance && maintenanceConfiguration === null) {\n throw new Error('A maintenance-capable collector requires maintenance configuration');\n }\n const maintenance = maintenanceConfiguration === null\n ? null\n : this.createMaintenanceCoordinator(\n collector.storageTransport(),\n maintenanceConfiguration,\n options.observeMaintenance,\n );\n return new NodeTelemetryHost(null, collector, maintenance);\n }\n\n static combined(options: NodeCombinedTelemetryOptions): NodeTelemetryHost {\n const sqlite = new SQLiteTelemetryTransport(SQLiteTelemetryTransport.defaults(options.sqlite));\n const collector = new TelemetryCollectorRuntime({\n storage: sqlite,\n definitions: options.definitions,\n sinkPlugins: options.sinkPlugins,\n schemaVersions: [1],\n volatile: false,\n requiredCapabilities: this.requiredCombinedCapabilities(),\n ...(options.batchValidation === undefined ? {} : { batchValidation: options.batchValidation }),\n now: () => Date.now(),\n });\n const pipe = new InMemoryBatchTransport(`combined:${options.sqlite.targetId}`, collector);\n const client = new NodeTelemetryProducerHost({\n source: options.source,\n processKind: options.processKind,\n transport: pipe,\n admission: options.admission,\n metadata: options.metadata,\n producerId: options.producerId,\n }).client;\n const maintenance = this.createMaintenanceCoordinator(\n sqlite,\n options.sqlite.maintenance,\n options.observeMaintenance,\n );\n return new NodeTelemetryHost(client, collector, maintenance);\n }\n\n createLocalProducer(options: NodeLocalTelemetryProducerOptions): TelemetryClient {\n if (this.collector === null) {\n throw new Error('A local telemetry producer requires a collector host');\n }\n if (!this.acceptingLocalProducers) {\n throw new Error('The telemetry collector host is stopping or stopped');\n }\n const producerId = options.producerId ?? randomUUID();\n if (this.hasProducer(producerId)) {\n throw new Error(`Telemetry producer id ${producerId} is already active in this host`);\n }\n const transport = new InMemoryBatchTransport(`local:${producerId}`, this.collector);\n const client = new NodeTelemetryProducerHost({ ...options, producerId, transport }).client;\n this.localClients.add(client);\n return client;\n }\n\n async start(): Promise<void> {\n await this.collector?.start();\n this.maintenance?.start();\n await this.maintenance?.run();\n }\n\n async stop(deadlineMs: number): Promise<void> {\n this.acceptingLocalProducers = false;\n await this.maintenance?.stop(deadlineMs);\n await this.client?.stop(deadlineMs);\n await Promise.all([...this.localClients].map((client) => client.stop(deadlineMs)));\n this.localClients.clear();\n await this.maintenance?.runFinal(deadlineMs);\n await this.collector?.stop(deadlineMs);\n }\n\n private hasProducer(producerId: string): boolean {\n if (this.client?.status().producerId === producerId) {\n return true;\n }\n return [...this.localClients].some((client) => client.status().producerId === producerId);\n }\n\n private static createMaintenanceCoordinator(\n storage: TelemetryStorageTransport,\n configuration: NodeCombinedTelemetryOptions['sqlite']['maintenance'],\n observe: NodeCombinedTelemetryOptions['observeMaintenance'],\n ): MaintenanceCoordinator<ReturnType<typeof setInterval>> {\n return new MaintenanceCoordinator({\n storage,\n intervalMs: configuration.intervalMs,\n maxWorkMs: configuration.maxWorkMs,\n maxReclaimPages: configuration.maxReclaimPages,\n now: () => Date.now(),\n createRunId: () => randomUUID(),\n createInterval: (work, intervalMs) => setInterval(work, intervalMs),\n clearInterval: (handle) => clearInterval(handle),\n observe: observe ?? (() => undefined),\n });\n }\n\n private static inferMaintenanceConfiguration(\n storage: NodeTelemetryCollectorOptions['storage'],\n ): NodeCombinedTelemetryOptions['sqlite']['maintenance'] | null {\n return storage instanceof SQLiteTelemetryTransport\n ? storage.maintenanceConfiguration()\n : null;\n }\n\n private static requiredCollectorCapabilities(\n maintenanceConfigured: boolean,\n requested: readonly (keyof TelemetryStorageCapabilities)[] = [],\n ): readonly (keyof TelemetryStorageCapabilities)[] {\n const required = new Set<keyof TelemetryStorageCapabilities>(requested);\n if (maintenanceConfigured) {\n required.add('rollups');\n required.add('retention');\n required.add('maintenance');\n }\n return Object.freeze([...required]);\n }\n\n private static requiredCombinedCapabilities(): readonly (keyof TelemetryStorageCapabilities)[] {\n return Object.freeze([\n 'rawPersistence',\n 'metricSamples',\n 'rollups',\n 'queries',\n 'retention',\n 'maintenance',\n ]);\n }\n}\n","import type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n} from '../core/types/storage.types.js';\nimport type {\n MaintenanceCoordinatorOptions,\n MaintenanceLifecycleEvent,\n MaintenanceRunResult,\n} from './types/maintenance_coordinator.types.js';\n\nexport class MaintenanceCoordinator<IntervalHandle = unknown> {\n private running = false;\n private stopped = true;\n private intervalHandle: IntervalHandle | null = null;\n private activeCompletion: Promise<void> = Promise.resolve();\n private resolveActiveCompletion: () => void = () => undefined;\n\n constructor(private readonly options: MaintenanceCoordinatorOptions<IntervalHandle>) {\n if (options.intervalMs <= 0 || options.maxWorkMs <= 0 || options.maxReclaimPages < 0) {\n throw new Error('Telemetry maintenance interval and budgets are invalid');\n }\n }\n\n start(): void {\n if (!this.stopped) {\n return;\n }\n this.stopped = false;\n this.intervalHandle = this.options.createInterval(() => {\n void this.run().catch(() => undefined);\n }, this.options.intervalMs);\n }\n\n async run(): Promise<MaintenanceRunResult> {\n if (this.stopped) {\n return { kind: 'skipped', reason: 'stopped' };\n }\n if (this.running) {\n return { kind: 'skipped', reason: 'already-running' };\n }\n this.running = true;\n this.beginActiveRun();\n let runId = 'maintenance-run-unavailable';\n let startedAtMs = 0;\n const stages: MaintenanceStageResult[] = [];\n try {\n runId = this.options.createRunId();\n startedAtMs = this.options.now();\n this.publish({\n type: 'maintenance.started',\n occurredAtMs: startedAtMs,\n runId,\n payload: { stages: [], failedStage: null, error: null },\n });\n const started = await this.record({\n runId,\n kind: 'scheduled',\n state: 'started',\n startedAtMs,\n completedAtMs: null,\n stages: [],\n failedStage: null,\n error: null,\n });\n if (!started.ok) {\n return await this.failed(runId, startedAtMs, stages, 'rollup', started.error, 'scheduled');\n }\n const rollup = await this.options.storage.materializeRollups(this.options.now(), this.options.maxWorkMs);\n if (!rollup.ok) {\n return await this.failed(runId, startedAtMs, stages, 'rollup', rollup.error, 'scheduled');\n }\n stages.push(rollup.value);\n\n const retention = await this.options.storage.enforceRetention(\n this.options.now(),\n () => !this.stopped,\n );\n if (!retention.ok) {\n return await this.failed(runId, startedAtMs, stages, 'retention', retention.error, 'scheduled');\n }\n stages.push(retention.value);\n\n const checkpoint = await this.options.storage.checkpoint();\n if (!checkpoint.ok) {\n return await this.failed(runId, startedAtMs, stages, 'checkpoint', checkpoint.error, 'scheduled');\n }\n stages.push(checkpoint.value);\n\n const reclaim = await this.options.storage.reclaim(this.options.maxReclaimPages);\n if (!reclaim.ok) {\n return await this.failed(runId, startedAtMs, stages, 'reclaim', reclaim.error, 'scheduled');\n }\n stages.push(reclaim.value);\n\n const result: MaintenanceRunResult = {\n kind: 'completed',\n runId,\n stages: Object.freeze(stages),\n };\n const completedAtMs = this.options.now();\n const recorded = await this.record({\n runId,\n kind: 'scheduled',\n state: 'completed',\n startedAtMs,\n completedAtMs,\n stages: result.stages,\n failedStage: null,\n error: null,\n });\n if (!recorded.ok) {\n return await this.failed(\n runId,\n startedAtMs,\n stages,\n 'reclaim',\n recorded.error,\n 'scheduled',\n );\n }\n this.publish({\n type: 'maintenance.completed',\n occurredAtMs: completedAtMs,\n runId,\n payload: { stages: result.stages, failedStage: null, error: null },\n });\n return result;\n } catch (cause) {\n return await this.failed(\n runId,\n startedAtMs,\n stages,\n stages[stages.length - 1]?.stage ?? 'rollup',\n cause instanceof Error ? cause.message : String(cause),\n 'scheduled',\n );\n } finally {\n this.running = false;\n this.finishActiveRun();\n }\n }\n\n async runFinal(deadlineMs: number): Promise<MaintenanceRunResult> {\n if (!this.stopped) {\n throw new Error('Final telemetry maintenance requires a stopped, quiescent scheduler');\n }\n if (this.running) {\n return { kind: 'skipped', reason: 'already-running' };\n }\n if (this.options.now() >= deadlineMs) {\n return { kind: 'skipped', reason: 'deadline-exhausted' };\n }\n this.stopped = false;\n try {\n const result = await this.waitForRunResult(this.run(), deadlineMs);\n return result ?? { kind: 'skipped', reason: 'deadline-exhausted' };\n } finally {\n this.stopped = true;\n }\n }\n\n async compact(deadlineMs: number): Promise<MaintenanceRunResult> {\n if (this.stopped) {\n return { kind: 'skipped', reason: 'stopped' };\n }\n if (this.running) {\n return { kind: 'skipped', reason: 'already-running' };\n }\n this.running = true;\n this.beginActiveRun();\n const runId = this.options.createRunId();\n const startedAtMs = this.options.now();\n this.publish({\n type: 'maintenance.started',\n occurredAtMs: startedAtMs,\n runId,\n payload: { stages: [], failedStage: null, error: null },\n });\n try {\n const started = await this.record({\n runId,\n kind: 'compaction',\n state: 'started',\n startedAtMs,\n completedAtMs: null,\n stages: [],\n failedStage: null,\n error: null,\n });\n if (!started.ok) {\n return await this.failed(runId, startedAtMs, [], 'compaction', started.error, 'compaction');\n }\n const compacted = await this.options.storage.compact(deadlineMs);\n if (!compacted.ok) {\n return await this.failed(runId, startedAtMs, [], 'compaction', compacted.error, 'compaction');\n }\n const stages = Object.freeze([compacted.value]);\n const completedAtMs = this.options.now();\n const recorded = await this.record({\n runId,\n kind: 'compaction',\n state: 'completed',\n startedAtMs,\n completedAtMs,\n stages,\n failedStage: null,\n error: null,\n });\n if (!recorded.ok) {\n return await this.failed(\n runId,\n startedAtMs,\n stages,\n 'compaction',\n recorded.error,\n 'compaction',\n );\n }\n this.publish({\n type: 'maintenance.completed',\n occurredAtMs: completedAtMs,\n runId,\n payload: { stages, failedStage: null, error: null },\n });\n return { kind: 'completed', runId, stages };\n } catch (cause) {\n return await this.failed(\n runId,\n startedAtMs,\n [],\n 'compaction',\n cause instanceof Error ? cause.message : String(cause),\n 'compaction',\n );\n } finally {\n this.running = false;\n this.finishActiveRun();\n }\n }\n\n async stop(deadlineMs: number): Promise<void> {\n this.stopped = true;\n if (this.intervalHandle !== null) {\n this.options.clearInterval(this.intervalHandle);\n this.intervalHandle = null;\n }\n await this.waitForActiveCompletion(deadlineMs);\n }\n\n private beginActiveRun(): void {\n this.activeCompletion = new Promise<void>((resolve) => {\n this.resolveActiveCompletion = resolve;\n });\n }\n\n private finishActiveRun(): void {\n this.resolveActiveCompletion();\n this.resolveActiveCompletion = () => undefined;\n }\n\n private async waitForActiveCompletion(deadlineMs: number): Promise<void> {\n if (!this.running) {\n return;\n }\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n return;\n }\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(finish, Math.min(remainingMs, 2_147_483_647));\n void this.activeCompletion.then(finish, finish);\n });\n }\n\n private async waitForRunResult(\n operation: Promise<MaintenanceRunResult>,\n deadlineMs: number,\n ): Promise<MaintenanceRunResult | null> {\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n void operation.catch(() => undefined);\n return null;\n }\n return new Promise<MaintenanceRunResult | null>((resolve, reject) => {\n let settled = false;\n const finish = (result: MaintenanceRunResult | null, error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (error === undefined) {\n resolve(result);\n } else {\n reject(error);\n }\n };\n const timer = setTimeout(() => finish(null), Math.min(remainingMs, 2_147_483_647));\n void operation.then(\n (result) => finish(result),\n (error: unknown) => finish(null, error),\n );\n });\n }\n\n private async failed(\n runId: string,\n startedAtMs: number,\n stages: readonly MaintenanceStageResult[],\n stage: MaintenanceStageResult['stage'],\n error: string,\n kind: MaintenanceRunRecord['kind'],\n ): Promise<MaintenanceRunResult> {\n const completedAtMs = this.options.now();\n const recorded = await this.record({\n runId,\n kind,\n state: 'failed',\n startedAtMs,\n completedAtMs,\n stages,\n failedStage: stage,\n error,\n });\n const resolvedError = recorded.ok\n ? error\n : `${error}; maintenance record failed: ${recorded.error}`;\n const result: MaintenanceRunResult = {\n kind: 'failed',\n runId,\n stages: Object.freeze([...stages]),\n stage,\n error: resolvedError,\n };\n this.publish({\n type: 'maintenance.failed',\n occurredAtMs: completedAtMs,\n runId,\n payload: {\n stages: result.stages,\n failedStage: stage,\n error: resolvedError,\n },\n });\n return result;\n }\n\n private async record(record: MaintenanceRunRecord) {\n const recorder = this.options.storage.recordMaintenance;\n return recorder\n ? recorder.call(this.options.storage, Object.freeze(record))\n : { ok: true as const, value: undefined };\n }\n\n private publish(event: MaintenanceLifecycleEvent): void {\n try {\n this.options.observe(Object.freeze(event));\n } catch {\n // Maintenance observation is out-of-band and cannot alter storage work.\n }\n }\n}\n","import type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryBatchTransport,\n TelemetryBatchTransportCapabilities,\n} from '../core/types/transport.types.js';\n\nexport class InMemoryBatchTransport implements TelemetryBatchTransport {\n readonly capabilities: TelemetryBatchTransportCapabilities;\n private receiver: TelemetryBatchReceiver | null;\n private pending = 0;\n private closed = false;\n\n constructor(\n readonly transportId: string,\n receiver: TelemetryBatchReceiver | null,\n maxPendingBatches = 16,\n ) {\n this.receiver = receiver;\n this.capabilities = Object.freeze({\n maxBatchBytes: 1_000_000,\n acknowledgement: 'durable',\n ordering: 'producer',\n boundedCapacity: maxPendingBatches,\n });\n }\n\n connect(receiver: TelemetryBatchReceiver | null): void {\n this.receiver = receiver;\n }\n\n async send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n if (this.closed) {\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'closed',\n reason: 'In-memory telemetry transport is closed',\n targetStates: [],\n };\n }\n if (this.receiver === null || this.pending >= this.capabilities.boundedCapacity) {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.receiver === null ? 'No receiver is connected' : 'Transport capacity is full',\n retryAfterMs: 1,\n targetStates: [],\n };\n }\n this.pending += 1;\n try {\n return await this.receiver.receive(batch);\n } finally {\n this.pending -= 1;\n }\n }\n\n async flush(deadlineMs: number): Promise<void> {\n while (this.pending > 0 && Date.now() < deadlineMs) {\n const remainingMs = Math.max(0, deadlineMs - Date.now());\n await new Promise<void>((resolve) => setTimeout(resolve, Math.min(1, remainingMs)));\n }\n }\n\n async close(deadlineMs: number): Promise<void> {\n this.closed = true;\n await this.flush(deadlineMs);\n }\n}\n","import type { MetricDefinition } from './types/metric.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\n\nexport class MetricDefinitionContract {\n normalize(definition: MetricDefinition): TelemetryResult<MetricDefinition, string> {\n const parsedSelector = this.parseSelector(definition.selector);\n if (!parsedSelector.ok) {\n return parsedSelector;\n }\n\n const bracketGroupBy = parsedSelector.value.groupBy;\n const configuredGroupBy = definition.groupBy;\n const bothSpecifyDifferentGrouping = bracketGroupBy.length > 0\n && configuredGroupBy.length > 0\n && bracketGroupBy.join('.') !== configuredGroupBy.join('.');\n if (bothSpecifyDifferentGrouping) {\n return { ok: false, error: `Metric ${definition.name} has conflicting selector and groupBy declarations` };\n }\n const groupBy = configuredGroupBy.length > 0 ? configuredGroupBy : bracketGroupBy;\n\n const basicError = this.validateBasic(definition, parsedSelector.value.selector, groupBy);\n if (basicError !== null) {\n return { ok: false, error: basicError };\n }\n if (parsedSelector.value.wildcardUngrouped\n && definition.measurements.some((measurement) => measurement.kind !== 'count')) {\n return {\n ok: false,\n error: `Metric ${definition.name} uses [*] and may only declare count`,\n };\n }\n\n return {\n ok: true,\n value: Object.freeze({\n ...definition,\n selector: parsedSelector.value.selector,\n groupBy: Object.freeze([...groupBy]),\n resolutionsMs: Object.freeze([...definition.resolutionsMs].sort((left, right) => left - right)),\n measurements: Object.freeze([...definition.measurements]),\n targetIds: Object.freeze([...definition.targetIds]),\n cardinality: Object.freeze({ ...definition.cardinality }),\n }),\n };\n }\n\n matches(selector: string, label: string): boolean {\n const selectorSegments = selector.split('.');\n const labelSegments = label.split('.');\n return this.matchSegments(selectorSegments, labelSegments, 0, 0);\n }\n\n private parseSelector(selector: string): TelemetryResult<Readonly<{\n selector: string;\n groupBy: readonly string[];\n wildcardUngrouped: boolean;\n }>, string> {\n if (selector.startsWith('[')) {\n return { ok: false, error: 'A metric selector cannot omit its event label or glob' };\n }\n\n const bracketStart = selector.lastIndexOf('[');\n if (bracketStart < 0) {\n return { ok: true, value: { selector, groupBy: [], wildcardUngrouped: false } };\n }\n if (!selector.endsWith(']')) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n\n const eventSelector = selector.slice(0, bracketStart);\n const bracket = selector.slice(bracketStart + 1, -1).trim();\n if (!eventSelector || !bracket) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n return {\n ok: true,\n value: {\n selector: eventSelector,\n groupBy: bracket === '*' ? [] : [bracket],\n wildcardUngrouped: bracket === '*',\n },\n };\n }\n\n private validateBasic(\n definition: MetricDefinition,\n selector: string,\n groupBy: readonly string[],\n ): string | null {\n if (!/^[A-Za-z0-9_*][A-Za-z0-9_.:*\\-]*$/.test(selector)) {\n return `Metric ${definition.name} has an invalid selector`;\n }\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(definition.name)) {\n return `Metric name ${definition.name} is invalid`;\n }\n if (!Number.isInteger(definition.version) || definition.version <= 0) {\n return `Metric ${definition.name} must have a positive integer version`;\n }\n if (definition.measurements.length === 0) {\n return `Metric ${definition.name} must declare at least one measurement`;\n }\n const invalidResolution = definition.resolutionsMs.some(\n (resolution) => !Number.isInteger(resolution) || resolution <= 0,\n );\n const duplicateResolution = new Set(definition.resolutionsMs).size !== definition.resolutionsMs.length;\n if (invalidResolution || duplicateResolution || definition.resolutionsMs.length === 0) {\n return `Metric ${definition.name} has invalid or duplicate resolutions`;\n }\n const missingCardinality = groupBy.find((field) => definition.cardinality[field] === undefined);\n if (missingCardinality) {\n return `Metric ${definition.name} is missing cardinality policy for ${missingCardinality}`;\n }\n const invalidCardinality = Object.values(definition.cardinality).some(\n (rule) => !Number.isInteger(rule.maxValuesPerBucket) || rule.maxValuesPerBucket <= 0,\n );\n if (invalidCardinality) {\n return `Metric ${definition.name} has an invalid cardinality limit`;\n }\n return null;\n }\n\n private matchSegments(\n selector: readonly string[],\n label: readonly string[],\n selectorIndex: number,\n labelIndex: number,\n ): boolean {\n if (selectorIndex === selector.length) {\n return labelIndex === label.length;\n }\n const segment = selector[selectorIndex];\n if (segment === '**') {\n if (selectorIndex === selector.length - 1) {\n return true;\n }\n for (let next = labelIndex; next <= label.length; next += 1) {\n if (this.matchSegments(selector, label, selectorIndex + 1, next)) {\n return true;\n }\n }\n return false;\n }\n if (labelIndex >= label.length) {\n return false;\n }\n const segmentMatches = segment === '*' || segment === label[labelIndex];\n return segmentMatches\n && this.matchSegments(selector, label, selectorIndex + 1, labelIndex + 1);\n }\n}\n","const UTF8_ENCODER = new TextEncoder();\n\n/**\n * Canonical key order is UTF-8 byte order. This must stay byte-identical to\n * the native Rust collector, whose serde_json BTreeMap serialization sorts\n * object keys the same way; locale-aware comparisons (localeCompare) depend\n * on the ICU build and diverge from the Rust side, which invalidates every\n * cross-language checksum.\n */\nexport function compareCanonicalKeys(left: string, right: string): number {\n if (left === right) return 0;\n // Code-unit comparison equals UTF-8 byte order for ASCII-only keys.\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x7f]*$/.test(left) && /^[\\x00-\\x7f]*$/.test(right)) {\n return left < right ? -1 : 1;\n }\n const leftBytes = UTF8_ENCODER.encode(left);\n const rightBytes = UTF8_ENCODER.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = (leftBytes[index] ?? 0) - (rightBytes[index] ?? 0);\n if (difference !== 0) return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error('Canonical telemetry JSON cannot encode a non-finite number');\n }\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((item) => canonicalJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof value !== 'object') {\n throw new Error(`Canonical telemetry JSON cannot encode ${typeof value}`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => compareCanonicalKeys(left, right));\n const properties = entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);\n return `{${properties.join(',')}}`;\n}\n\nexport function telemetryUtf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function telemetryChecksum(value: unknown): string {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = BigInt.asUintN(64, hash * prime);\n }\n\n return hash.toString(16).padStart(16, '0');\n}\n","import { canonicalJson } from './helper/canonical_json.js';\nimport { MetricDefinitionContract } from './metric_definition_contract.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type {\n ExtractedMetricSample,\n MetricDefinition,\n MetricExtraction,\n MetricExtractionFailure,\n} from './types/metric.types.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\n\nexport class MetricExtractor {\n private readonly contract = new MetricDefinitionContract();\n\n constructor(private readonly definitions: readonly MetricDefinition[]) {}\n\n extract(envelopes: readonly TelemetryEnvelope[]): MetricExtraction {\n const samples: ExtractedMetricSample[] = [];\n const failures: MetricExtractionFailure[] = [];\n for (const envelope of envelopes) {\n for (const definition of this.definitions) {\n if (!this.contract.matches(definition.selector, envelope.label)) {\n continue;\n }\n const extracted = this.extractDefinition(definition, envelope);\n if (extracted.ok) {\n samples.push(extracted.sample);\n } else if (definition.missingField === 'record-failure') {\n failures.push({\n metricName: definition.name,\n definitionVersion: definition.version,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n reason: extracted.reason,\n });\n }\n }\n }\n return Object.freeze({\n samples: Object.freeze(samples),\n failures: Object.freeze(failures),\n });\n }\n\n private extractDefinition(\n definition: MetricDefinition,\n envelope: TelemetryEnvelope,\n ):\n | Readonly<{ ok: true; sample: ExtractedMetricSample }>\n | Readonly<{ ok: false; reason: string }> {\n const dimensions: Record<string, TelemetryJsonValue> = {};\n for (const field of definition.groupBy) {\n const dimension = this.readField(envelope, field);\n if (!this.isDimensionValue(dimension)) {\n return { ok: false, reason: `Missing or invalid dimension ${field}` };\n }\n dimensions[field] = dimension;\n }\n\n const values: Record<string, number> = { __count: 1 };\n for (const measurement of definition.measurements) {\n if (measurement.kind === 'count') {\n continue;\n }\n const measured = this.readField(envelope, measurement.field);\n if (typeof measured !== 'number' || !Number.isFinite(measured)) {\n return { ok: false, reason: `Missing or non-numeric measurement ${measurement.field}` };\n }\n values[measurement.field] = measured;\n }\n\n const frozenDimensions = Object.freeze(dimensions);\n return {\n ok: true,\n sample: Object.freeze({\n metricName: definition.name,\n definitionVersion: definition.version,\n occurredAtMs: envelope.occurredAtMs,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n dimensions: frozenDimensions,\n dimensionKey: canonicalJson(frozenDimensions),\n values: Object.freeze(values),\n targetIds: definition.targetIds,\n }),\n };\n }\n\n private readField(envelope: TelemetryEnvelope, path: string): TelemetryJsonValue | undefined {\n const topLevel = this.readTopLevel(envelope, path);\n if (topLevel !== undefined) {\n return topLevel;\n }\n const segments = path.split('.');\n let current: TelemetryJsonValue = envelope.metadata;\n for (const segment of segments) {\n if (!this.isJsonObject(current)) {\n return undefined;\n }\n const nextValue: TelemetryJsonValue | undefined = current[segment];\n if (nextValue === undefined) {\n return undefined;\n }\n current = nextValue;\n }\n return current;\n }\n\n private readTopLevel(envelope: TelemetryEnvelope, path: string): TelemetryJsonValue | undefined {\n switch (path) {\n case 'conversationId':\n return envelope.conversationId;\n case 'correlationId':\n return envelope.correlationId;\n case 'source':\n return envelope.source;\n case 'processKind':\n return envelope.processKind;\n case 'level':\n return envelope.level;\n case 'label':\n return envelope.label;\n case 'producerId':\n return envelope.producerId;\n default:\n return undefined;\n }\n }\n\n private isDimensionValue(value: TelemetryJsonValue | undefined): value is string | number | boolean | null {\n return value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n}\n","import type { TelemetryAdmissionPolicy } from '../types/client.types.js';\nimport type { MetadataSnapshotLimits } from '../types/metadata.types.js';\nimport type { TelemetryBatchValidationLimits } from '../types/transport.types.js';\n\nexport const DEFAULT_TELEMETRY_ADMISSION_POLICY: TelemetryAdmissionPolicy = Object.freeze({\n maxQueuedEvents: 2_000,\n maxQueuedBytes: 2_000_000,\n maxBatchEvents: 128,\n maxBatchBytes: 256_000,\n maxInFlightBatches: 1,\n retryLimit: 3,\n retryBaseDelayMs: 25,\n sampleRates: Object.freeze({\n low: 1,\n normal: 1,\n high: 1,\n }),\n});\n\nexport const DEFAULT_METADATA_SNAPSHOT_LIMITS: MetadataSnapshotLimits = Object.freeze({\n maxBytes: 32_768,\n maxDepth: 8,\n maxProperties: 256,\n maxArrayLength: 128,\n maxStringLength: 4_096,\n maxErrorStackLength: 8_192,\n redactions: Object.freeze([]),\n});\n\nexport const DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS: TelemetryBatchValidationLimits = Object.freeze({\n maxBatchEvents: 1_024,\n maxBatchBytes: 1_000_000,\n maxEventBytes: 256_000,\n maxMetadataBytes: 131_072,\n maxMetadataDepth: 16,\n maxMetadataProperties: 1_024,\n maxMetadataArrayLength: 1_024,\n maxMetadataStringBytes: 65_536,\n maxDropCounters: 15,\n maxIdentityBytes: 1_024,\n});\n","import {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from './helper/canonical_json.js';\nimport { DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS } from './helper/client_defaults.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryBatch,\n TelemetryBatchValidationLimits,\n TelemetryDropCounter,\n} from './types/transport.types.js';\n\nconst BATCH_KEYS = Object.freeze([\n 'schemaVersion',\n 'producerId',\n 'sequenceStart',\n 'sequenceEnd',\n 'idempotencyKey',\n 'checksum',\n 'envelopes',\n 'dropCounters',\n]);\n\nconst ENVELOPE_KEYS = Object.freeze([\n 'schemaVersion',\n 'eventId',\n 'producerId',\n 'sequence',\n 'occurredAtMs',\n 'monotonicNs',\n 'source',\n 'processKind',\n 'level',\n 'label',\n 'conversationId',\n 'correlationId',\n 'metadata',\n]);\n\nconst DROP_COUNTER_KEYS = Object.freeze(['reason', 'priority', 'count']);\nconst DROP_REASONS = new Set(['capacity', 'sampled', 'stopped', 'invalid', 'transport']);\nconst DROP_PRIORITIES = new Set(['low', 'normal', 'high']);\n\ntype JsonValidationState = {\n properties: number;\n bytes: number;\n active: WeakSet<object>;\n};\n\nexport class TelemetryBatchContract {\n static readonly schemaVersion = 1;\n static readonly checksumAlgorithm = 'fnv1a64-canonical-json-v1';\n readonly limits: TelemetryBatchValidationLimits;\n\n constructor(limits: Partial<TelemetryBatchValidationLimits> = {}) {\n this.limits = Object.freeze({\n ...DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS,\n ...limits,\n });\n this.validateLimits();\n }\n\n create(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.createChecked(envelopes, dropCounters);\n } catch {\n return { ok: false, error: 'Telemetry batch creation failed safe validation' };\n }\n }\n\n validate(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.validateChecked(batch);\n } catch {\n return { ok: false, error: 'Telemetry batch validation failed safely' };\n }\n }\n\n private createChecked(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n const payloadError = this.validatePayload(envelopes, dropCounters);\n if (payloadError !== null) {\n return { ok: false, error: payloadError };\n }\n const payloadBytesError = this.payloadBytesError(envelopes, dropCounters);\n if (payloadBytesError !== null) {\n return { ok: false, error: payloadBytesError };\n }\n\n const first = envelopes[0];\n const last = envelopes[envelopes.length - 1];\n if (!first || !last) {\n return { ok: false, error: 'A telemetry batch must contain a first and last envelope' };\n }\n\n const producerId = first.producerId;\n const sequenceStart = first.sequence;\n const sequenceEnd = last.sequence;\n const checksumPayload = this.checksumPayload(\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n );\n const checksum = telemetryChecksum(checksumPayload);\n const idempotencyKey = `tb1:${producerId}:${sequenceStart}-${sequenceEnd}:${checksum}`;\n const batch = Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n idempotencyKey,\n checksum,\n envelopes: Object.freeze([...envelopes]),\n dropCounters: Object.freeze([...dropCounters]),\n });\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const byteError = this.serializedByteError(batch, this.limits.maxBatchBytes, 'batch');\n return byteError === null\n ? { ok: true, value: this.detachBatch(batch) }\n : { ok: false, error: byteError };\n }\n\n private validateChecked(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n if (!this.isRecord(batch)) {\n return { ok: false, error: 'Telemetry batch must be a plain object' };\n }\n const schemaVersion = batch.schemaVersion;\n if (!Number.isSafeInteger(schemaVersion)) {\n return { ok: false, error: 'Telemetry batch schema version must be a safe integer' };\n }\n if (schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return { ok: false, error: `Unsupported telemetry schema version ${String(schemaVersion)}` };\n }\n if (!this.hasExactKeys(batch, BATCH_KEYS)) {\n return { ok: false, error: 'Telemetry batch fields do not match the schema' };\n }\n\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const recreated = this.create(\n batch.envelopes as readonly TelemetryEnvelope[],\n batch.dropCounters as readonly TelemetryDropCounter[],\n );\n if (!recreated.ok) {\n return recreated;\n }\n const identityError = this.compareFraming(batch, recreated.value);\n return identityError === null\n ? { ok: true, value: recreated.value }\n : { ok: false, error: identityError };\n }\n\n private validatePayload(envelopes: unknown, dropCounters: unknown): string | null {\n if (!Array.isArray(envelopes) || envelopes.length === 0) {\n return 'A telemetry batch must contain at least one envelope';\n }\n if (envelopes.length > this.limits.maxBatchEvents) {\n return `Telemetry batch exceeds ${this.limits.maxBatchEvents} envelopes`;\n }\n const envelopeError = this.validateEnvelopes(envelopes);\n return envelopeError ?? this.validateDropCounters(dropCounters);\n }\n\n private validateEnvelopes(envelopes: readonly unknown[]): string | null {\n let previousSequence = -1;\n let producerId: string | null = null;\n for (const envelope of envelopes) {\n const envelopeError = this.validateEnvelope(envelope, producerId, previousSequence);\n if (envelopeError !== null) {\n return envelopeError;\n }\n const typedEnvelope = envelope as TelemetryEnvelope;\n producerId = typedEnvelope.producerId;\n previousSequence = typedEnvelope.sequence;\n }\n return null;\n }\n\n private validateEnvelope(\n envelope: unknown,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (!this.isRecord(envelope) || !this.hasExactKeys(envelope, ENVELOPE_KEYS)) {\n return 'Telemetry envelope fields do not match the schema';\n }\n const identityError = this.validateEnvelopeIdentity(envelope, expectedProducerId, previousSequence);\n if (identityError !== null) {\n return identityError;\n }\n const valueError = this.validateEnvelopeValues(envelope);\n if (valueError !== null) {\n return valueError;\n }\n const metadataError = this.validateMetadata(envelope.metadata);\n return metadataError ?? this.serializedByteError(envelope, this.limits.maxEventBytes, 'event');\n }\n\n private validateEnvelopeIdentity(\n envelope: Record<string, unknown>,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (envelope.schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return 'Telemetry envelope schema version does not match its batch';\n }\n if (!this.isIdentity(envelope.producerId)) {\n return 'Telemetry envelope producer identity is invalid';\n }\n if (!this.isSequence(envelope.sequence) || envelope.sequence <= previousSequence) {\n return 'Telemetry envelope sequences must be nonnegative safe integers in increasing order';\n }\n if (expectedProducerId !== null && envelope.producerId !== expectedProducerId) {\n return 'A telemetry batch cannot mix producer identities';\n }\n const eventId = `${envelope.producerId}:${envelope.sequence}`;\n if (envelope.eventId !== eventId || telemetryUtf8Length(eventId) > this.limits.maxIdentityBytes) {\n return 'Telemetry envelope event identity is invalid';\n }\n return null;\n }\n\n private validateEnvelopeValues(envelope: Record<string, unknown>): string | null {\n if (!Number.isSafeInteger(envelope.occurredAtMs) || Number(envelope.occurredAtMs) < 0) {\n return 'Telemetry envelope occurredAtMs must be a nonnegative safe integer';\n }\n if (!this.isMonotonicTimestamp(envelope.monotonicNs)) {\n return 'Telemetry envelope monotonicNs is invalid';\n }\n if (!this.isIdentity(envelope.source) || !this.isIdentity(envelope.processKind)) {\n return 'Telemetry envelope source and process kind are invalid';\n }\n if (!this.isIdentity(envelope.level)) {\n return 'Telemetry envelope level is invalid';\n }\n if (!this.isLabel(envelope.label)) {\n return 'Telemetry envelope label is invalid';\n }\n if (!this.isConversationId(envelope.conversationId)) {\n return 'Telemetry envelope conversation identity is invalid';\n }\n if (!this.isOptionalBoundedString(envelope.correlationId)) {\n return 'Telemetry envelope correlation identity is invalid';\n }\n return null;\n }\n\n private validateMetadata(metadata: unknown): string | null {\n if (!this.isRecord(metadata)) {\n return 'Telemetry envelope metadata must be a plain JSON object';\n }\n const state: JsonValidationState = { properties: 0, bytes: 0, active: new WeakSet<object>() };\n const jsonError = this.validateJsonValue(metadata, 0, state);\n return jsonError ?? this.serializedByteError(metadata, this.limits.maxMetadataBytes, 'metadata');\n }\n\n private validateJsonValue(value: unknown, depth: number, state: JsonValidationState): string | null {\n if (value === null || typeof value === 'boolean') {\n state.bytes += value === null ? 4 : 5;\n return null;\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n return 'Telemetry metadata contains a non-finite number';\n }\n state.bytes += String(value).length;\n return this.metadataBudgetError(state);\n }\n if (typeof value === 'string') {\n if (!this.isWithinUtf8Limit(value, this.limits.maxMetadataStringBytes)) {\n return 'Telemetry metadata string exceeds the receiver limit';\n }\n state.bytes += telemetryUtf8Length(value);\n return this.metadataBudgetError(state);\n }\n if (typeof value !== 'object') {\n return 'Telemetry metadata contains a non-JSON value';\n }\n if (depth > this.limits.maxMetadataDepth) {\n return 'Telemetry metadata exceeds the receiver depth limit';\n }\n return Array.isArray(value)\n ? this.validateJsonArray(value, depth, state)\n : this.validateJsonObject(value, depth, state);\n }\n\n private validateJsonArray(value: readonly unknown[], depth: number, state: JsonValidationState): string | null {\n if (value.length > this.limits.maxMetadataArrayLength) {\n return 'Telemetry metadata array exceeds the receiver length limit';\n }\n const keys = Object.keys(value);\n if (keys.length !== value.length || Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata arrays must be dense JSON arrays';\n }\n return this.validateJsonChildren(value, value, depth, state);\n }\n\n private validateJsonObject(value: object, depth: number, state: JsonValidationState): string | null {\n if (!this.isRecord(value)) {\n return 'Telemetry metadata contains a non-plain object';\n }\n const keys = Object.keys(value);\n if (Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata objects cannot contain symbol keys';\n }\n state.properties += keys.length;\n if (state.properties > this.limits.maxMetadataProperties) {\n return 'Telemetry metadata exceeds the receiver property limit';\n }\n if (keys.some((key) => !this.isWithinUtf8Limit(key, this.limits.maxMetadataStringBytes))) {\n return 'Telemetry metadata property name exceeds the receiver string limit';\n }\n for (const key of keys) {\n state.bytes += telemetryUtf8Length(key);\n }\n const budgetError = this.metadataBudgetError(state);\n if (budgetError !== null) {\n return budgetError;\n }\n return this.validateJsonChildren(value, keys.map((key) => Reflect.get(value, key)), depth, state);\n }\n\n private validateJsonChildren(\n owner: object,\n values: readonly unknown[],\n depth: number,\n state: JsonValidationState,\n ): string | null {\n if (state.active.has(owner)) {\n return 'Telemetry metadata cannot contain a cycle';\n }\n state.active.add(owner);\n try {\n for (const value of values) {\n const error = this.validateJsonValue(value, depth + 1, state);\n if (error !== null) {\n return error;\n }\n }\n return null;\n } finally {\n state.active.delete(owner);\n }\n }\n\n private validateDropCounters(dropCounters: unknown): string | null {\n if (!Array.isArray(dropCounters) || dropCounters.length > this.limits.maxDropCounters) {\n return 'Telemetry drop counters exceed the fixed receiver limit';\n }\n const identities = new Set<string>();\n let total = 0;\n for (const counter of dropCounters) {\n const error = this.validateDropCounter(counter, identities, total);\n if (error !== null) {\n return error;\n }\n total += (counter as TelemetryDropCounter).count;\n }\n return null;\n }\n\n private validateDropCounter(\n counter: unknown,\n identities: Set<string>,\n currentTotal: number,\n ): string | null {\n if (!this.isRecord(counter) || !this.hasExactKeys(counter, DROP_COUNTER_KEYS)) {\n return 'Telemetry drop counter fields do not match the schema';\n }\n if (!DROP_REASONS.has(String(counter.reason)) || !DROP_PRIORITIES.has(String(counter.priority))) {\n return 'Telemetry drop counter identity is invalid';\n }\n if (!Number.isSafeInteger(counter.count) || Number(counter.count) <= 0) {\n return 'Telemetry drop counter count must be a positive safe integer';\n }\n if (currentTotal > Number.MAX_SAFE_INTEGER - Number(counter.count)) {\n return 'Telemetry drop counter total exceeds the safe integer range';\n }\n const identity = `${counter.reason}:${counter.priority}`;\n if (identities.has(identity)) {\n return 'Telemetry drop counter identities must be unique within a batch';\n }\n identities.add(identity);\n return null;\n }\n\n private validateFraming(batch: Record<string, unknown>): string | null {\n if (!this.isIdentity(batch.producerId)) {\n return 'Telemetry batch producer identity is invalid';\n }\n if (!this.isSequence(batch.sequenceStart) || !this.isSequence(batch.sequenceEnd)) {\n return 'Telemetry batch sequence range must use nonnegative safe integers';\n }\n if (Number(batch.sequenceEnd) < Number(batch.sequenceStart)) {\n return 'Telemetry batch sequence range is reversed';\n }\n if (typeof batch.checksum !== 'string' || !/^[a-f0-9]{16}$/.test(batch.checksum)) {\n return 'Telemetry batch checksum is invalid';\n }\n if (typeof batch.idempotencyKey !== 'string'\n || !this.isWithinUtf8Limit(batch.idempotencyKey, this.limits.maxIdentityBytes)) {\n return 'Telemetry batch idempotency identity is invalid';\n }\n return null;\n }\n\n private compareFraming(batch: Record<string, unknown>, recreated: TelemetryBatch): string | null {\n const matches = recreated.checksum === batch.checksum\n && recreated.idempotencyKey === batch.idempotencyKey\n && recreated.sequenceStart === batch.sequenceStart\n && recreated.sequenceEnd === batch.sequenceEnd\n && recreated.producerId === batch.producerId;\n return matches ? null : 'Telemetry batch framing or checksum is invalid';\n }\n\n private checksumPayload(\n producerId: string,\n sequenceStart: number,\n sequenceEnd: number,\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): object {\n return {\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n };\n }\n\n private serializedByteError(value: unknown, maximum: number, kind: string): string | null {\n const bytes = telemetryUtf8Length(canonicalJson(value));\n return bytes <= maximum ? null : `Telemetry ${kind} exceeds ${maximum} bytes`;\n }\n\n private payloadBytesError(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): string | null {\n let bytes = 0;\n for (const envelope of envelopes) {\n bytes += telemetryUtf8Length(canonicalJson(envelope));\n if (bytes > this.limits.maxBatchBytes) {\n return `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`;\n }\n }\n bytes += telemetryUtf8Length(canonicalJson(dropCounters));\n return bytes > this.limits.maxBatchBytes\n ? `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`\n : null;\n }\n\n private metadataBudgetError(state: JsonValidationState): string | null {\n return state.bytes > this.limits.maxMetadataBytes\n ? `Telemetry metadata exceeds ${this.limits.maxMetadataBytes} bytes`\n : null;\n }\n\n private detachBatch(batch: TelemetryBatch): TelemetryBatch {\n const detached = JSON.parse(canonicalJson(batch)) as TelemetryBatch;\n return this.deepFreeze(detached);\n }\n\n private deepFreeze<T>(value: T): T {\n if (typeof value !== 'object' || value === null || Object.isFrozen(value)) {\n return value;\n }\n for (const child of Object.values(value)) {\n this.deepFreeze(child);\n }\n return Object.freeze(value);\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value) as { constructor?: { name?: unknown } } | null;\n return prototype === null || prototype.constructor?.name === 'Object';\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isSequence(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) >= 0;\n }\n\n private isIdentity(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && value.trim().length > 0\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value);\n }\n\n private isLabel(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= Math.min(256, this.limits.maxIdentityBytes)\n && /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(value)\n && this.isWithinUtf8Limit(value, Math.min(256, this.limits.maxIdentityBytes));\n }\n\n private isMonotonicTimestamp(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && /^\\d+$/.test(value)\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes));\n }\n\n private isConversationId(value: unknown): boolean {\n return value === null\n || (typeof value === 'number' && Number.isSafeInteger(value))\n || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isOptionalBoundedString(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isWithinUtf8Limit(value: string, maximum: number): boolean {\n return value.length <= maximum && telemetryUtf8Length(value) <= maximum;\n }\n\n private validateLimits(): void {\n const values = Object.values(this.limits);\n if (values.some((value) => !Number.isSafeInteger(value) || value <= 0)) {\n throw new Error('Telemetry batch validation limits must be positive safe integers');\n }\n if (this.limits.maxMetadataBytes > this.limits.maxEventBytes\n || this.limits.maxEventBytes > this.limits.maxBatchBytes) {\n throw new Error('Telemetry receiver byte limits must satisfy metadata <= event <= batch');\n }\n }\n}\n","export type TelemetryDeadlineOutcome<T> =\n | Readonly<{ kind: 'completed'; value: T }>\n | Readonly<{ kind: 'failed'; error: unknown }>\n | Readonly<{ kind: 'deadline-exhausted' }>;\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nexport class TelemetryDeadlineGuard {\n async settle<T>(\n operation: Promise<T>,\n deadlineMs: number,\n now: () => number,\n ): Promise<TelemetryDeadlineOutcome<T>> {\n const observed: Promise<TelemetryDeadlineOutcome<T>> = operation.then(\n (value) => ({ kind: 'completed', value }),\n (error: unknown) => ({ kind: 'failed', error }),\n );\n const remainingMs = deadlineMs - now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n return { kind: 'deadline-exhausted' };\n }\n let timer: ReturnType<typeof setTimeout> | null = null;\n const outcome = await Promise.race([\n observed,\n new Promise<TelemetryDeadlineOutcome<T>>((resolve) => {\n timer = setTimeout(\n () => resolve({ kind: 'deadline-exhausted' }),\n Math.min(remainingMs, MAX_TIMER_DELAY_MS),\n );\n }),\n ]);\n if (timer !== null) {\n clearTimeout(timer);\n }\n return outcome;\n }\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryTargetDeliveryState,\n} from './types/transport.types.js';\n\nconst MAX_TARGET_STATES = 1_024;\nconst MAX_TARGET_ID_BYTES = 256;\nconst MAX_REASON_BYTES = 512;\n\nexport class TelemetryAcknowledgementContract {\n exceptionReason(cause: unknown): string {\n try {\n const value = cause instanceof Error ? cause.message : cause;\n return this.truncateReason(String(value));\n } catch {\n return 'Unknown telemetry transport failure';\n }\n }\n\n validateAndDetach(\n batch: TelemetryBatch,\n value: unknown,\n ): TelemetryResult<TelemetryAcknowledgement, string> {\n try {\n const initialError = this.acknowledgementError(batch, value);\n if (initialError !== null) {\n return { ok: false, error: initialError };\n }\n const detached: unknown = JSON.parse(canonicalJson(value));\n const detachedError = this.acknowledgementError(batch, detached);\n if (detachedError !== null) {\n return { ok: false, error: detachedError };\n }\n return { ok: true, value: this.freezeAcknowledgement(detached as TelemetryAcknowledgement) };\n } catch {\n return { ok: false, error: 'acknowledgement could not be inspected' };\n }\n }\n\n private acknowledgementError(batch: TelemetryBatch, value: unknown): string | null {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return 'acknowledgement identity is missing or mismatched';\n }\n const targetsError = this.targetStatesError(value.targetStates);\n if (targetsError !== null) {\n return targetsError;\n }\n switch (value.kind) {\n case 'committed':\n return this.committedAcknowledgementError(batch, value);\n case 'retryable':\n return this.retryableAcknowledgementError(value);\n case 'rejected':\n return this.rejectedAcknowledgementError(value);\n case 'conflict':\n return this.conflictAcknowledgementError(value);\n default:\n return 'acknowledgement kind is invalid';\n }\n }\n\n private committedAcknowledgementError(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])\n && Number.isSafeInteger(value.committedAtMs)\n && Number(value.committedAtMs) >= 0\n && value.acceptedEvents === batch.envelopes.length\n && typeof value.duplicate === 'boolean';\n return valid ? null : 'committed acknowledgement fields are invalid';\n }\n\n private retryableAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])\n && this.isBoundedReason(value.reason)\n && Number.isFinite(value.retryAfterMs)\n && Number(value.retryAfterMs) >= 0\n && Number(value.retryAfterMs) <= Number.MAX_SAFE_INTEGER;\n return valid ? null : 'retryable acknowledgement fields are invalid';\n }\n\n private rejectedAcknowledgementError(value: Record<string, unknown>): string | null {\n const codes = ['invalid-batch', 'unsupported-version', 'no-required-terminal', 'closed'];\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])\n && codes.includes(String(value.code))\n && this.isBoundedReason(value.reason);\n return valid ? null : 'rejected acknowledgement fields are invalid';\n }\n\n private conflictAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])\n && this.isBoundedReason(value.reason);\n return valid ? null : 'conflict acknowledgement fields are invalid';\n }\n\n private targetStatesError(value: unknown): string | null {\n if (!Array.isArray(value)\n || value.length > MAX_TARGET_STATES\n || !this.hasExactArrayIndexes(value)) {\n return 'acknowledgement target states are invalid';\n }\n const targetIds = new Set<string>();\n for (const target of value) {\n if (!this.isValidTargetState(target) || targetIds.has(target.targetId)) {\n return 'acknowledgement target states are invalid';\n }\n targetIds.add(target.targetId);\n }\n return null;\n }\n\n private isValidTargetState(value: unknown): value is Record<string, unknown> & TelemetryTargetDeliveryState {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return false;\n }\n const deliveries = ['required', 'best-effort'];\n const states = ['pending', 'committed', 'failed', 'abandoned'];\n return typeof value.targetId === 'string'\n && value.targetId.length > 0\n && telemetryUtf8Length(value.targetId) <= MAX_TARGET_ID_BYTES\n && deliveries.includes(String(value.delivery))\n && states.includes(String(value.state))\n && Number.isSafeInteger(value.attempts)\n && Number(value.attempts) >= 0\n && (value.reason === null || this.isBoundedReason(value.reason));\n }\n\n private freezeAcknowledgement(value: TelemetryAcknowledgement): TelemetryAcknowledgement {\n const targetStates = value.targetStates.map((target) => Object.freeze({ ...target }));\n return Object.freeze({ ...value, targetStates: Object.freeze(targetStates) });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Reflect.ownKeys(value);\n return keys.length === expected.length\n && keys.every((key) => typeof key === 'string' && expected.includes(key));\n }\n\n private hasExactArrayIndexes(value: readonly unknown[]): boolean {\n const keys = Reflect.ownKeys(value);\n if (keys.length !== value.length + 1 || !keys.includes('length')) {\n return false;\n }\n return value.every((_item, index) => keys.includes(String(index)));\n }\n\n private isBoundedReason(value: unknown): value is string {\n return typeof value === 'string' && telemetryUtf8Length(value) <= MAX_REASON_BYTES;\n }\n\n private truncateReason(value: string): string {\n const encoded = new TextEncoder().encode(value);\n if (encoded.length <= MAX_REASON_BYTES) {\n return value;\n }\n const decoder = new TextDecoder('utf-8', { fatal: true });\n for (let length = MAX_REASON_BYTES; length > 0; length -= 1) {\n try {\n return decoder.decode(encoded.subarray(0, length));\n } catch {\n // At most three trailing continuation bytes need to be removed.\n }\n }\n return '';\n }\n}\n","import { TelemetryDeadlineGuard } from './helper/telemetry_deadline_guard.js';\nimport { TelemetryAcknowledgementContract } from './telemetry_acknowledgement_contract.js';\nimport type { MetricDefinition } from './types/metric.types.js';\nimport type { MetricQuery, MetricQueryResponse, TelemetryQueryError, TimelineQuery, TimelineQueryResponse } from './types/query.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageRouterOptions,\n TelemetryStorageTransport,\n TelemetryStorageTarget,\n} from './types/storage.types.js';\nimport type { TelemetryAcknowledgement, TelemetryTargetDeliveryState } from './types/transport.types.js';\n\ntype StorageTargetResult = Readonly<{\n target: TelemetryStorageTarget;\n acknowledgement: TelemetryAcknowledgement;\n attempts: number;\n}>;\n\ntype RollbackTargetResult = Readonly<{\n targetId: string;\n error: string | null;\n}>;\n\nconst START_ROLLBACK_TIMEOUT_MS = 5_000;\n\nexport class TelemetryStorageRouter implements TelemetryStorageTransport {\n readonly targetId: string;\n readonly capabilities: TelemetryStorageCapabilities;\n private readonly acknowledgementContract = new TelemetryAcknowledgementContract();\n private readonly deadlineGuard = new TelemetryDeadlineGuard();\n private readonly committed = new Map<string, Set<string>>();\n private readonly definitionTargets = new Map<string, readonly string[]>();\n private state: StorageTargetStatus['state'] = 'created';\n private detail: string | null = null;\n\n constructor(private readonly options: TelemetryStorageRouterOptions) {\n this.targetId = options.routerId;\n this.validateOptions();\n this.capabilities = Object.freeze({\n rawPersistence: options.targets.every((target) => target.transport.capabilities.rawPersistence),\n metricSamples: options.targets.every((target) => target.transport.capabilities.metricSamples),\n rollups: options.targets.some((target) => target.transport.capabilities.rollups),\n queries: options.targets.some((target) => target.transport.capabilities.queries),\n retention: options.targets.some((target) => target.transport.capabilities.retention),\n maintenance: options.targets.some((target) => target.transport.capabilities.maintenance),\n });\n }\n\n async start(definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n return { ok: false, error: `Cannot start telemetry storage router from state ${this.state}` };\n }\n this.state = 'starting';\n this.detail = null;\n this.definitionTargets.clear();\n for (const definition of definitions) {\n this.definitionTargets.set(\n `${definition.name}:${definition.version}`,\n Object.freeze([...definition.targetIds]),\n );\n }\n const attemptedTargets: TelemetryStorageTarget[] = [];\n const bestEffortFailures: string[] = [];\n for (const target of this.options.targets) {\n attemptedTargets.push(target);\n const targetDefinitions = definitions.filter((definition) => {\n return definition.targetIds.length === 0 || definition.targetIds.includes(target.targetId);\n });\n const started = await this.startTarget(target, targetDefinitions);\n if (started.ok) {\n continue;\n }\n const failure = `${target.targetId}: ${started.error}`;\n if (target.delivery === 'required') {\n await this.rollbackAttemptedTargets(attemptedTargets, failure);\n return { ok: false, error: failure };\n }\n bestEffortFailures.push(failure);\n }\n this.state = 'ready';\n this.detail = bestEffortFailures.length > 0\n ? `Best-effort target startup failures: ${bestEffortFailures.join('; ')}`\n : null;\n return { ok: true, value: undefined };\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n const matchingTargets = this.options.targets.filter((target) => target.matches(request.batch));\n const hasRequiredTarget = matchingTargets.some((target) => target.delivery === 'required');\n if (!hasRequiredTarget && !this.options.volatile) {\n return {\n kind: 'rejected',\n idempotencyKey: request.batch.idempotencyKey,\n code: 'no-required-terminal',\n reason: 'No required storage target matched this batch',\n targetStates: this.unmatchedStates(matchingTargets),\n };\n }\n\n const committedTargets = this.committed.get(request.batch.idempotencyKey) ?? new Set<string>();\n const targetResults = await this.persistMatchingTargets(request, matchingTargets, committedTargets);\n this.remember(request.batch.idempotencyKey, committedTargets);\n return this.aggregateAcknowledgement(request, matchingTargets, targetResults);\n }\n\n async timeline(query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n const target = this.resolveQueryTarget(query.targetId);\n if (!target.ok) {\n return target;\n }\n return target.value.transport.timeline(Object.freeze({ ...query, targetId: target.value.targetId }));\n }\n\n async metrics(query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n const target = this.resolveQueryTarget(query.targetId);\n if (!target.ok) {\n return target;\n }\n return target.value.transport.metrics(Object.freeze({ ...query, targetId: target.value.targetId }));\n }\n\n async materializeRollups(nowMs: number, maxWorkMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('rollup', (target) => target.materializeRollups(nowMs, maxWorkMs));\n }\n\n async enforceRetention(nowMs: number, shouldContinue?: () => boolean): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('retention', (target) => target.enforceRetention(nowMs, shouldContinue));\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('checkpoint', (target) => target.checkpoint());\n }\n\n async reclaim(maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('reclaim', (target) => target.reclaim(maxPages));\n }\n\n async compact(deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('compaction', (target) => target.compact(deadlineMs));\n }\n\n status(): StorageTargetStatus {\n const states = this.options.targets.map((target) => target.transport.status());\n const requiredIds = new Set(this.options.targets\n .filter((target) => target.delivery === 'required')\n .map((target) => target.targetId));\n const failedRequired = states.find((state) => {\n return requiredIds.has(state.targetId) && state.state === 'failed';\n });\n return {\n targetId: this.targetId,\n state: failedRequired ? 'failed' : this.state,\n detail: this.state === 'failed' ? this.detail : failedRequired?.detail ?? this.detail,\n writerLeaseHeld: states.some((state) => state.writerLeaseHeld),\n };\n }\n\n async stop(deadlineMs: number): Promise<void> {\n const operations = this.options.targets.map((target) => {\n return Promise.resolve().then(() => target.transport.stop(deadlineMs));\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.allSettled(operations),\n deadlineMs,\n this.options.now,\n );\n if (outcome.kind === 'deadline-exhausted') {\n this.state = 'failed';\n this.detail = 'Telemetry storage router stop deadline exceeded';\n return;\n }\n if (outcome.kind === 'failed') {\n this.state = 'failed';\n this.detail = `Telemetry storage router stop failed: ${this.errorMessage(outcome.error)}`;\n throw outcome.error;\n }\n const failed = outcome.value.find((result): result is PromiseRejectedResult => result.status === 'rejected');\n if (failed) {\n this.state = 'failed';\n this.detail = `Telemetry storage router stop failed: ${this.errorMessage(failed.reason)}`;\n throw failed.reason;\n }\n this.state = 'stopped';\n this.detail = null;\n }\n\n targetStatuses(): readonly StorageTargetStatus[] {\n return this.options.targets.map((target) => target.transport.status());\n }\n\n private async startTarget(\n target: TelemetryStorageTarget,\n definitions: readonly MetricDefinition[],\n ): Promise<TelemetryResult<void, string>> {\n try {\n return await target.transport.start(definitions);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private async rollbackAttemptedTargets(\n attemptedTargets: readonly TelemetryStorageTarget[],\n primaryFailure: string,\n ): Promise<void> {\n const deadlineMs = this.options.now() + START_ROLLBACK_TIMEOUT_MS;\n const rollbackTargets = [...attemptedTargets].reverse();\n const settled = new Map<string, RollbackTargetResult>();\n const operations = rollbackTargets.map(async (target) => {\n const result = await this.stopRollbackTarget(target, deadlineMs);\n settled.set(target.targetId, result);\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.all(operations),\n deadlineMs,\n this.options.now,\n );\n const timedOut = outcome.kind === 'deadline-exhausted';\n const cleanupFailures = rollbackTargets.flatMap((target) => {\n const result = settled.get(target.targetId);\n if (result === undefined) {\n return timedOut ? [`${target.targetId}: rollback deadline exceeded`] : [];\n }\n return result.error === null ? [] : [`${target.targetId}: ${result.error}`];\n });\n this.state = 'failed';\n this.detail = cleanupFailures.length > 0\n ? `${primaryFailure}; rollback cleanup failures: ${cleanupFailures.join('; ')}`\n : primaryFailure;\n }\n\n private async stopRollbackTarget(\n target: TelemetryStorageTarget,\n deadlineMs: number,\n ): Promise<RollbackTargetResult> {\n try {\n await target.transport.stop(deadlineMs);\n return { targetId: target.targetId, error: null };\n } catch (cause) {\n return { targetId: target.targetId, error: this.errorMessage(cause) };\n }\n }\n\n private async persistMatchingTargets(\n request: StoragePersistRequest,\n targets: readonly TelemetryStorageTarget[],\n committedTargets: Set<string>,\n ): Promise<readonly StorageTargetResult[]> {\n return Promise.all(targets.map(async (target): Promise<StorageTargetResult> => {\n if (committedTargets.has(target.targetId)) {\n return { target, acknowledgement: this.alreadyCommitted(request), attempts: 0 };\n }\n const targetRequest = this.requestForTarget(request, target.targetId);\n const acknowledgement = await this.persistSafely(target, targetRequest);\n if (acknowledgement.kind === 'committed') {\n committedTargets.add(target.targetId);\n }\n return { target, acknowledgement, attempts: 1 };\n }));\n }\n\n private aggregateAcknowledgement(\n request: StoragePersistRequest,\n matchingTargets: readonly TelemetryStorageTarget[],\n targetResults: readonly StorageTargetResult[],\n ): TelemetryAcknowledgement {\n const targetStates = this.deliveryStates(targetResults, matchingTargets);\n const requiredResults = targetResults.filter(({ target }) => target.delivery === 'required');\n const conflict = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'conflict');\n const conflictAcknowledgement = conflict?.acknowledgement;\n if (conflictAcknowledgement?.kind === 'conflict') {\n return {\n kind: 'conflict',\n idempotencyKey: request.batch.idempotencyKey,\n reason: conflictAcknowledgement.reason,\n targetStates,\n };\n }\n const rejected = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'rejected');\n const rejectedAcknowledgement = rejected?.acknowledgement;\n if (rejectedAcknowledgement?.kind === 'rejected') {\n return {\n kind: 'rejected',\n idempotencyKey: request.batch.idempotencyKey,\n code: rejectedAcknowledgement.code,\n reason: rejectedAcknowledgement.reason,\n targetStates,\n };\n }\n const retryable = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'retryable');\n const retryableAcknowledgement = retryable?.acknowledgement;\n if (retryableAcknowledgement?.kind === 'retryable') {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: retryableAcknowledgement.reason,\n retryAfterMs: retryableAcknowledgement.retryAfterMs,\n targetStates,\n };\n }\n\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: targetResults.length > 0 && targetResults.every(({ attempts }) => attempts === 0),\n targetStates,\n };\n }\n\n private deliveryStates(\n targetResults: readonly StorageTargetResult[],\n matchingTargets: readonly TelemetryStorageTarget[],\n ): readonly TelemetryTargetDeliveryState[] {\n return [\n ...targetResults.map(({ target, acknowledgement, attempts }) => this.deliveryState(\n target,\n acknowledgement,\n attempts,\n )),\n ...this.unmatchedStates(matchingTargets),\n ];\n }\n\n private requestForTarget(request: StoragePersistRequest, targetId: string): StoragePersistRequest {\n const samples = request.samples.filter((sample) => {\n return sample.targetIds.length === 0 || sample.targetIds.includes(targetId);\n });\n const extractionFailures = request.extractionFailures.filter((failure) => {\n const targetIds = this.definitionTargets.get(`${failure.metricName}:${failure.definitionVersion}`);\n return targetIds === undefined || targetIds.length === 0 || targetIds.includes(targetId);\n });\n return Object.freeze({\n batch: request.batch,\n samples: Object.freeze(samples),\n extractionFailures: Object.freeze(extractionFailures),\n });\n }\n\n private async persistSafely(\n target: TelemetryStorageTarget,\n request: StoragePersistRequest,\n ): Promise<TelemetryAcknowledgement> {\n try {\n const received: unknown = await target.transport.persist(request);\n const validated = this.acknowledgementContract.validateAndDetach(request.batch, received);\n return validated.ok\n ? validated.value\n : this.invalidAcknowledgement(request, validated.error);\n } catch (cause) {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: this.acknowledgementContract.exceptionReason(cause),\n retryAfterMs: 50,\n targetStates: [],\n };\n }\n }\n\n private invalidAcknowledgement(\n request: StoragePersistRequest,\n error: string,\n ): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: 50,\n targetStates: [],\n };\n }\n\n private alreadyCommitted(request: StoragePersistRequest): TelemetryAcknowledgement {\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: true,\n targetStates: [],\n };\n }\n\n private deliveryState(\n target: TelemetryStorageTarget,\n acknowledgement: TelemetryAcknowledgement,\n attempts: number,\n ): TelemetryTargetDeliveryState {\n return acknowledgement.kind === 'committed'\n ? {\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'committed',\n attempts,\n reason: null,\n }\n : {\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'failed',\n attempts,\n reason: acknowledgement.reason,\n };\n }\n\n private unmatchedStates(matchingTargets: readonly TelemetryStorageTarget[]): TelemetryTargetDeliveryState[] {\n const matchingIds = new Set(matchingTargets.map((target) => target.targetId));\n return this.options.targets\n .filter((target) => !matchingIds.has(target.targetId))\n .map((target) => ({\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'abandoned' as const,\n attempts: 0,\n reason: 'route-not-matched',\n }));\n }\n\n private resolveQueryTarget(\n requestedTargetId: string | null,\n ): TelemetryResult<TelemetryStorageTarget, TelemetryQueryError> {\n const queryable = this.options.targets.filter((target) => target.transport.capabilities.queries);\n if (queryable.length === 0) {\n return {\n ok: false,\n error: { kind: 'unsupported', message: 'No configured telemetry target supports queries' },\n };\n }\n const resolvedId = requestedTargetId ?? this.options.defaultTargetId ?? (queryable.length === 1\n ? queryable[0]?.targetId ?? null\n : null);\n if (resolvedId === null) {\n return {\n ok: false,\n error: { kind: 'ambiguous-target', message: 'Multiple queryable targets exist and no default was configured' },\n };\n }\n const target = queryable.find((candidate) => candidate.targetId === resolvedId);\n if (!target) {\n return { ok: false, error: { kind: 'unknown-target', message: `Unknown query target ${resolvedId}` } };\n }\n return { ok: true, value: target };\n }\n\n private async runMaintenance(\n stage: MaintenanceStageResult['stage'],\n run: (target: TelemetryStorageTransport) => Promise<TelemetryResult<MaintenanceStageResult, string>>,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n let affectedRows = 0;\n let affectedPages = 0;\n let elapsedMs = 0;\n for (const target of this.options.targets) {\n if (!target.transport.capabilities.maintenance) {\n continue;\n }\n const completed = await run(target.transport);\n if (!completed.ok && target.delivery === 'required') {\n return { ok: false, error: `${target.targetId}: ${completed.error}` };\n }\n if (completed.ok) {\n affectedRows += completed.value.affectedRows;\n affectedPages += completed.value.affectedPages;\n elapsedMs += completed.value.elapsedMs;\n }\n }\n return {\n ok: true,\n value: { stage, affectedRows, affectedPages, elapsedMs, detail: null },\n };\n }\n\n private validateOptions(): void {\n if (!this.options.routerId.trim() || this.options.targets.length === 0) {\n throw new Error('A telemetry storage router requires an id and at least one target');\n }\n if (this.options.maxRememberedBatches !== undefined\n && (!Number.isSafeInteger(this.options.maxRememberedBatches)\n || this.options.maxRememberedBatches <= 0)) {\n throw new Error('Telemetry storage router memory must be a positive safe integer');\n }\n const targetIds = this.options.targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error('Telemetry storage target ids must be unique');\n }\n const requiredTargets = this.options.targets.filter((target) => target.delivery === 'required');\n if (!this.options.volatile && requiredTargets.length === 0) {\n throw new Error('A non-volatile storage router requires a required target');\n }\n const defaultExists = this.options.defaultTargetId === null\n || targetIds.includes(this.options.defaultTargetId);\n if (!defaultExists) {\n throw new Error(`Unknown default telemetry target ${this.options.defaultTargetId}`);\n }\n const defaultTarget = this.options.targets.find((target) => target.targetId === this.options.defaultTargetId);\n if (defaultTarget && !defaultTarget.transport.capabilities.queries) {\n throw new Error(`Default telemetry target ${defaultTarget.targetId} does not support queries`);\n }\n }\n\n private remember(idempotencyKey: string, targets: Set<string>): void {\n this.committed.set(idempotencyKey, targets);\n const maximum = this.options.maxRememberedBatches ?? 1_024;\n while (this.committed.size > maximum) {\n const oldest = this.committed.keys().next().value;\n if (typeof oldest !== 'string') {\n return;\n }\n this.committed.delete(oldest);\n }\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type { MetricExtraction } from '../core/types/metric.types.js';\nimport type { TelemetryMetricPlugin, TelemetrySinkPlugin } from '../core/types/plugin.types.js';\nimport type { TelemetryBatch } from '../core/types/transport.types.js';\nimport type {\n TelemetryPluginRegistryOptions,\n TelemetryPluginRegistryStatus,\n} from './types/telemetry_plugin_registry.types.js';\n\nexport class TelemetryPluginRegistry {\n private readonly sinks = new Map<string, TelemetrySinkPlugin>();\n private readonly metrics = new Map<string, TelemetryMetricPlugin>();\n private readonly sinkChains = new Map<string, Promise<void>>();\n private readonly pendingBySink = new Map<string, number>();\n private readonly sinkFailures = new Map<string, number>();\n private readonly sinkDrops = new Map<string, number>();\n\n constructor(private readonly options: TelemetryPluginRegistryOptions) {}\n\n registerSink(plugin: TelemetrySinkPlugin): void {\n this.assertUnique(plugin.name);\n const supportsRuntime = plugin.supportedSchemaVersions.some((version) => {\n return this.options.supportedSchemaVersions.includes(version);\n });\n if (!supportsRuntime) {\n throw new Error(`Sink plugin ${plugin.name} supports no collector schema version`);\n }\n this.sinks.set(plugin.name, plugin);\n }\n\n registerMetric(plugin: TelemetryMetricPlugin): void {\n this.assertUnique(plugin.name);\n this.metrics.set(plugin.name, plugin);\n }\n\n extract(batch: TelemetryBatch): MetricExtraction {\n const samples = [];\n const failures = [];\n for (const plugin of this.metrics.values()) {\n try {\n const extracted = plugin.extract(batch);\n samples.push(...extracted.samples);\n failures.push(...extracted.failures);\n } catch (cause) {\n for (const envelope of batch.envelopes) {\n failures.push({\n metricName: plugin.definition.name,\n definitionVersion: plugin.definition.version,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n reason: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n }\n return { samples, failures };\n }\n\n dispatchCommitted(batch: TelemetryBatch): void {\n for (const sink of this.sinks.values()) {\n const pending = this.pendingBySink.get(sink.name) ?? 0;\n if (pending >= this.options.maxPendingPerSink) {\n this.sinkDrops.set(sink.name, (this.sinkDrops.get(sink.name) ?? 0) + 1);\n continue;\n }\n this.pendingBySink.set(sink.name, pending + 1);\n const prior = this.sinkChains.get(sink.name) ?? Promise.resolve();\n const next = prior\n .then(() => sink.onCommitted(batch))\n .catch(() => {\n this.sinkFailures.set(sink.name, (this.sinkFailures.get(sink.name) ?? 0) + 1);\n })\n .finally(() => {\n const remaining = Math.max(0, (this.pendingBySink.get(sink.name) ?? 1) - 1);\n this.pendingBySink.set(sink.name, remaining);\n });\n this.sinkChains.set(sink.name, next);\n }\n }\n\n status(): TelemetryPluginRegistryStatus {\n return Object.freeze({\n sinkFailures: Object.freeze(Object.fromEntries(this.sinkFailures)),\n sinkDrops: Object.freeze(Object.fromEntries(this.sinkDrops)),\n pendingBySink: Object.freeze(Object.fromEntries(this.pendingBySink)),\n });\n }\n\n async close(deadlineMs: number, now: () => number): Promise<void> {\n const chains = [...this.sinkChains.values()];\n while (chains.length > 0 && now() < deadlineMs) {\n await Promise.race([\n Promise.allSettled(chains).then(() => undefined),\n new Promise<void>((resolve) => setTimeout(resolve, 1)),\n ]);\n const allSettled = [...this.pendingBySink.values()].every((pending) => pending === 0);\n if (allSettled) {\n break;\n }\n }\n await Promise.allSettled([...this.sinks.values()].map((sink) => sink.close(deadlineMs)));\n }\n\n private assertUnique(name: string): void {\n const duplicate = this.sinks.has(name) || this.metrics.has(name);\n if (!name.trim() || duplicate) {\n throw new Error(`Telemetry plugin name ${name || '<empty>'} is invalid or duplicated`);\n }\n }\n}\n","import { MetricDefinitionContract } from '../core/metric_definition_contract.js';\nimport { MetricExtractor } from '../core/metric_extractor.js';\nimport { telemetryUtf8Length } from '../core/helper/canonical_json.js';\nimport { TelemetryBatchContract } from '../core/telemetry_batch_contract.js';\nimport { TelemetryStorageRouter } from '../core/telemetry_storage_router.js';\nimport type { MetricDefinition, MetricExtraction } from '../core/types/metric.types.js';\nimport type { TelemetryCollectorOptions, TelemetryCollectorStatus } from '../core/types/runtime.types.js';\nimport type {\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n TelemetryStorageTarget,\n} from '../core/types/storage.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryDropCounter,\n TelemetryTargetDeliveryState,\n} from '../core/types/transport.types.js';\nimport { TelemetryPluginRegistry } from '../plugins/telemetry_plugin_registry.js';\n\nexport class TelemetryCollectorRuntime implements TelemetryBatchReceiver {\n readonly receiverId = 'telemetry-collector';\n private readonly batchContract: TelemetryBatchContract;\n private readonly definitionContract = new MetricDefinitionContract();\n private readonly storage: TelemetryStorageTransport;\n private readonly pluginRegistry: TelemetryPluginRegistry;\n private readonly dropCounts = new Map<string, number>();\n private extractor: MetricExtractor | null = null;\n private state: TelemetryCollectorStatus['state'] = 'created';\n private acceptedBatches = 0;\n private committedEvents = 0;\n private rejectedBatches = 0;\n private lastFailure: string | null = null;\n private readonly pending = new Set<Promise<TelemetryAcknowledgement>>();\n\n constructor(private readonly options: TelemetryCollectorOptions) {\n this.batchContract = new TelemetryBatchContract(options.batchValidation);\n this.storage = this.resolveStorage(options.storage);\n this.pluginRegistry = new TelemetryPluginRegistry({\n supportedSchemaVersions: options.schemaVersions,\n maxPendingPerSink: 64,\n });\n for (const sink of options.sinkPlugins) {\n this.pluginRegistry.registerSink(sink);\n }\n }\n\n async start(): Promise<void> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n throw new Error(`Cannot start telemetry collector from state ${this.state}`);\n }\n this.state = 'starting';\n const definitions = this.normalizeDefinitions(this.options.definitions);\n const capabilityError = this.storageCapabilityError(definitions);\n if (capabilityError !== null) {\n this.state = 'failed';\n this.lastFailure = capabilityError;\n throw new Error(`Telemetry collector storage is incompatible: ${capabilityError}`);\n }\n const started = await this.storage.start(definitions);\n if (!started.ok) {\n this.state = 'failed';\n this.lastFailure = started.error;\n throw new Error(`Telemetry collector storage failed to start: ${started.error}`);\n }\n this.extractor = new MetricExtractor(definitions);\n this.state = 'ready';\n }\n\n receive(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n const operation = this.acceptBatch(batch);\n this.pending.add(operation);\n void operation.then(\n () => this.pending.delete(operation),\n () => this.pending.delete(operation),\n );\n return operation;\n }\n\n status(): TelemetryCollectorStatus {\n const targets = this.storage instanceof TelemetryStorageRouter\n ? this.storage.targetStatuses()\n : [this.storage.status()];\n return Object.freeze({\n state: this.state,\n acceptedBatches: this.acceptedBatches,\n committedEvents: this.committedEvents,\n rejectedBatches: this.rejectedBatches,\n dropCounters: this.dropCounterSnapshot(),\n lastFailure: this.lastFailure,\n targets: Object.freeze(targets),\n });\n }\n\n async stop(deadlineMs: number): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n this.state = 'draining';\n while (this.pending.size > 0 && this.options.now() < deadlineMs) {\n await Promise.race([...this.pending, new Promise<void>((resolve) => setTimeout(resolve, 1))]);\n }\n await this.settleExternalShutdown(\n () => this.pluginRegistry.close(deadlineMs, this.options.now),\n deadlineMs,\n );\n await this.settleExternalShutdown(() => this.storage.stop(deadlineMs), deadlineMs);\n this.state = 'stopped';\n }\n\n storageTransport(): TelemetryStorageTransport {\n return this.storage;\n }\n\n private async acceptBatch(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n const idempotencyKey = this.safeIdempotencyKey(batch);\n if (this.state !== 'ready' || this.extractor === null) {\n this.rejectedBatches += 1;\n return {\n kind: 'rejected',\n idempotencyKey,\n code: 'closed',\n reason: `Telemetry collector is ${this.state}`,\n targetStates: [],\n };\n }\n const validated = this.batchContract.validate(batch);\n if (!validated.ok) {\n this.rejectedBatches += 1;\n return {\n kind: 'rejected',\n idempotencyKey,\n code: this.validationCode(validated.error),\n reason: validated.error,\n targetStates: [],\n };\n }\n const acceptedBatch = validated.value;\n if (!this.options.schemaVersions.includes(acceptedBatch.schemaVersion)) {\n this.rejectedBatches += 1;\n return {\n kind: 'rejected',\n idempotencyKey,\n code: 'unsupported-version',\n reason: `Unsupported telemetry batch schema ${acceptedBatch.schemaVersion}`,\n targetStates: [],\n };\n }\n\n this.acceptedBatches += 1;\n try {\n return await this.persistAcceptedBatch(acceptedBatch);\n } catch (cause) {\n const reason = this.errorMessage(cause);\n this.lastFailure = reason;\n return {\n kind: 'retryable',\n idempotencyKey: acceptedBatch.idempotencyKey,\n reason: `Telemetry collector pipeline failed: ${reason}`.slice(0, 512),\n retryAfterMs: 1,\n targetStates: [],\n };\n }\n }\n\n private async persistAcceptedBatch(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n const extractor = this.extractor;\n if (extractor === null) {\n throw new Error('Telemetry metric extractor is unavailable');\n }\n const declarative = extractor.extract(batch.envelopes);\n const plugins = this.pluginRegistry.extract(batch);\n const extraction = this.mergeExtractions(declarative, plugins);\n const received: unknown = await this.storage.persist({\n batch,\n samples: extraction.samples,\n extractionFailures: extraction.failures,\n });\n const acknowledgement = this.normalizeStorageAcknowledgement(batch, received);\n if (acknowledgement.kind !== 'committed') {\n this.lastFailure = acknowledgement.reason;\n return acknowledgement;\n }\n if (!acknowledgement.duplicate) {\n this.committedEvents += acknowledgement.acceptedEvents;\n this.aggregateDropCounters(batch.dropCounters);\n this.pluginRegistry.dispatchCommitted(batch);\n }\n return acknowledgement;\n }\n\n private normalizeStorageAcknowledgement(\n batch: TelemetryBatch,\n value: unknown,\n ): TelemetryAcknowledgement {\n try {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return this.invalidStorageAcknowledgement(batch, 'identity is missing or mismatched');\n }\n let normalized: TelemetryAcknowledgement | null;\n switch (value.kind) {\n case 'committed':\n normalized = this.normalizeCommittedAcknowledgement(batch, value);\n break;\n case 'retryable':\n normalized = this.normalizeRetryableAcknowledgement(batch, value);\n break;\n case 'rejected':\n normalized = this.normalizeRejectedAcknowledgement(batch, value);\n break;\n case 'conflict':\n normalized = this.normalizeConflictAcknowledgement(batch, value);\n break;\n default:\n normalized = null;\n }\n return normalized ?? this.invalidStorageAcknowledgement(batch, 'fields are invalid');\n } catch {\n return this.invalidStorageAcknowledgement(batch, 'value could not be inspected');\n }\n }\n\n private normalizeCommittedAcknowledgement(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): TelemetryAcknowledgement | null {\n if (!this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])) {\n return null;\n }\n const committedAtMs = value.committedAtMs;\n const acceptedEvents = value.acceptedEvents;\n const duplicate = value.duplicate;\n const targetStates = this.normalizeTargetStates(value.targetStates);\n const valid = typeof committedAtMs === 'number'\n && Number.isSafeInteger(committedAtMs)\n && committedAtMs >= 0\n && typeof acceptedEvents === 'number'\n && acceptedEvents === batch.envelopes.length\n && typeof duplicate === 'boolean'\n && targetStates !== null;\n if (!valid || targetStates === null) {\n return null;\n }\n return Object.freeze({\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs,\n acceptedEvents,\n duplicate,\n targetStates,\n });\n }\n\n private normalizeRetryableAcknowledgement(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): TelemetryAcknowledgement | null {\n if (!this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])) {\n return null;\n }\n const reason = value.reason;\n const retryAfterMs = value.retryAfterMs;\n const targetStates = this.normalizeTargetStates(value.targetStates);\n const valid = this.isBoundedText(reason, 512)\n && typeof retryAfterMs === 'number'\n && Number.isFinite(retryAfterMs)\n && retryAfterMs >= 0\n && retryAfterMs <= Number.MAX_SAFE_INTEGER\n && targetStates !== null;\n if (!valid || typeof reason !== 'string' || typeof retryAfterMs !== 'number' || targetStates === null) {\n return null;\n }\n return Object.freeze({\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason,\n retryAfterMs,\n targetStates,\n });\n }\n\n private normalizeRejectedAcknowledgement(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): TelemetryAcknowledgement | null {\n if (!this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])) {\n return null;\n }\n const code = value.code;\n const reason = value.reason;\n const targetStates = this.normalizeTargetStates(value.targetStates);\n if (!this.isRejectionCode(code)\n || !this.isBoundedText(reason, 512)\n || typeof reason !== 'string'\n || targetStates === null) {\n return null;\n }\n return Object.freeze({\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code,\n reason,\n targetStates,\n });\n }\n\n private normalizeConflictAcknowledgement(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): TelemetryAcknowledgement | null {\n if (!this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])) {\n return null;\n }\n const reason = value.reason;\n const targetStates = this.normalizeTargetStates(value.targetStates);\n if (!this.isBoundedText(reason, 512) || typeof reason !== 'string' || targetStates === null) {\n return null;\n }\n return Object.freeze({\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason,\n targetStates,\n });\n }\n\n private normalizeTargetStates(value: unknown): readonly TelemetryTargetDeliveryState[] | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const targetCount = value.length;\n if (!Number.isSafeInteger(targetCount) || targetCount < 0 || targetCount > 1_024) {\n return null;\n }\n const normalized: TelemetryTargetDeliveryState[] = [];\n const targetIds = new Set<string>();\n for (let index = 0; index < targetCount; index += 1) {\n const target = this.normalizeTargetState(value[index]);\n if (target === null || targetIds.has(target.targetId)) {\n return null;\n }\n targetIds.add(target.targetId);\n normalized.push(target);\n }\n return Object.freeze(normalized);\n }\n\n private normalizeTargetState(value: unknown): TelemetryTargetDeliveryState | null {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return null;\n }\n const targetId = value.targetId;\n const delivery = value.delivery;\n const state = value.state;\n const attempts = value.attempts;\n const reason = value.reason;\n if (!this.isTargetId(targetId)\n || !this.isDeliveryMode(delivery)\n || !this.isDeliveryState(state)\n || !this.isAttemptCount(attempts)\n || !this.isTargetReason(reason)) {\n return null;\n }\n return Object.freeze({ targetId, delivery, state, attempts, reason });\n }\n\n private invalidStorageAcknowledgement(\n batch: TelemetryBatch,\n detail: string,\n ): TelemetryAcknowledgement {\n return Object.freeze({\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: `Invalid telemetry storage acknowledgement: ${detail}`.slice(0, 512),\n retryAfterMs: 1,\n targetStates: Object.freeze([]),\n });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isBoundedText(value: unknown, maxBytes: number): value is string {\n return typeof value === 'string'\n && value.length <= maxBytes\n && telemetryUtf8Length(value) <= maxBytes;\n }\n\n private isRejectionCode(\n value: unknown,\n ): value is 'invalid-batch' | 'unsupported-version' | 'no-required-terminal' | 'closed' {\n return value === 'invalid-batch'\n || value === 'unsupported-version'\n || value === 'no-required-terminal'\n || value === 'closed';\n }\n\n private isTargetId(value: unknown): value is string {\n return this.isBoundedText(value, 256) && value !== '';\n }\n\n private isDeliveryMode(value: unknown): value is TelemetryTargetDeliveryState['delivery'] {\n return value === 'required' || value === 'best-effort';\n }\n\n private isDeliveryState(value: unknown): value is TelemetryTargetDeliveryState['state'] {\n return value === 'pending'\n || value === 'committed'\n || value === 'failed'\n || value === 'abandoned';\n }\n\n private isAttemptCount(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n }\n\n private isTargetReason(value: unknown): value is string | null {\n return value === null || this.isBoundedText(value, 512);\n }\n\n private aggregateDropCounters(counters: readonly TelemetryDropCounter[]): void {\n for (const counter of counters) {\n const key = `${counter.reason}:${counter.priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.min(Number.MAX_SAFE_INTEGER, current + counter.count));\n }\n }\n\n private dropCounterSnapshot(): readonly TelemetryDropCounter[] {\n return Object.freeze([...this.dropCounts.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, count]) => {\n const [reason, priority] = key.split(':');\n return Object.freeze({\n reason: reason as TelemetryDropCounter['reason'],\n priority: priority as TelemetryDropCounter['priority'],\n count,\n });\n }));\n }\n\n private safeIdempotencyKey(batch: unknown): string {\n try {\n if (typeof batch !== 'object' || batch === null) {\n return 'invalid-batch';\n }\n const value = Reflect.get(batch, 'idempotencyKey');\n return typeof value === 'string' && value.length > 0\n ? value.slice(0, 1_024)\n : 'invalid-batch';\n } catch {\n return 'invalid-batch';\n }\n }\n\n private validationCode(error: string): 'invalid-batch' | 'unsupported-version' {\n return error.startsWith('Unsupported telemetry schema version')\n ? 'unsupported-version'\n : 'invalid-batch';\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error\n ? cause.message.slice(0, 512)\n : String(cause).slice(0, 512);\n }\n\n private async settleExternalShutdown(\n work: () => Promise<void>,\n deadlineMs: number,\n ): Promise<void> {\n const operation = Promise.resolve().then(work);\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n void operation.catch(() => undefined);\n return;\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (failed: boolean, error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (failed) {\n reject(error);\n } else {\n resolve();\n }\n };\n const timer = setTimeout(\n () => finish(false),\n Math.min(remainingMs, 2_147_483_647),\n );\n void operation.then(\n () => finish(false),\n (error: unknown) => finish(true, error),\n );\n });\n }\n\n private mergeExtractions(left: MetricExtraction, right: MetricExtraction): MetricExtraction {\n return Object.freeze({\n samples: Object.freeze([...left.samples, ...right.samples]),\n failures: Object.freeze([...left.failures, ...right.failures]),\n });\n }\n\n private normalizeDefinitions(definitions: readonly MetricDefinition[]): readonly MetricDefinition[] {\n const normalized = definitions.map((definition) => {\n const parsed = this.definitionContract.normalize(definition);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n const definitionIds = normalized.map((definition) => `${definition.name}:${definition.version}`);\n if (new Set(definitionIds).size !== definitionIds.length) {\n throw new Error('Telemetry metric name/version pairs must be unique');\n }\n return Object.freeze(normalized);\n }\n\n private storageCapabilityError(definitions: readonly MetricDefinition[]): string | null {\n const required = new Set<keyof TelemetryStorageCapabilities>(this.options.requiredCapabilities ?? []);\n if (!this.options.volatile) {\n required.add('rawPersistence');\n }\n if (definitions.length > 0) {\n required.add('metricSamples');\n required.add('rollups');\n }\n const capabilityOrder: readonly (keyof TelemetryStorageCapabilities)[] = [\n 'rawPersistence',\n 'metricSamples',\n 'rollups',\n 'queries',\n 'retention',\n 'maintenance',\n ];\n const missing = capabilityOrder.filter((capability) => {\n return required.has(capability) && this.storage.capabilities[capability] !== true;\n });\n return missing.length === 0\n ? null\n : `missing required capabilities: ${missing.join(', ')}`;\n }\n\n private resolveStorage(\n storage: TelemetryStorageTransport | readonly TelemetryStorageTarget[],\n ): TelemetryStorageTransport {\n if (this.isStorageTransport(storage)) {\n return storage;\n }\n return new TelemetryStorageRouter({\n routerId: 'collector-storage-router',\n targets: storage,\n defaultTargetId: this.options.defaultTargetId ?? null,\n volatile: this.options.volatile,\n now: this.options.now,\n });\n }\n\n private isStorageTransport(\n storage: TelemetryStorageTransport | readonly TelemetryStorageTarget[],\n ): storage is TelemetryStorageTransport {\n return !Array.isArray(storage) && typeof storage === 'object' && storage !== null && 'persist' in storage;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { MigrationRunnerFactory } from '@noego/proper';\nimport BetterSqlite3 from 'better-sqlite3';\nimport { createSqliteDb } from 'sqlstack/adapters';\nimport {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from '../core/helper/canonical_json.js';\nimport type { MetricDefinition } from '../core/types/metric.types.js';\nimport type {\n MetricQuery,\n MetricQueryResponse,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n} from '../core/types/storage.types.js';\nimport type { TelemetryAcknowledgement } from '../core/types/transport.types.js';\nimport { SQLITE_LOGICAL_TABLE_NAMES, SQLITE_SCHEMA_MANIFEST_TABLE } from '../storage/helper/sqlite_table_names.js';\nimport { SqliteOwnershipLease } from '../storage/sqlite_ownership_lease.js';\nimport { TelemetryProperSqlRunner } from '../storage/telemetry_proper_sql_runner.js';\nimport { TelemetryRepository } from '../storage/telemetry_repository.js';\nimport { TelemetryTableMap } from '../storage/telemetry_table_map.js';\nimport { TelemetrySchemaManifestRowSchema } from './schema/telemetry_schema_manifest.js';\nimport type { SQLiteTelemetryTransportOptions } from './types/sqlite_transport.types.js';\n\nconst DEFAULT_MIGRATIONS_DIRECTORY = typeof __dirname === 'string'\n ? resolve(__dirname, '../../migrations')\n : fileURLToPath(new URL('../../migrations/', import.meta.url));\n\nexport class SQLiteTelemetryTransport<IntervalHandle = unknown> implements TelemetryStorageTransport {\n readonly targetId: string;\n readonly capabilities: TelemetryStorageCapabilities = Object.freeze({\n rawPersistence: true,\n metricSamples: true,\n rollups: true,\n queries: true,\n retention: true,\n maintenance: true,\n });\n private state: StorageTargetStatus['state'] = 'created';\n private detail: string | null = null;\n private tableMap: TelemetryTableMap | null = null;\n private connection: BetterSqlite3.Database | null = null;\n private repository: TelemetryRepository | null = null;\n private definitions: readonly MetricDefinition[] = Object.freeze([]);\n private lease: SqliteOwnershipLease | null = null;\n private heartbeatHandle: IntervalHandle | null = null;\n private activeReaders = 0;\n private activeWrites = 0;\n private accepting = false;\n\n constructor(private readonly options: SQLiteTelemetryTransportOptions<IntervalHandle>) {\n this.targetId = options.configuration.targetId;\n this.validateConfiguration();\n }\n\n static defaults(\n configuration: SQLiteTelemetryTransportOptions['configuration'],\n ): SQLiteTelemetryTransportOptions<ReturnType<typeof setInterval>> {\n return {\n configuration,\n migrationsDirectory: DEFAULT_MIGRATIONS_DIRECTORY,\n processToken: randomUUID(),\n now: () => Date.now(),\n createInterval: (work, intervalMs) => setInterval(work, intervalMs),\n clearInterval: (handle) => clearInterval(handle),\n delay: (durationMs) => new Promise((resolve) => setTimeout(resolve, durationMs)),\n };\n }\n\n async start(definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n return { ok: false, error: `Cannot start SQLite telemetry target from state ${this.state}` };\n }\n this.state = 'starting';\n this.detail = null;\n const tableMap = TelemetryTableMap.create(this.options.configuration.schema);\n if (!tableMap.ok) {\n return this.failStart(tableMap.error);\n }\n this.tableMap = tableMap.value;\n this.lease = new SqliteOwnershipLease({\n targetId: this.targetId,\n databasePath: this.options.configuration.path,\n mode: 'writer',\n expiryMs: this.options.configuration.leaseExpiryMs,\n processToken: this.options.processToken,\n now: this.options.now,\n });\n const acquired = this.lease.acquire();\n if (!acquired.ok) {\n return this.failStart(acquired.error);\n }\n\n try {\n const connection = new BetterSqlite3(this.options.configuration.path);\n this.connection = connection;\n this.configureConnection(connection);\n const manifestNeedsUpgrade = this.initializeAndVerifyManifest(connection, tableMap.value);\n await this.runMigrations(connection, tableMap.value);\n this.verifySchema(connection, tableMap.value);\n if (manifestNeedsUpgrade) {\n this.upgradeManifestMapping(connection, tableMap.value);\n }\n const stackDatabase = await createSqliteDb(connection);\n this.repository = new TelemetryRepository({\n targetId: this.targetId,\n connection,\n stackDatabase,\n tableMap: tableMap.value,\n retention: this.options.configuration.retention,\n now: this.options.now,\n });\n const recovered = this.repository.recoverInterruptedMaintenance(this.options.now());\n if (!recovered.ok) {\n throw new Error(recovered.error);\n }\n const registered = this.repository.registerDefinitions(definitions);\n if (!registered.ok) {\n throw new Error(registered.error);\n }\n this.definitions = Object.freeze([...definitions]);\n this.startHeartbeat();\n this.accepting = true;\n this.state = 'ready';\n return { ok: true, value: undefined };\n } catch (cause) {\n this.closeOwnedResources();\n return this.failStart(this.errorMessage(cause));\n }\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n if (!this.accepting || this.state !== 'ready' || this.repository === null) {\n return this.closedAcknowledgement(request.batch.idempotencyKey);\n }\n this.activeWrites += 1;\n try {\n const persisted = this.repository.persist(request);\n if (persisted.kind === 'acknowledged') {\n return persisted.acknowledgement;\n }\n this.detail = persisted.reason;\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: persisted.reason,\n retryAfterMs: 100,\n targetStates: [{\n targetId: this.targetId,\n delivery: this.options.configuration.delivery,\n state: 'failed',\n attempts: 1,\n reason: persisted.reason,\n }],\n };\n } finally {\n this.activeWrites -= 1;\n }\n }\n\n async timeline(query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n const queryError = this.validateTimelineQuery(query);\n if (queryError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: queryError } };\n }\n const result = this.withReaderLease(() => {\n const repository = this.requireRepository();\n const rawCutoffMs = this.options.now() - this.options.configuration.retention.rawMs;\n return repository.timeline(query, rawCutoffMs);\n });\n return this.enforceResponseBytes(result);\n }\n\n async metrics(query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n const queryError = this.validateMetricQuery(query);\n if (queryError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: queryError } };\n }\n const result = this.withReaderLease(() => this.requireRepository().metrics(query));\n if (result.ok) {\n const bucketCount = result.value.segments.reduce((count, segment) => count + segment.buckets.length, 0);\n if (bucketCount > this.options.configuration.query.maxBuckets) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Metric result exceeds the configured bucket maximum' },\n };\n }\n }\n return this.enforceResponseBytes(result);\n }\n\n async materializeRollups(\n nowMs: number,\n maxWorkMs: number,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.materializeRollups(nowMs, maxWorkMs));\n }\n\n async enforceRetention(\n nowMs: number,\n shouldContinue: () => boolean = () => true,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n const startedAt = this.options.now();\n let drain: ReturnType<TelemetryRepository['beginRetentionDrain']>;\n try {\n drain = this.requireRepository().beginRetentionDrain(nowMs);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n let affectedRows = 0;\n let deletionRounds = 0;\n let interrupted = false;\n for (;;) {\n if (!shouldContinue()) {\n interrupted = true;\n break;\n }\n const batch = drain.nextBatch();\n if (!batch.ok) {\n return batch;\n }\n affectedRows += batch.value.deletedRows;\n deletionRounds += 1;\n if (!batch.value.hasMore) {\n break;\n }\n await this.options.delay(0);\n }\n return {\n ok: true,\n value: {\n stage: 'retention',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: interrupted ? 'interrupted' : null,\n deletionRounds,\n completed: !interrupted,\n interrupted,\n },\n };\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.checkpoint());\n }\n\n async reclaim(maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.reclaim(maxPages));\n }\n\n async compact(deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n const startedAt = this.options.now();\n this.accepting = false;\n while ((this.activeReaders > 0 || this.activeWrites > 0) && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n }\n if (this.activeReaders > 0 || this.activeWrites > 0) {\n this.accepting = true;\n return { ok: false, error: 'Timed out waiting for telemetry readers/writers to quiesce' };\n }\n try {\n const tableMap = this.requireTableMap();\n this.closeDatabaseConnectionForCompaction();\n this.compactClosedDatabase(tableMap);\n await this.reopenDatabaseAfterCompaction(tableMap);\n this.accepting = true;\n return {\n ok: true,\n value: {\n stage: 'compaction',\n affectedRows: 0,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n const compactionError = this.errorMessage(cause);\n try {\n await this.reopenDatabaseAfterCompaction(this.requireTableMap());\n this.accepting = true;\n } catch (reopenCause) {\n this.state = 'failed';\n this.detail = this.errorMessage(reopenCause);\n }\n return { ok: false, error: compactionError };\n }\n }\n\n async recordMaintenance(\n record: MaintenanceRunRecord,\n ): Promise<TelemetryResult<void, string>> {\n try {\n return this.requireRepository().recordMaintenance(record);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n status(): StorageTargetStatus {\n const committedDropCounters = this.repository?.committedDropCounters();\n return Object.freeze({\n targetId: this.targetId,\n state: this.state,\n detail: this.detail,\n writerLeaseHeld: this.lease?.isHeld() ?? false,\n committedDropCounters:\n committedDropCounters?.ok === true ? committedDropCounters.value : Object.freeze([]),\n });\n }\n\n maintenanceConfiguration(): SQLiteTelemetryTransportOptions['configuration']['maintenance'] {\n return this.options.configuration.maintenance;\n }\n\n async stop(deadlineMs: number): Promise<void> {\n this.accepting = false;\n while ((this.activeReaders > 0 || this.activeWrites > 0) && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n }\n this.closeOwnedResources();\n this.state = 'stopped';\n this.detail = null;\n }\n\n private configureConnection(connection: BetterSqlite3.Database): void {\n const userTableCount = this.readCount(connection.prepare(\n `SELECT COUNT(*) AS count FROM sqlite_master\n WHERE type = 'table' AND name NOT LIKE 'sqlite_%'`,\n ).get());\n if (userTableCount === 0) {\n connection.pragma('auto_vacuum = INCREMENTAL');\n connection.exec('VACUUM');\n }\n const autoVacuum = Number(connection.pragma('auto_vacuum', { simple: true }));\n if (autoVacuum !== 2) {\n throw new Error('Telemetry SQLite target must use auto_vacuum=INCREMENTAL');\n }\n connection.pragma('journal_mode = WAL');\n connection.pragma('synchronous = NORMAL');\n connection.pragma('foreign_keys = ON');\n connection.pragma('busy_timeout = 5000');\n }\n\n private closeDatabaseConnectionForCompaction(): void {\n const connection = this.requireConnection();\n connection.pragma('wal_checkpoint(TRUNCATE)');\n this.repository = null;\n this.connection = null;\n connection.close();\n }\n\n private compactClosedDatabase(tableMap: TelemetryTableMap): void {\n const connection = new BetterSqlite3(this.options.configuration.path);\n try {\n this.configureConnection(connection);\n connection.exec('VACUUM');\n this.verifySchema(connection, tableMap);\n } finally {\n connection.close();\n }\n }\n\n private async reopenDatabaseAfterCompaction(tableMap: TelemetryTableMap): Promise<void> {\n if (this.connection !== null && this.repository !== null) {\n return;\n }\n const connection = new BetterSqlite3(this.options.configuration.path);\n try {\n this.configureConnection(connection);\n this.initializeAndVerifyManifest(connection, tableMap);\n this.verifySchema(connection, tableMap);\n const stackDatabase = await createSqliteDb(connection);\n const repository = new TelemetryRepository({\n targetId: this.targetId,\n connection,\n stackDatabase,\n tableMap,\n retention: this.options.configuration.retention,\n now: this.options.now,\n });\n const loaded = repository.loadDefinitionsReadOnly(this.definitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n this.connection = connection;\n this.repository = repository;\n } catch (cause) {\n connection.close();\n throw cause;\n }\n }\n\n private initializeAndVerifyManifest(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): boolean {\n connection.exec(\n `CREATE TABLE IF NOT EXISTS \"${SQLITE_SCHEMA_MANIFEST_TABLE}\" (\n target_id TEXT PRIMARY KEY,\n format_version INTEGER NOT NULL,\n mapping_json TEXT NOT NULL,\n mapping_checksum TEXT NOT NULL,\n state TEXT NOT NULL CHECK (state IN ('ready', 'renaming')),\n pending_mapping_json TEXT,\n updated_at_ms INTEGER NOT NULL\n )`,\n );\n const rows = connection.prepare(\n `SELECT target_id, format_version, mapping_json, mapping_checksum,\n state, pending_mapping_json, updated_at_ms\n FROM \"${SQLITE_SCHEMA_MANIFEST_TABLE}\"`,\n ).all();\n if (rows.length === 0) {\n connection.prepare(\n `INSERT INTO \"${SQLITE_SCHEMA_MANIFEST_TABLE}\" (\n target_id, format_version, mapping_json, mapping_checksum,\n state, pending_mapping_json, updated_at_ms\n ) VALUES (?, ?, ?, ?, 'ready', NULL, ?)`,\n ).run(\n this.targetId,\n 2,\n JSON.stringify(tableMap.manifestMapping()),\n tableMap.checksum,\n this.options.now(),\n );\n return false;\n }\n if (rows.length !== 1) {\n throw new Error('Telemetry schema manifest must contain exactly one target mapping');\n }\n const parsed = TelemetrySchemaManifestRowSchema.safeParse(rows[0]);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n if (parsed.data.target_id !== this.targetId) {\n throw new Error(`Telemetry database belongs to target ${parsed.data.target_id}, not ${this.targetId}`);\n }\n if (parsed.data.state !== 'ready') {\n throw new Error('Telemetry schema rename recovery is required before startup');\n }\n if (parsed.data.mapping_checksum === tableMap.checksum) {\n return false;\n }\n if (this.isLegacyManifestMapping(parsed.data, tableMap)) {\n return true;\n }\n throw new Error('Telemetry table mapping differs from the schema manifest; run offline schema rename');\n }\n\n private isLegacyManifestMapping(\n manifest: Readonly<{\n format_version: number;\n mapping_json: string;\n mapping_checksum: string;\n }>,\n tableMap: TelemetryTableMap,\n ): boolean {\n if (manifest.format_version !== 1) {\n return false;\n }\n const parsed: unknown = JSON.parse(manifest.mapping_json);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return false;\n }\n if (telemetryChecksum(parsed) !== manifest.mapping_checksum) {\n return false;\n }\n const expected = tableMap.manifestMapping();\n const legacyEntries = Object.entries(expected).filter(\n ([logicalName]) => logicalName !== 'committedDropCounters',\n );\n const actualEntries = Object.entries(parsed as Record<string, unknown>);\n return (\n actualEntries.length === legacyEntries.length &&\n legacyEntries.every(([logicalName, physicalName]) => {\n return Reflect.get(parsed, logicalName) === physicalName;\n })\n );\n }\n\n private upgradeManifestMapping(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): void {\n connection\n .prepare(\n `UPDATE \"${SQLITE_SCHEMA_MANIFEST_TABLE}\"\n SET format_version = 2, mapping_json = ?, mapping_checksum = ?, updated_at_ms = ?\n WHERE target_id = ?`,\n )\n .run(\n JSON.stringify(tableMap.manifestMapping()),\n tableMap.checksum,\n this.options.now(),\n this.targetId,\n );\n }\n\n private async runMigrations(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): Promise<void> {\n const sqlRunner = new TelemetryProperSqlRunner(connection, tableMap);\n const migrationRunner = await new MigrationRunnerFactory().create({\n migration_folder: this.options.migrationsDirectory,\n migration_table: tableMap.quoted('migrationHistory'),\n database: 'sqlite',\n sqlite: { database: this.options.configuration.path },\n }, sqlRunner);\n const pending = await migrationRunner.getPendingMigrations();\n await migrationRunner.migrate(pending, true);\n }\n\n private verifySchema(connection: BetterSqlite3.Database, tableMap: TelemetryTableMap): void {\n const rows = connection.prepare(\n `SELECT name FROM sqlite_master WHERE type = 'table'`,\n ).all();\n const names = new Set(rows.map((row) => this.readName(row)));\n if (!names.has(SQLITE_SCHEMA_MANIFEST_TABLE)) {\n throw new Error('Telemetry schema manifest is missing');\n }\n const missing = SQLITE_LOGICAL_TABLE_NAMES\n .map((logicalName) => tableMap.physical(logicalName))\n .filter((physicalName) => !names.has(physicalName));\n if (missing.length > 0) {\n throw new Error(`Telemetry schema is missing table(s): ${missing.join(', ')}`);\n }\n }\n\n private startHeartbeat(): void {\n const intervalMs = Math.max(1_000, Math.floor(this.options.configuration.leaseExpiryMs / 3));\n this.heartbeatHandle = this.options.createInterval(() => {\n const heartbeat = this.lease?.heartbeat();\n if (heartbeat && !heartbeat.ok) {\n this.accepting = false;\n this.state = 'failed';\n this.detail = heartbeat.error;\n }\n }, intervalMs);\n }\n\n private withReaderLease<T>(work: () => TelemetryResult<T, TelemetryQueryError>): TelemetryResult<T, TelemetryQueryError> {\n if (!this.accepting || this.state !== 'ready') {\n return { ok: false, error: { kind: 'storage-failure', message: 'Telemetry target is not accepting readers' } };\n }\n this.activeReaders += 1;\n const leaseId = randomUUID();\n const table = this.requireTableMap().quoted('readerLeases');\n const connection = this.requireConnection();\n try {\n const acquiredAtMs = this.options.now();\n connection.prepare(\n `INSERT INTO ${table} (\n target_id, lease_id, owner_id, acquired_at_ms, expires_at_ms, state\n ) VALUES (?, ?, ?, ?, ?, 'active')`,\n ).run(\n this.targetId,\n leaseId,\n this.options.processToken,\n acquiredAtMs,\n acquiredAtMs + this.options.configuration.leaseExpiryMs,\n );\n return work();\n } finally {\n connection.prepare(\n `UPDATE ${table} SET state = 'released' WHERE target_id = ? AND lease_id = ?`,\n ).run(this.targetId, leaseId);\n this.activeReaders -= 1;\n }\n }\n\n private requireRepositoryResult(\n work: (repository: TelemetryRepository) => TelemetryResult<MaintenanceStageResult, string>,\n ): TelemetryResult<MaintenanceStageResult, string> {\n try {\n return work(this.requireRepository());\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private validateTimelineQuery(query: TimelineQuery): string | null {\n const commonError = this.validateQueryRange(query.targetId, query.fromMs, query.toMs, query.limit);\n return commonError;\n }\n\n private validateMetricQuery(query: MetricQuery): string | null {\n const rangeError = this.validateQueryRange(query.targetId, query.fromMs, query.toMs, query.limit);\n if (rangeError !== null) {\n return rangeError;\n }\n if (query.limit > this.options.configuration.query.maxBuckets) {\n return 'Metric query limit exceeds the configured bucket maximum';\n }\n return null;\n }\n\n private validateQueryRange(\n targetId: string | null,\n fromMs: number,\n toMs: number,\n limit: number,\n ): string | null {\n if (targetId !== null && targetId !== this.targetId) {\n return `Query target ${targetId} does not match ${this.targetId}`;\n }\n if (!Number.isSafeInteger(fromMs) || !Number.isSafeInteger(toMs) || fromMs >= toMs) {\n return 'Query time range must use safe integer milliseconds and be non-empty';\n }\n if (toMs - fromMs > this.options.configuration.query.maxRangeMs) {\n return 'Query time range exceeds the configured maximum';\n }\n if (!Number.isInteger(limit) || limit <= 0 || limit > this.options.configuration.query.maxRows) {\n return 'Query row limit is outside the configured bounds';\n }\n return null;\n }\n\n private validateConfiguration(): void {\n const configuration = this.options.configuration;\n if (!configuration.targetId.trim() || !configuration.path.trim()) {\n throw new Error('SQLite telemetry target id and path are required');\n }\n if (!Number.isInteger(configuration.leaseExpiryMs) || configuration.leaseExpiryMs < 1_000) {\n throw new Error('SQLite telemetry ownership lease expiry must be at least one second');\n }\n const queryLimits = Object.values(configuration.query);\n if (queryLimits.some((limit) => !Number.isSafeInteger(limit) || limit <= 0)) {\n throw new Error('SQLite telemetry query limits must be positive safe integers');\n }\n const retention = configuration.retention;\n const invalidRetention = retention.rawMs <= 0\n || retention.lateArrivalMs < 0\n || retention.samplesMs < retention.rawMs + retention.lateArrivalMs;\n if (invalidRetention) {\n throw new Error('SQLite telemetry retention values are invalid');\n }\n this.validateRollupTiers();\n }\n\n private validateRollupTiers(): void {\n const retention = this.options.configuration.retention;\n const tiers = retention.rollups;\n if (tiers.length === 0) {\n throw new Error('SQLite telemetry requires at least one rollup retention tier');\n }\n for (let index = 0; index < tiers.length; index += 1) {\n const tier = tiers[index];\n const previous = tiers[index - 1];\n if (!tier || tier.resolutionMs <= 0 || tier.retainMs < retention.rawMs) {\n throw new Error('SQLite telemetry rollup tiers are invalid');\n }\n if (previous && (tier.resolutionMs <= previous.resolutionMs || tier.retainMs < previous.retainMs)) {\n throw new Error('SQLite telemetry rollup tiers must increase by resolution and retention');\n }\n }\n }\n\n private enforceResponseBytes<T>(\n result: TelemetryResult<T, TelemetryQueryError>,\n ): TelemetryResult<T, TelemetryQueryError> {\n if (!result.ok) {\n return result;\n }\n // This output guard runs after repository materialization. Range/row/bucket limits\n // bound normal reads, but a future streaming query path should enforce bytes while decoding.\n try {\n const bytes = telemetryUtf8Length(canonicalJson(result.value));\n if (bytes > this.options.configuration.query.maxResponseBytes) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Query result exceeds the configured response byte maximum' },\n };\n }\n return result;\n } catch (cause) {\n return {\n ok: false,\n error: { kind: 'storage-failure', message: `Unable to size telemetry query result: ${this.errorMessage(cause)}` },\n };\n }\n }\n\n private failStart(error: string): TelemetryResult<void, string> {\n this.state = 'failed';\n this.detail = error;\n return { ok: false, error };\n }\n\n private closedAcknowledgement(idempotencyKey: string): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey,\n reason: 'SQLite telemetry target is not ready',\n retryAfterMs: 100,\n targetStates: [{\n targetId: this.targetId,\n delivery: this.options.configuration.delivery,\n state: 'failed',\n attempts: 0,\n reason: 'target-not-ready',\n }],\n };\n }\n\n private closeOwnedResources(): void {\n if (this.heartbeatHandle !== null) {\n this.options.clearInterval(this.heartbeatHandle);\n this.heartbeatHandle = null;\n }\n if (this.connection?.open) {\n try {\n this.connection.close();\n } catch {\n // Release the ownership lease even if SQLite close reports a failure.\n }\n }\n this.connection = null;\n this.repository = null;\n this.lease?.release();\n this.lease = null;\n }\n\n private requireRepository(): TelemetryRepository {\n if (this.repository === null) {\n throw new Error('SQLite telemetry repository is not initialized');\n }\n return this.repository;\n }\n\n private requireConnection(): BetterSqlite3.Database {\n if (this.connection === null) {\n throw new Error('SQLite telemetry connection is not initialized');\n }\n return this.connection;\n }\n\n private requireTableMap(): TelemetryTableMap {\n if (this.tableMap === null) {\n throw new Error('SQLite telemetry table map is not initialized');\n }\n return this.tableMap;\n }\n\n private readCount(row: unknown): number {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error('SQLite count query returned no row');\n }\n const count = Reflect.get(row, 'count');\n if (typeof count !== 'number') {\n throw new Error('SQLite count query returned an invalid count');\n }\n return count;\n }\n\n private readName(row: unknown): string {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error('SQLite schema query returned an invalid row');\n }\n const name = Reflect.get(row, 'name');\n if (typeof name !== 'string') {\n throw new Error('SQLite schema query returned an invalid table name');\n }\n return name;\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type { SqliteTableOverrides } from '../../core/types/configuration.types.js';\n\nexport const SQLITE_LOGICAL_TABLE_NAMES = [\n 'rawEvents',\n 'batchAcknowledgements',\n 'ingestWatermarks',\n 'metricDefinitions',\n 'metricSamples',\n 'metricRollups',\n 'rollupCompletions',\n 'extractionFailures',\n 'maintenanceRuns',\n 'readerLeases',\n 'committedDropCounters',\n 'migrationHistory',\n] as const satisfies readonly (keyof SqliteTableOverrides)[];\n\nexport const SQLITE_DEFAULT_TABLE_NAMES: Readonly<Record<(typeof SQLITE_LOGICAL_TABLE_NAMES)[number], string>> =\n Object.freeze({\n rawEvents: 'raw_events',\n batchAcknowledgements: 'batch_acknowledgements',\n ingestWatermarks: 'ingest_watermarks',\n metricDefinitions: 'metric_definitions',\n metricSamples: 'metric_samples',\n metricRollups: 'metric_rollups',\n rollupCompletions: 'rollup_completions',\n extractionFailures: 'extraction_failures',\n maintenanceRuns: 'maintenance_runs',\n readerLeases: 'reader_leases',\n committedDropCounters: 'committed_drop_counters',\n migrationHistory: 'migration_history',\n });\n\nexport const SQLITE_SCHEMA_MANIFEST_TABLE = 'telemetry_schema_manifest';\n","import {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n SqliteOwnershipLeaseOptions,\n SqliteOwnershipLeaseRecord,\n} from './types/sqlite_ownership_lease.types.js';\n\nexport class SqliteOwnershipLease {\n private readonly canonicalDatabasePath: string;\n private readonly leasePath: string;\n private held = false;\n\n constructor(private readonly options: SqliteOwnershipLeaseOptions) {\n mkdirSync(dirname(options.databasePath), { recursive: true });\n const canonicalDirectory = realpathSync(dirname(resolve(options.databasePath)));\n const databaseName = resolve(options.databasePath).slice(dirname(resolve(options.databasePath)).length + 1);\n this.canonicalDatabasePath = resolve(canonicalDirectory, databaseName);\n this.leasePath = `${this.canonicalDatabasePath}.telemetry-owner.json`;\n }\n\n acquire(): TelemetryResult<void, string> {\n const firstAttempt = this.writeExclusive(this.createRecord());\n if (firstAttempt.ok) {\n this.held = true;\n return firstAttempt;\n }\n\n const recovered = this.recoverStaleLease();\n if (!recovered.ok) {\n return recovered;\n }\n const secondAttempt = this.writeExclusive(this.createRecord());\n if (secondAttempt.ok) {\n this.held = true;\n }\n return secondAttempt;\n }\n\n heartbeat(): TelemetryResult<void, string> {\n if (!this.held) {\n return { ok: false, error: 'Cannot heartbeat a telemetry lease that is not held' };\n }\n const current = this.readRecord();\n if (!current.ok) {\n return current;\n }\n if (current.value.processToken !== this.options.processToken) {\n this.held = false;\n return { ok: false, error: 'Telemetry ownership lease was replaced by another owner' };\n }\n const now = this.options.now();\n return this.writeReplace({\n ...current.value,\n heartbeatAtMs: now,\n expiresAtMs: now + this.options.expiryMs,\n });\n }\n\n release(): void {\n if (!this.held || !existsSync(this.leasePath)) {\n this.held = false;\n return;\n }\n const current = this.readRecord();\n if (current.ok && current.value.processToken === this.options.processToken) {\n try {\n rmSync(this.leasePath, { force: true });\n } catch {\n // The lease will expire and can be recovered by a later owner.\n }\n }\n this.held = false;\n }\n\n isHeld(): boolean {\n return this.held;\n }\n\n path(): string {\n return this.leasePath;\n }\n\n private createRecord(): SqliteOwnershipLeaseRecord {\n const now = this.options.now();\n return {\n formatVersion: 1,\n targetId: this.options.targetId,\n databasePath: this.canonicalDatabasePath,\n mode: this.options.mode,\n pid: process.pid,\n processToken: this.options.processToken,\n acquiredAtMs: now,\n heartbeatAtMs: now,\n expiresAtMs: now + this.options.expiryMs,\n };\n }\n\n private writeExclusive(record: SqliteOwnershipLeaseRecord): TelemetryResult<void, string> {\n let descriptor: number | null = null;\n try {\n descriptor = openSync(this.leasePath, 'wx', 0o600);\n writeFileSync(descriptor, JSON.stringify(record), { encoding: 'utf8' });\n closeSync(descriptor);\n return { ok: true, value: undefined };\n } catch (cause) {\n if (descriptor !== null) {\n try {\n closeSync(descriptor);\n } catch {\n // Preserve the original lease acquisition error.\n }\n }\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private writeReplace(record: SqliteOwnershipLeaseRecord): TelemetryResult<void, string> {\n const temporaryPath = `${this.leasePath}.${this.options.processToken}.tmp`;\n try {\n writeFileSync(temporaryPath, JSON.stringify(record), { encoding: 'utf8', mode: 0o600 });\n renameSync(temporaryPath, this.leasePath);\n return { ok: true, value: undefined };\n } catch (cause) {\n try {\n rmSync(temporaryPath, { force: true });\n } catch {\n // Preserve the original heartbeat write error.\n }\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private readRecord(): TelemetryResult<SqliteOwnershipLeaseRecord, string> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(this.leasePath, 'utf8'));\n if (!this.isLeaseRecord(parsed)) {\n return { ok: false, error: `Invalid telemetry ownership lease at ${this.leasePath}` };\n }\n return { ok: true, value: parsed };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private recoverStaleLease(): TelemetryResult<void, string> {\n const current = this.readRecord();\n if (!current.ok) {\n return current;\n }\n const expired = current.value.expiresAtMs < this.options.now();\n const processAlive = this.isProcessAlive(current.value.pid);\n if (!expired || processAlive) {\n return {\n ok: false,\n error: `Telemetry target ${this.options.targetId} is owned by pid ${current.value.pid} (${current.value.mode})`,\n };\n }\n try {\n const stalePath = `${this.leasePath}.stale.${current.value.processToken}`;\n renameSync(this.leasePath, stalePath);\n rmSync(stalePath, { force: true });\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (cause) {\n const code = typeof cause === 'object' && cause !== null && 'code' in cause\n ? Reflect.get(cause, 'code')\n : null;\n return code === 'EPERM';\n }\n }\n\n private isLeaseRecord(value: unknown): value is SqliteOwnershipLeaseRecord {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return Reflect.get(value, 'formatVersion') === 1\n && typeof Reflect.get(value, 'targetId') === 'string'\n && typeof Reflect.get(value, 'databasePath') === 'string'\n && (Reflect.get(value, 'mode') === 'writer' || Reflect.get(value, 'mode') === 'offline-maintenance')\n && Number.isInteger(Reflect.get(value, 'pid'))\n && typeof Reflect.get(value, 'processToken') === 'string'\n && typeof Reflect.get(value, 'acquiredAtMs') === 'number'\n && typeof Reflect.get(value, 'heartbeatAtMs') === 'number'\n && typeof Reflect.get(value, 'expiresAtMs') === 'number';\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type Database from 'better-sqlite3';\nimport type { ISQLRunner } from '@noego/proper/runners';\nimport { TelemetryTableMap } from './telemetry_table_map.js';\n\nexport class TelemetryProperSqlRunner implements ISQLRunner {\n constructor(\n private readonly connection: Database.Database,\n private readonly tableMap: TelemetryTableMap,\n ) {}\n\n async query(sql: string, params: unknown[] = []): Promise<unknown> {\n const substituted = this.substitute(sql);\n const normalized = this.leadingKeyword(substituted);\n if (normalized === 'SELECT' || normalized === 'WITH' || normalized === 'PRAGMA' || normalized === 'EXPLAIN') {\n return [this.connection.prepare(substituted).all(...params), undefined];\n }\n if (params.length > 0) {\n return [this.connection.prepare(substituted).run(...params), undefined];\n }\n this.connection.exec(substituted);\n return [{ changes: 0 }, undefined];\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<unknown> {\n const substituted = this.substitute(sql);\n if (params.length > 0) {\n return [this.connection.prepare(substituted).run(...params), undefined];\n }\n this.connection.exec(substituted);\n return [{ changes: 0 }, undefined];\n }\n\n async end(): Promise<void> {\n // Proper shares the SQLite target's connection and must not close it.\n }\n\n private substitute(sql: string): string {\n const substituted = this.tableMap.substitute(sql);\n if (!substituted.ok) {\n throw new Error(substituted.error);\n }\n return substituted.value;\n }\n\n private leadingKeyword(sql: string): string {\n const withoutComments = sql\n .replace(/--.*$/gm, '')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .trimStart();\n return withoutComments.split(/\\s+/, 1)[0]?.toUpperCase() ?? '';\n }\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalJson, telemetryChecksum } from '../core/helper/canonical_json.js';\nimport { MetricDefinitionContract } from '../core/metric_definition_contract.js';\nimport type { TelemetryEnvelope } from '../core/types/envelope.types.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from '../core/types/json.types.js';\nimport type {\n MetricAggregate,\n MetricDefinition,\n MetricMeasurement,\n MetricRollupValues,\n} from '../core/types/metric.types.js';\nimport type {\n MetricBucket,\n MetricDimensionFilter,\n MetricQuery,\n MetricQueryGap,\n MetricQueryResponse,\n MetricQuerySegment,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n RetentionDrain,\n RetentionDrainBatchResult,\n StoragePersistRequest,\n} from '../core/types/storage.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryDropCounter,\n} from '../core/types/transport.types.js';\nimport {\n BatchAcknowledgementRowSchema,\n type MetricSampleRow,\n StoredMetricDefinitionRowSchema,\n StoredMetricDefinitionSchema,\n} from './schema/telemetry_repository_rows.js';\nimport { TelemetryRepositoryRowParser } from './telemetry_repository_row_parser.js';\nimport type {\n MetricBucketWork,\n MutableMaterializedMetricGroup,\n MutableMetricFieldAggregate,\n NormalizedMetricSample,\n RepositoryPersistOutcome,\n RollupCoverageInterval,\n TelemetryRepositoryOptions,\n} from './types/telemetry_repository.types.js';\n\nconst RETENTION_PAGE_SIZE = 500;\n\ntype RawRetentionCursor = Readonly<{\n occurredAtMs: number;\n producerId: string;\n sequence: number;\n}>;\n\ntype SampleRetentionCursor = Readonly<{\n occurredAtMs: number;\n metricName: string;\n definitionVersion: number;\n producerId: string;\n sequence: number;\n}>;\n\ntype RetentionStepOutcome = Readonly<{ deleted: number; done: boolean }>;\n\ntype RetentionStep = () => RetentionStepOutcome;\n\nclass MetricCardinalityRejectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MetricCardinalityRejectionError';\n }\n}\n\nexport class TelemetryRepository {\n private readonly rowParser = new TelemetryRepositoryRowParser();\n private readonly definitionContract = new MetricDefinitionContract();\n private readonly definitions = new Map<string, MetricDefinition>();\n\n constructor(private readonly options: TelemetryRepositoryOptions) {}\n\n registerDefinitions(definitions: readonly MetricDefinition[]): TelemetryResult<void, string> {\n try {\n const normalizedDefinitions = this.normalizeDefinitions(definitions);\n const registeredAtMs = this.options.now();\n const byName = new Map<string, MetricDefinition[]>();\n for (const definition of normalizedDefinitions) {\n const versions = byName.get(definition.name) ?? [];\n versions.push(definition);\n byName.set(definition.name, versions);\n }\n\n const transaction = this.options.connection.transaction(() => {\n const table = this.options.tableMap.quoted('metricDefinitions');\n const deactivate = this.options.connection.prepare(\n `UPDATE ${table} SET active = 0 WHERE target_id = ? AND metric_name = ?`,\n );\n const existing = this.options.connection.prepare(\n `SELECT definition_checksum FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?`,\n );\n const insert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, metric_name, definition_version, definition_json,\n definition_checksum, active, registered_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n );\n const activate = this.options.connection.prepare(\n `UPDATE ${table} SET active = 1\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?`,\n );\n\n for (const [metricName, versions] of byName) {\n deactivate.run(this.options.targetId, metricName);\n const latestVersion = Math.max(...versions.map((definition) => definition.version));\n for (const definition of versions) {\n const definitionJson = canonicalJson(definition);\n const definitionChecksum = telemetryChecksum(definition);\n const prior = existing.get(this.options.targetId, definition.name, definition.version);\n if (prior !== undefined) {\n const priorChecksum = this.readStringField(prior, 'definition_checksum');\n if (priorChecksum !== definitionChecksum) {\n throw new Error(\n `Metric ${definition.name} version ${definition.version} changed without a version bump`,\n );\n }\n } else {\n insert.run(\n this.options.targetId,\n definition.name,\n definition.version,\n definitionJson,\n definitionChecksum,\n definition.version === latestVersion ? 1 : 0,\n registeredAtMs,\n );\n }\n }\n activate.run(this.options.targetId, metricName, latestVersion);\n }\n });\n transaction();\n const loaded = this.loadDefinitionsReadOnly(normalizedDefinitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n loadDefinitionsReadOnly(\n expectedDefinitions: readonly MetricDefinition[],\n ): TelemetryResult<void, string> {\n try {\n const normalizedExpectedDefinitions = this.normalizeDefinitions(expectedDefinitions);\n const table = this.options.tableMap.quoted('metricDefinitions');\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, definition_json, definition_checksum, active\n FROM ${table} WHERE target_id = ?`,\n )\n .all(this.options.targetId);\n const loaded = new Map<string, MetricDefinition>();\n for (const rawRow of rows) {\n const row = StoredMetricDefinitionRowSchema.parse(rawRow);\n const parsedJson: unknown = JSON.parse(row.definition_json);\n const parsedDefinition = StoredMetricDefinitionSchema.parse(parsedJson);\n const normalized = this.definitionContract.normalize(parsedDefinition);\n if (!normalized.ok) {\n throw new Error(normalized.error);\n }\n const definition = normalized.value;\n const identityMatches =\n definition.name === row.metric_name && definition.version === row.definition_version;\n if (!identityMatches) {\n throw new Error('Stored metric definition identity does not match its row');\n }\n const checksum = telemetryChecksum(definition);\n const canonicalRowMatches =\n checksum === row.definition_checksum &&\n canonicalJson(definition) === row.definition_json;\n // Rows written before the shared canonical-json/fnv1a64 contract used\n // sha256 over the writer's own serialization. Their integrity is still\n // verifiable against their stored checksum, and registration rewrites\n // them in the canonical format on the next collector start.\n const legacyRowMatches =\n !canonicalRowMatches &&\n createHash('sha256').update(row.definition_json, 'utf8').digest('hex') ===\n row.definition_checksum;\n if (!canonicalRowMatches && !legacyRowMatches) {\n // Stale inactive rows are not load-bearing; an unreadable legacy\n // format must not wedge readers.\n if (row.active !== 1) {\n continue;\n }\n throw new Error(\n `Stored metric ${definition.name} version ${definition.version} checksum is invalid`,\n );\n }\n loaded.set(this.definitionKey(definition.name, definition.version), definition);\n }\n for (const expected of normalizedExpectedDefinitions) {\n const stored = loaded.get(this.definitionKey(expected.name, expected.version));\n if (stored === undefined || telemetryChecksum(stored) !== telemetryChecksum(expected)) {\n throw new Error(\n `Configured metric ${expected.name} version ${expected.version} is not registered in target ${this.options.targetId}`,\n );\n }\n }\n this.definitions.clear();\n for (const [identity, definition] of loaded) {\n this.definitions.set(identity, definition);\n }\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n persist(request: StoragePersistRequest): RepositoryPersistOutcome {\n try {\n const outsideHorizon = this.outsideIngestionHorizon(request.batch);\n if (outsideHorizon !== null) {\n return { kind: 'acknowledged', acknowledgement: outsideHorizon };\n }\n const replay = this.findReplay(request.batch);\n if (replay !== null) {\n return { kind: 'acknowledged', acknowledgement: replay };\n }\n const acknowledgement = this.persistTransaction(request);\n return { kind: 'acknowledged', acknowledgement };\n } catch (cause) {\n return { kind: 'failed', reason: this.errorMessage(cause) };\n }\n }\n\n timeline(\n query: TimelineQuery,\n rawRetentionCutoffMs: number,\n ): TelemetryResult<TimelineQueryResponse, TelemetryQueryError> {\n try {\n const cursor =\n query.cursor === null ? null : this.rowParser.parseTimelineCursor(query.cursor);\n if (cursor !== null && !cursor.ok) {\n return { ok: false, error: { kind: 'invalid-query', message: cursor.error } };\n }\n if (cursor !== null && cursor.value.order !== query.order) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Timeline cursor order changed' },\n };\n }\n\n const availableFromMs = Math.max(query.fromMs, rawRetentionCutoffMs);\n const clauses = ['target_id = ?', 'occurred_at_ms >= ?', 'occurred_at_ms < ?'];\n const params: unknown[] = [this.options.targetId, availableFromMs, query.toMs];\n this.addTimelineFilters(query, clauses, params);\n if (cursor?.ok) {\n this.addTimelineCursor(cursor.value, query.order, clauses, params);\n }\n const direction = query.order === 'asc' ? 'ASC' : 'DESC';\n const table = this.options.tableMap.quoted('rawEvents');\n const sql = `SELECT\n producer_id, sequence, event_id, occurred_at_ms, monotonic_ns,\n source, process_kind, level, label, conversation_id,\n conversation_id_kind, correlation_id, metadata_json, schema_version\n FROM ${table}\n WHERE ${clauses.join(' AND ')}\n ORDER BY occurred_at_ms ${direction}, producer_id ${direction}, sequence ${direction}\n LIMIT ?`;\n params.push(query.limit + 1);\n const rows = this.options.connection.prepare(sql).all(...params);\n const hasNextPage = rows.length > query.limit;\n const pageRows = hasNextPage ? rows.slice(0, query.limit) : rows;\n const events: TelemetryEnvelope[] = [];\n for (const row of pageRows) {\n const parsed = this.rowParser.parseRawEnvelope(row);\n if (!parsed.ok) {\n return { ok: false, error: { kind: 'storage-failure', message: parsed.error } };\n }\n events.push(parsed.value);\n }\n const last = events[events.length - 1];\n const nextCursor =\n hasNextPage && last\n ? this.encodeCursor({\n version: 1,\n order: query.order,\n occurredAtMs: last.occurredAtMs,\n producerId: last.producerId,\n sequence: last.sequence,\n })\n : null;\n const unavailableEnd = Math.min(query.toMs, rawRetentionCutoffMs);\n const gaps =\n query.fromMs < unavailableEnd\n ? [{ fromMs: query.fromMs, toMs: unavailableEnd, reason: 'raw-retention' as const }]\n : [];\n return {\n ok: true,\n value: {\n targetId: this.options.targetId,\n events: Object.freeze(events),\n gaps: Object.freeze(gaps),\n nextCursor,\n },\n };\n } catch (cause) {\n return { ok: false, error: { kind: 'storage-failure', message: this.errorMessage(cause) } };\n }\n }\n\n metrics(query: MetricQuery): TelemetryResult<MetricQueryResponse, TelemetryQueryError> {\n try {\n const definitions = this.metricDefinitions(query.metric);\n if (definitions.length === 0) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: `Unknown metric ${query.metric}` },\n };\n }\n const validationError = this.validateMetricQuery(query, definitions);\n if (validationError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: validationError } };\n }\n const cursor = query.cursor === null ? null : this.rowParser.parseMetricCursor(query.cursor);\n if (cursor !== null && !cursor.ok) {\n return { ok: false, error: { kind: 'invalid-query', message: cursor.error } };\n }\n if (cursor !== null && cursor.value.order !== query.order) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Metric cursor order changed' },\n };\n }\n\n const coverage = this.planCoverage(query, definitions);\n const rows = this.readRollupsForCoverage(query, coverage.intervals);\n const filtered = rows.filter((row) => this.matchesWhere(row.bucket.dimensions, query.where));\n const ordered = filtered.sort((left, right) =>\n this.compareParsedRollups(left, right, query.order),\n );\n const afterCursor = cursor?.ok\n ? ordered.filter((row) => this.isAfterMetricCursor(row, cursor.value, query.order))\n : ordered;\n const hasNextPage = afterCursor.length > query.limit;\n const page = hasNextPage ? afterCursor.slice(0, query.limit) : afterCursor;\n const projected = page.map((row) => ({\n ...row,\n bucket: {\n ...row.bucket,\n values: this.selectMeasurements(row.bucket.values, query.measurements),\n },\n }));\n const segments = this.rowsToSegments(coverage.intervals, projected);\n const last = page[page.length - 1];\n const nextCursor =\n hasNextPage && last\n ? this.encodeCursor({\n version: 1,\n order: query.order,\n bucketStartMs: last.bucket.startMs,\n resolutionMs: last.resolutionMs,\n definitionVersion: last.definitionVersion,\n dimensionKey: last.dimensionKey,\n })\n : null;\n return {\n ok: true,\n value: {\n targetId: this.options.targetId,\n metric: query.metric,\n segments,\n gaps: coverage.gaps,\n nextCursor,\n partialFailures: [],\n },\n };\n } catch (cause) {\n return { ok: false, error: { kind: 'storage-failure', message: this.errorMessage(cause) } };\n }\n }\n\n materializeRollups(\n nowMs: number,\n maxWorkMs: number,\n ): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n let affectedRows = 0;\n let rejectedBucketCount = 0;\n const rejectedBucketExamples: string[] = [];\n try {\n for (const definition of this.definitions.values()) {\n for (const resolutionMs of definition.resolutionsMs) {\n const dueBeforeMs = nowMs - this.options.retention.lateArrivalMs;\n const bucketStarts = this.findDueBucketStarts(definition, resolutionMs, dueBeforeMs);\n for (const bucketStartMs of bucketStarts) {\n if (this.options.now() - startedAt >= maxWorkMs) {\n return {\n ok: true,\n value: {\n stage: 'rollup',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: this.rollupStageDetail(\n rejectedBucketCount,\n rejectedBucketExamples,\n true,\n ),\n },\n };\n }\n const work = this.loadBucketWork(definition, resolutionMs, bucketStartMs);\n if (this.bucketIsCurrent(work)) {\n continue;\n }\n try {\n affectedRows += this.materializeBucket(work, nowMs);\n } catch (cause) {\n if (!(cause instanceof MetricCardinalityRejectionError)) {\n throw cause;\n }\n this.recordRejectedBucket(work, nowMs, cause.message);\n rejectedBucketCount += 1;\n if (rejectedBucketExamples.length < 3) {\n rejectedBucketExamples.push(\n `${definition.name}:${definition.version}:${resolutionMs}:${bucketStartMs}: ${cause.message}`,\n );\n }\n }\n }\n }\n }\n return {\n ok: true,\n value: {\n stage: 'rollup',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: this.rollupStageDetail(\n rejectedBucketCount,\n rejectedBucketExamples,\n false,\n ),\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n beginRetentionDrain(nowMs: number): RetentionDrain {\n const steps: RetentionStep[] = [\n this.createRawEventRetentionStep(nowMs),\n this.createSampleRetentionStep(nowMs),\n ...this.createRollupRetentionSteps(nowMs),\n ...this.createAuxiliaryRetentionSteps(nowMs),\n ];\n let index = 0;\n return {\n nextBatch: (): TelemetryResult<RetentionDrainBatchResult, string> => {\n try {\n if (steps.length === 0) {\n return { ok: true, value: { deletedRows: 0, hasMore: false } };\n }\n if (index >= steps.length) {\n index = 0;\n }\n const step = steps[index];\n if (step === undefined) {\n return { ok: true, value: { deletedRows: 0, hasMore: false } };\n }\n const outcome = step();\n if (outcome.done) {\n steps.splice(index, 1);\n } else {\n index += 1;\n }\n return {\n ok: true,\n value: { deletedRows: outcome.deleted, hasMore: steps.length > 0 },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n },\n };\n }\n\n checkpoint(): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n try {\n const rows = this.options.connection.pragma('wal_checkpoint(PASSIVE)');\n return {\n ok: true,\n value: {\n stage: 'checkpoint',\n affectedRows: Array.isArray(rows) ? rows.length : 0,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n reclaim(maxPages: number): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n try {\n const before = Number(this.options.connection.pragma('freelist_count', { simple: true }));\n this.options.connection.pragma(`incremental_vacuum(${Math.max(0, Math.floor(maxPages))})`);\n const after = Number(this.options.connection.pragma('freelist_count', { simple: true }));\n return {\n ok: true,\n value: {\n stage: 'reclaim',\n affectedRows: 0,\n affectedPages: Math.max(0, before - after),\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n pageStats(): TelemetryResult<\n Readonly<{ pageCount: number; freePages: number; pageSize: number }>,\n string\n > {\n try {\n return {\n ok: true,\n value: {\n pageCount: Number(this.options.connection.pragma('page_count', { simple: true })),\n freePages: Number(this.options.connection.pragma('freelist_count', { simple: true })),\n pageSize: Number(this.options.connection.pragma('page_size', { simple: true })),\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n recordMaintenance(record: MaintenanceRunRecord): TelemetryResult<void, string> {\n try {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const affectedRows = record.stages.reduce((sum, stage) => sum + stage.affectedRows, 0);\n const affectedPages = record.stages.reduce((sum, stage) => sum + stage.affectedPages, 0);\n const detail = canonicalJson({\n stages: record.stages,\n failedStage: record.failedStage,\n error: record.error,\n });\n this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, run_id, state, stage, started_at_ms, completed_at_ms,\n affected_rows, affected_pages, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, run_id, stage) DO UPDATE SET\n state = excluded.state,\n completed_at_ms = excluded.completed_at_ms,\n affected_rows = excluded.affected_rows,\n affected_pages = excluded.affected_pages,\n detail = excluded.detail`,\n ).run(\n this.options.targetId,\n record.runId,\n record.state,\n record.kind,\n record.startedAtMs,\n record.completedAtMs,\n affectedRows,\n affectedPages,\n detail,\n );\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n recoverInterruptedMaintenance(nowMs: number): TelemetryResult<number, string> {\n try {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const detail = canonicalJson({\n stages: [],\n failedStage: null,\n error: 'interrupted-before-restart',\n });\n const result = this.options.connection.prepare(\n `UPDATE ${table}\n SET state = 'failed', completed_at_ms = ?, detail = ?\n WHERE target_id = ? AND state = 'started'`,\n ).run(nowMs, detail, this.options.targetId);\n return { ok: true, value: result.changes };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n committedDropCounters(): TelemetryResult<readonly TelemetryDropCounter[], string> {\n try {\n const table = this.options.tableMap.quoted('committedDropCounters');\n const rows = this.options.connection\n .prepare(\n `SELECT reason, priority, count\n FROM ${table}\n WHERE target_id = ?\n ORDER BY reason ASC, priority ASC`,\n )\n .all(this.options.targetId);\n const counters = rows.map((row) => this.parseCommittedDropCounter(row));\n return { ok: true, value: Object.freeze(counters) };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private findReplay(batch: TelemetryBatch): TelemetryAcknowledgement | null {\n const table = this.options.tableMap.quoted('batchAcknowledgements');\n const rows = this.options.connection\n .prepare(\n `SELECT idempotency_key, producer_id, sequence_start, sequence_end,\n schema_version, checksum, accepted_events, committed_at_ms\n FROM ${table}\n WHERE target_id = ? AND producer_id = ?\n AND sequence_start <= ? AND sequence_end >= ?`,\n )\n .all(this.options.targetId, batch.producerId, batch.sequenceEnd, batch.sequenceStart);\n if (rows.length === 0) {\n return this.findPrunedReplayConflict(batch);\n }\n for (const row of rows) {\n const parsed = BatchAcknowledgementRowSchema.safeParse(row);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n const identical =\n parsed.data.idempotency_key === batch.idempotencyKey &&\n parsed.data.checksum === batch.checksum &&\n parsed.data.sequence_start === batch.sequenceStart &&\n parsed.data.sequence_end === batch.sequenceEnd;\n if (identical) {\n return {\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs: parsed.data.committed_at_ms,\n acceptedEvents: parsed.data.accepted_events,\n duplicate: true,\n targetStates: [this.committedTargetState(0)],\n };\n }\n }\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: 'Producer sequence range overlaps a different committed batch',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'sequence-range-conflict',\n },\n ],\n };\n }\n\n private outsideIngestionHorizon(\n batch: TelemetryBatch,\n ): TelemetryAcknowledgement | null {\n const cutoffMs = this.options.now() - this.longestRetentionMs();\n const containsExpiredEvent = batch.envelopes.some(\n (envelope) => envelope.occurredAtMs < cutoffMs,\n );\n if (!containsExpiredEvent) {\n return null;\n }\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'invalid-batch',\n reason: 'Telemetry batch is older than the configured ingestion horizon',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'batch-outside-ingestion-horizon',\n },\n ],\n };\n }\n\n private findPrunedReplayConflict(batch: TelemetryBatch): TelemetryAcknowledgement | null {\n const table = this.options.tableMap.quoted('ingestWatermarks');\n const row = this.options.connection\n .prepare(\n `SELECT highest_sequence\n FROM ${table}\n WHERE target_id = ? AND producer_id = ?`,\n )\n .get(this.options.targetId, batch.producerId);\n if (row === undefined) {\n return null;\n }\n const highestSequence = this.readNumberField(row, 'highest_sequence');\n if (batch.sequenceStart > highestSequence) {\n return null;\n }\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: 'Producer sequence range is at or below the durable ingest watermark',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'sequence-at-or-below-watermark',\n },\n ],\n };\n }\n\n private persistTransaction(request: StoragePersistRequest): TelemetryAcknowledgement {\n const committedAtMs = this.options.now();\n const transaction = this.options.connection.transaction(() => {\n this.insertRawEvents(request, committedAtMs);\n this.insertMetricSamples(request, committedAtMs);\n this.insertExtractionFailures(request, committedAtMs);\n this.upsertCommittedDropCounters(request.batch, committedAtMs);\n this.insertBatchAcknowledgement(request.batch, committedAtMs);\n this.updateIngestWatermark(request.batch, committedAtMs);\n });\n transaction();\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs,\n acceptedEvents: request.batch.envelopes.length,\n duplicate: false,\n targetStates: [this.committedTargetState(1)],\n };\n }\n\n private insertRawEvents(request: StoragePersistRequest, insertedAtMs: number): void {\n const table = this.options.tableMap.quoted('rawEvents');\n const insert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, producer_id, sequence, event_id, batch_idempotency_key,\n occurred_at_ms, monotonic_ns, source, process_kind, level, label,\n conversation_id, conversation_id_kind, correlation_id, metadata_json,\n schema_version, inserted_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const envelope of request.batch.envelopes) {\n const conversationId =\n envelope.conversationId === null ? null : String(envelope.conversationId);\n const conversationKind =\n envelope.conversationId === null ? null : typeof envelope.conversationId;\n insert.run(\n this.options.targetId,\n envelope.producerId,\n envelope.sequence,\n envelope.eventId,\n request.batch.idempotencyKey,\n envelope.occurredAtMs,\n envelope.monotonicNs,\n envelope.source,\n envelope.processKind,\n envelope.level,\n envelope.label,\n conversationId,\n conversationKind,\n envelope.correlationId,\n canonicalJson(envelope.metadata),\n envelope.schemaVersion,\n insertedAtMs,\n );\n }\n }\n\n private insertMetricSamples(request: StoragePersistRequest, _insertedAtMs: number): void {\n const samplesTable = this.options.tableMap.quoted('metricSamples');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const insert = this.options.connection.prepare(\n `INSERT INTO ${samplesTable} (\n target_id, metric_name, definition_version, occurred_at_ms,\n producer_id, sequence, dimension_key, dimensions_json, values_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n const invalidate = this.options.connection.prepare(\n `DELETE FROM ${completionTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n );\n for (const sample of request.samples) {\n insert.run(\n this.options.targetId,\n sample.metricName,\n sample.definitionVersion,\n sample.occurredAtMs,\n sample.producerId,\n sample.sequence,\n sample.dimensionKey,\n canonicalJson(sample.dimensions),\n canonicalJson(sample.values),\n );\n const definition = this.definitions.get(\n this.definitionKey(sample.metricName, sample.definitionVersion),\n );\n if (!definition) {\n throw new Error(\n `Missing registered metric definition ${sample.metricName}:${sample.definitionVersion}`,\n );\n }\n for (const resolutionMs of definition.resolutionsMs) {\n const bucketStartMs = this.bucketStart(sample.occurredAtMs, resolutionMs);\n invalidate.run(\n this.options.targetId,\n sample.metricName,\n sample.definitionVersion,\n resolutionMs,\n bucketStartMs,\n );\n }\n }\n }\n\n private insertExtractionFailures(request: StoragePersistRequest, recordedAtMs: number): void {\n const table = this.options.tableMap.quoted('extractionFailures');\n const insert = this.options.connection.prepare(\n `INSERT OR REPLACE INTO ${table} (\n target_id, metric_name, definition_version, producer_id,\n sequence, reason, recorded_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const failure of request.extractionFailures) {\n insert.run(\n this.options.targetId,\n failure.metricName,\n failure.definitionVersion,\n failure.producerId,\n failure.sequence,\n failure.reason.slice(0, 1_024),\n recordedAtMs,\n );\n }\n }\n\n private upsertCommittedDropCounters(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('committedDropCounters');\n const upsert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, reason, priority, count, first_committed_at_ms, last_committed_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, reason, priority) DO UPDATE SET\n count = MIN(9007199254740991, ${table}.count + excluded.count),\n first_committed_at_ms = MIN(\n ${table}.first_committed_at_ms,\n excluded.first_committed_at_ms\n ),\n last_committed_at_ms = MAX(\n ${table}.last_committed_at_ms,\n excluded.last_committed_at_ms\n )`,\n );\n for (const counter of batch.dropCounters) {\n if (!Number.isSafeInteger(counter.count) || counter.count <= 0) {\n throw new Error('Committed telemetry drop counters must be positive safe integers');\n }\n upsert.run(\n this.options.targetId,\n counter.reason,\n counter.priority,\n counter.count,\n committedAtMs,\n committedAtMs,\n );\n }\n }\n\n private insertBatchAcknowledgement(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('batchAcknowledgements');\n this.options.connection\n .prepare(\n `INSERT INTO ${table} (\n target_id, idempotency_key, producer_id, sequence_start, sequence_end,\n schema_version, checksum, accepted_events, committed_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n this.options.targetId,\n batch.idempotencyKey,\n batch.producerId,\n batch.sequenceStart,\n batch.sequenceEnd,\n batch.schemaVersion,\n batch.checksum,\n batch.envelopes.length,\n committedAtMs,\n );\n }\n\n private updateIngestWatermark(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('ingestWatermarks');\n const lastOccurredAtMs = Math.max(...batch.envelopes.map((envelope) => envelope.occurredAtMs));\n const internalGapCount = batch.sequenceEnd - batch.sequenceStart + 1 - batch.envelopes.length;\n const initialGapCount = batch.sequenceStart + internalGapCount;\n this.options.connection\n .prepare(\n `INSERT INTO ${table} (\n target_id, producer_id, highest_sequence, last_occurred_at_ms,\n last_committed_at_ms, observed_gap_count\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, producer_id) DO UPDATE SET\n observed_gap_count = ${table}.observed_gap_count\n + MAX(0, ? - ${table}.highest_sequence - 1)\n + ?,\n highest_sequence = MAX(${table}.highest_sequence, excluded.highest_sequence),\n last_occurred_at_ms = MAX(${table}.last_occurred_at_ms, excluded.last_occurred_at_ms),\n last_committed_at_ms = excluded.last_committed_at_ms`,\n )\n .run(\n this.options.targetId,\n batch.producerId,\n batch.sequenceEnd,\n lastOccurredAtMs,\n committedAtMs,\n initialGapCount,\n batch.sequenceStart,\n internalGapCount,\n );\n }\n\n private addTimelineFilters(query: TimelineQuery, clauses: string[], params: unknown[]): void {\n const filters: readonly [unknown, string, unknown][] = [\n [\n query.conversationId,\n 'conversation_id = ?',\n query.conversationId === null ? null : String(query.conversationId),\n ],\n [query.source, 'source = ?', query.source],\n [query.label, 'label = ?', query.label],\n [query.level, 'level = ?', query.level],\n [query.producerId, 'producer_id = ?', query.producerId],\n [query.correlationId, 'correlation_id = ?', query.correlationId],\n ];\n for (const [guard, clause, parameter] of filters) {\n if (guard !== null) {\n clauses.push(clause);\n params.push(parameter);\n }\n }\n }\n\n private addTimelineCursor(\n cursor: Readonly<{ occurredAtMs: number; producerId: string; sequence: number }>,\n order: 'asc' | 'desc',\n clauses: string[],\n params: unknown[],\n ): void {\n const comparison = order === 'asc' ? '>' : '<';\n clauses.push(`(\n occurred_at_ms ${comparison} ?\n OR (occurred_at_ms = ? AND producer_id ${comparison} ?)\n OR (occurred_at_ms = ? AND producer_id = ? AND sequence ${comparison} ?)\n )`);\n params.push(\n cursor.occurredAtMs,\n cursor.occurredAtMs,\n cursor.producerId,\n cursor.occurredAtMs,\n cursor.producerId,\n cursor.sequence,\n );\n }\n\n private findDueBucketStarts(\n definition: MetricDefinition,\n resolutionMs: number,\n dueBeforeMs: number,\n ): number[] {\n const sampleTable = this.options.tableMap.quoted('metricSamples');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const rows = this.options.connection\n .prepare(\n `WITH sample_buckets AS (\n SELECT\n CAST(occurred_at_ms / ? AS INTEGER) * ? AS bucket_start_ms,\n COUNT(*) AS sample_count,\n MAX(occurred_at_ms) AS sample_watermark_ms\n FROM ${sampleTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND occurred_at_ms < ?\n AND (CAST(occurred_at_ms / ? AS INTEGER) * ?) + ? <= ?\n GROUP BY bucket_start_ms\n )\n SELECT bucket.bucket_start_ms\n FROM sample_buckets AS bucket\n LEFT JOIN ${completionTable} AS completion\n ON completion.target_id = ?\n AND completion.metric_name = ?\n AND completion.definition_version = ?\n AND completion.resolution_ms = ?\n AND completion.bucket_start_ms = bucket.bucket_start_ms\n WHERE completion.bucket_start_ms IS NULL\n OR completion.sample_count <> bucket.sample_count\n OR completion.sample_watermark_ms <> bucket.sample_watermark_ms\n ORDER BY bucket.bucket_start_ms ASC\n LIMIT 256`,\n )\n .all(\n resolutionMs,\n resolutionMs,\n this.options.targetId,\n definition.name,\n definition.version,\n dueBeforeMs,\n resolutionMs,\n resolutionMs,\n resolutionMs,\n dueBeforeMs,\n this.options.targetId,\n definition.name,\n definition.version,\n resolutionMs,\n );\n return rows.map((row) => this.readNumberField(row, 'bucket_start_ms'));\n }\n\n private loadBucketWork(\n definition: MetricDefinition,\n resolutionMs: number,\n bucketStartMs: number,\n ): MetricBucketWork {\n const table = this.options.tableMap.quoted('metricSamples');\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND occurred_at_ms >= ? AND occurred_at_ms < ?\n ORDER BY occurred_at_ms ASC, producer_id ASC, sequence ASC`,\n )\n .all(\n this.options.targetId,\n definition.name,\n definition.version,\n bucketStartMs,\n bucketStartMs + resolutionMs,\n );\n const samples = rows.map((row) => {\n const parsed = this.rowParser.parseMetricSample(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n return { definition, resolutionMs, bucketStartMs, samples };\n }\n\n private bucketIsCurrent(work: MetricBucketWork): boolean {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const row = this.options.connection\n .prepare(\n `SELECT sample_count, sample_watermark_ms\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n )\n .get(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n if (row === undefined) {\n return false;\n }\n const sampleCount = this.readNumberField(row, 'sample_count');\n const watermark = this.readNumberField(row, 'sample_watermark_ms');\n return sampleCount === work.samples.length && watermark === this.sampleWatermark(work);\n }\n\n private sampleWatermark(work: MetricBucketWork): number {\n return work.samples.length === 0\n ? work.bucketStartMs\n : Math.max(...work.samples.map((sample) => sample.occurred_at_ms));\n }\n\n private materializeBucket(work: MetricBucketWork, materializedAtMs: number): number {\n const normalized = this.normalizeSamplesForCardinality(work);\n const groups = this.aggregateSamples(work.definition.measurements, normalized);\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const transaction = this.options.connection.transaction(() => {\n this.options.connection\n .prepare(\n `DELETE FROM ${rollupTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n )\n .run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n const insert = this.options.connection.prepare(\n `INSERT INTO ${rollupTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, dimension_key, dimensions_json, values_json,\n materialized_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const [dimensionKey, group] of groups) {\n insert.run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n dimensionKey,\n group.dimensionsJson,\n canonicalJson(group.values),\n materializedAtMs,\n );\n }\n this.options.connection\n .prepare(\n `INSERT INTO ${completionTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, sample_count, sample_watermark_ms, completed_at_ms,\n state, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'completed', NULL)\n ON CONFLICT(\n target_id, metric_name, definition_version, resolution_ms, bucket_start_ms\n ) DO UPDATE SET\n sample_count = excluded.sample_count,\n sample_watermark_ms = excluded.sample_watermark_ms,\n completed_at_ms = excluded.completed_at_ms,\n state = 'completed',\n detail = NULL`,\n )\n .run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n work.samples.length,\n this.sampleWatermark(work),\n materializedAtMs,\n );\n });\n transaction();\n return groups.size;\n }\n\n private recordRejectedBucket(\n work: MetricBucketWork,\n recordedAtMs: number,\n detail: string,\n ): void {\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const transaction = this.options.connection.transaction(() => {\n this.options.connection.prepare(\n `DELETE FROM ${rollupTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n ).run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n this.options.connection.prepare(\n `INSERT INTO ${completionTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, sample_count, sample_watermark_ms, completed_at_ms,\n state, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'rejected', ?)\n ON CONFLICT(\n target_id, metric_name, definition_version, resolution_ms, bucket_start_ms\n ) DO UPDATE SET\n sample_count = excluded.sample_count,\n sample_watermark_ms = excluded.sample_watermark_ms,\n completed_at_ms = excluded.completed_at_ms,\n state = 'rejected',\n detail = excluded.detail`,\n ).run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n work.samples.length,\n this.sampleWatermark(work),\n recordedAtMs,\n detail.slice(0, 1_024),\n );\n });\n transaction();\n }\n\n private rollupStageDetail(\n rejectedBucketCount: number,\n examples: readonly string[],\n workBudgetReached: boolean,\n ): string | null {\n const rejected = rejectedBucketCount === 0\n ? null\n : `cardinality-rejected-buckets=${rejectedBucketCount}; ${examples.join('; ')}`;\n const detail = workBudgetReached\n ? ['work-budget-reached', rejected].filter((value) => value !== null).join('; ')\n : rejected;\n return detail?.slice(0, 2_048) ?? null;\n }\n\n private normalizeSamplesForCardinality(work: MetricBucketWork): NormalizedMetricSample[] {\n const admittedByField = new Map<string, Set<string>>();\n const normalized: NormalizedMetricSample[] = [];\n for (const sample of work.samples) {\n const dimensions = this.rowParser.parseJsonObject(sample.dimensions_json);\n const values = this.rowParser.parseNumericValues(sample.values_json);\n if (!dimensions.ok) {\n throw new Error(dimensions.error);\n }\n if (!values.ok) {\n throw new Error(values.error);\n }\n const admittedDimensions: Record<string, TelemetryJsonValue> = { ...dimensions.value };\n let dropSample = false;\n for (const field of work.definition.groupBy) {\n const rule = work.definition.cardinality[field];\n if (!rule) {\n throw new Error(`Missing cardinality rule for ${field}`);\n }\n const dimensionValue = admittedDimensions[field];\n const valueKey = canonicalJson(dimensionValue);\n const admittedValues = admittedByField.get(field) ?? new Set<string>();\n if (!admittedValues.has(valueKey) && admittedValues.size >= rule.maxValuesPerBucket) {\n if (rule.overflow === 'other') {\n admittedDimensions[field] = '__telemetry_other__';\n } else if (rule.overflow === 'reject') {\n throw new MetricCardinalityRejectionError(\n `Metric ${work.definition.name} rejected cardinality overflow for ${field}`,\n );\n } else {\n dropSample = true;\n break;\n }\n } else {\n admittedValues.add(valueKey);\n admittedByField.set(field, admittedValues);\n }\n }\n if (dropSample) {\n continue;\n }\n const dimensionsJson = canonicalJson(admittedDimensions);\n normalized.push({\n dimensionKey: dimensionsJson,\n dimensionsJson,\n values: values.value,\n occurredAtMs: sample.occurred_at_ms,\n producerId: sample.producer_id,\n sequence: sample.sequence,\n });\n }\n return normalized;\n }\n\n private aggregateSamples(\n measurements: readonly MetricMeasurement[],\n samples: readonly NormalizedMetricSample[],\n ): Map<string, MutableMaterializedMetricGroup> {\n const groups = new Map<string, MutableMaterializedMetricGroup>();\n const fields = measurements\n .filter((measurement): measurement is Extract<MetricMeasurement, { kind: 'field' }> => {\n return measurement.kind === 'field';\n })\n .map((measurement) => measurement.field);\n for (const sample of samples) {\n const group = groups.get(sample.dimensionKey) ?? {\n dimensionsJson: sample.dimensionsJson,\n values: { count: 0, fields: {} },\n };\n group.values.count += 1;\n for (const field of fields) {\n const measured = sample.values[field];\n if (measured === undefined) {\n continue;\n }\n const aggregate = group.values.fields[field] ?? this.newFieldAggregate(measured, sample);\n aggregate.count += group.values.fields[field] === undefined ? 0 : 1;\n aggregate.sum += group.values.fields[field] === undefined ? 0 : measured;\n aggregate.min = Math.min(aggregate.min, measured);\n aggregate.max = Math.max(aggregate.max, measured);\n aggregate.last = measured;\n aggregate.lastOccurredAtMs = sample.occurredAtMs;\n aggregate.lastProducerId = sample.producerId;\n aggregate.lastSequence = sample.sequence;\n group.values.fields[field] = aggregate;\n }\n groups.set(sample.dimensionKey, group);\n }\n return groups;\n }\n\n private newFieldAggregate(\n measured: number,\n sample: NormalizedMetricSample,\n ): MutableMetricFieldAggregate {\n return {\n count: 1,\n sum: measured,\n min: measured,\n max: measured,\n last: measured,\n lastOccurredAtMs: sample.occurredAtMs,\n lastProducerId: sample.producerId,\n lastSequence: sample.sequence,\n };\n }\n\n /**\n * Raw retention is purely time-based, matching the native collector: every\n * expired row goes in one set-based statement per level band. No page size,\n * no row cap, and no rollup-completion gate — metric samples are extracted at\n * ingest and retained on their own clock, so dropping a raw row costs no\n * metric fidelity, and no row can outlive its window waiting on a rollup.\n */\n private createRawEventRetentionStep(nowMs: number): RetentionStep {\n const table = this.options.tableMap.quoted('rawEvents');\n const levelMs = this.options.retention.levelMs ?? {};\n const levels = Object.keys(levelMs);\n const removeByLevel = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND lower(coalesce(level, '')) = ? AND occurred_at_ms < ?`,\n );\n const fallbackPlaceholders = levels.map(() => '?').join(', ');\n const removeFallback = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?` +\n (levels.length === 0\n ? ''\n : ` AND lower(coalesce(level, '')) NOT IN (${fallbackPlaceholders})`),\n );\n let done = false;\n return (): RetentionStepOutcome => {\n if (done) {\n return { deleted: 0, done: true };\n }\n done = true;\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const level of levels) {\n const retainMs = levelMs[level];\n if (retainMs === undefined) {\n continue;\n }\n deleted += removeByLevel.run(this.options.targetId, level, nowMs - retainMs).changes;\n }\n deleted += removeFallback.run(\n this.options.targetId,\n nowMs - this.options.retention.rawMs,\n ...levels,\n ).changes;\n return deleted;\n });\n return { deleted: transaction(), done: true };\n };\n }\n\n private rawEventHasRequiredRollups(envelope: TelemetryEnvelope): boolean {\n const applicable = [...this.definitions.values()].filter((definition) => {\n return this.definitionContract.matches(definition.selector, envelope.label);\n });\n return applicable.every((definition) => {\n if (!this.metricSampleExists(definition, envelope)) {\n return true;\n }\n return definition.resolutionsMs.every((resolutionMs) => {\n return this.hasCompletion(\n definition.name,\n definition.version,\n resolutionMs,\n this.bucketStart(envelope.occurredAtMs, resolutionMs),\n );\n });\n });\n }\n\n private metricSampleExists(definition: MetricDefinition, envelope: TelemetryEnvelope): boolean {\n const table = this.options.tableMap.quoted('metricSamples');\n const row = this.options.connection\n .prepare(\n `SELECT 1 AS present\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND producer_id = ? AND sequence = ?`,\n )\n .get(\n this.options.targetId,\n definition.name,\n definition.version,\n envelope.producerId,\n envelope.sequence,\n );\n return row !== undefined;\n }\n\n private createSampleRetentionStep(nowMs: number): RetentionStep {\n const cutoffMs = nowMs - this.options.retention.samplesMs;\n const table = this.options.tableMap.quoted('metricSamples');\n const readFirstPage = this.options.connection.prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?\n ORDER BY occurred_at_ms ASC, metric_name ASC, definition_version ASC,\n producer_id ASC, sequence ASC\n LIMIT ${RETENTION_PAGE_SIZE}`,\n );\n const readNextPage = this.options.connection.prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?\n AND (\n occurred_at_ms, metric_name, definition_version, producer_id, sequence\n ) > (?, ?, ?, ?, ?)\n ORDER BY occurred_at_ms ASC, metric_name ASC, definition_version ASC,\n producer_id ASC, sequence ASC\n LIMIT ${RETENTION_PAGE_SIZE}`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND producer_id = ? AND sequence = ?`,\n );\n let cursor: SampleRetentionCursor | null = null;\n return (): RetentionStepOutcome => {\n const rows: unknown[] = cursor === null\n ? readFirstPage.all(this.options.targetId, cutoffMs)\n : readNextPage.all(\n this.options.targetId,\n cutoffMs,\n cursor.occurredAtMs,\n cursor.metricName,\n cursor.definitionVersion,\n cursor.producerId,\n cursor.sequence,\n );\n if (rows.length === 0) {\n return { deleted: 0, done: true };\n }\n const samples: MetricSampleRow[] = rows.map((row) => {\n const parsed = this.rowParser.parseMetricSample(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const sample of samples) {\n const definition = this.definitions.get(\n this.definitionKey(sample.metric_name, sample.definition_version),\n );\n if (!definition) {\n continue;\n }\n const complete = definition.resolutionsMs.every((resolutionMs) => {\n return this.hasCompletion(\n definition.name,\n definition.version,\n resolutionMs,\n this.bucketStart(sample.occurred_at_ms, resolutionMs),\n );\n });\n if (complete) {\n deleted += remove.run(\n this.options.targetId,\n sample.metric_name,\n sample.definition_version,\n sample.producer_id,\n sample.sequence,\n ).changes;\n }\n }\n return deleted;\n });\n const deleted = transaction();\n const last = samples[samples.length - 1];\n if (last === undefined || rows.length < RETENTION_PAGE_SIZE) {\n return { deleted, done: true };\n }\n cursor = {\n occurredAtMs: last.occurred_at_ms,\n metricName: last.metric_name,\n definitionVersion: last.definition_version,\n producerId: last.producer_id,\n sequence: last.sequence,\n };\n return { deleted, done: false };\n };\n }\n\n private createRollupRetentionSteps(nowMs: number): RetentionStep[] {\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const steps: RetentionStep[] = [];\n for (const tier of this.options.retention.rollups) {\n const cutoffMs = nowMs - tier.retainMs;\n steps.push(this.createExpiredRollupStep(rollupTable, tier.resolutionMs, cutoffMs, false));\n steps.push(this.createExpiredRollupStep(completionTable, tier.resolutionMs, cutoffMs, true));\n }\n return steps;\n }\n\n private createExpiredRollupStep(\n table: string,\n resolutionMs: number,\n cutoffMs: number,\n completedOnly: boolean,\n ): RetentionStep {\n const statePredicate = completedOnly ? \" AND state = 'completed'\" : '';\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND resolution_ms = ? AND bucket_start_ms < ?${statePredicate}\n ORDER BY bucket_start_ms ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, resolutionMs, cutoffMs).changes,\n );\n }\n\n private createPagedDeleteStep(deletePage: () => number): RetentionStep {\n return (): RetentionStepOutcome => {\n const changes = deletePage();\n return { deleted: changes, done: changes < RETENTION_PAGE_SIZE };\n };\n }\n\n private createAuxiliaryRetentionSteps(nowMs: number): RetentionStep[] {\n const acknowledgementCutoffMs = nowMs - this.acknowledgementRetentionMs();\n const ingestionCutoffMs = nowMs - this.longestRetentionMs();\n const extractionCutoffMs = nowMs - this.options.retention.samplesMs;\n return [\n this.createRowsBeforeStep('batchAcknowledgements', 'committed_at_ms', acknowledgementCutoffMs),\n this.createRowsBeforeStep('extractionFailures', 'recorded_at_ms', extractionCutoffMs),\n this.createFinishedMaintenanceRunStep(acknowledgementCutoffMs),\n ...this.createReaderLeaseSteps(nowMs),\n this.createStaleIngestWatermarkStep(ingestionCutoffMs),\n this.createUnreferencedMetricDefinitionStep(),\n ];\n }\n\n private createRowsBeforeStep(\n logicalTable: 'batchAcknowledgements' | 'extractionFailures',\n timestampColumn: 'committed_at_ms' | 'recorded_at_ms',\n cutoffMs: number,\n ): RetentionStep {\n const table = this.options.tableMap.quoted(logicalTable);\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND ${timestampColumn} < ?\n ORDER BY ${timestampColumn} ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs).changes,\n );\n }\n\n private createFinishedMaintenanceRunStep(cutoffMs: number): RetentionStep {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state IN ('completed', 'failed')\n AND COALESCE(completed_at_ms, started_at_ms) < ?\n ORDER BY COALESCE(completed_at_ms, started_at_ms) ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs).changes,\n );\n }\n\n private createReaderLeaseSteps(nowMs: number): RetentionStep[] {\n const table = this.options.tableMap.quoted('readerLeases');\n const expire = this.options.connection.prepare(\n `UPDATE ${table}\n SET state = 'expired'\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state = 'active' AND expires_at_ms <= ?\n ORDER BY expires_at_ms ASC\n LIMIT 500\n )`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state IN ('released', 'expired')\n AND expires_at_ms <= ?\n ORDER BY expires_at_ms ASC\n LIMIT 500\n )`,\n );\n return [\n this.createPagedDeleteStep(() => expire.run(this.options.targetId, nowMs).changes),\n this.createPagedDeleteStep(() => remove.run(this.options.targetId, nowMs).changes),\n ];\n }\n\n private createStaleIngestWatermarkStep(cutoffMs: number): RetentionStep {\n const watermarks = this.options.tableMap.quoted('ingestWatermarks');\n const acknowledgements = this.options.tableMap.quoted('batchAcknowledgements');\n const rawEvents = this.options.tableMap.quoted('rawEvents');\n const samples = this.options.tableMap.quoted('metricSamples');\n const failures = this.options.tableMap.quoted('extractionFailures');\n const remove = this.options.connection.prepare(\n `DELETE FROM ${watermarks}\n WHERE rowid IN (\n SELECT watermark.rowid\n FROM ${watermarks} AS watermark\n WHERE watermark.target_id = ?\n AND watermark.last_occurred_at_ms < ?\n AND watermark.last_committed_at_ms < ?\n AND NOT EXISTS (\n SELECT 1 FROM ${acknowledgements} AS acknowledgement\n WHERE acknowledgement.target_id = watermark.target_id\n AND acknowledgement.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${rawEvents} AS raw_event\n WHERE raw_event.target_id = watermark.target_id\n AND raw_event.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${samples} AS sample\n WHERE sample.target_id = watermark.target_id\n AND sample.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${failures} AS failure\n WHERE failure.target_id = watermark.target_id\n AND failure.producer_id = watermark.producer_id\n )\n ORDER BY watermark.last_committed_at_ms ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs, cutoffMs).changes,\n );\n }\n\n private createUnreferencedMetricDefinitionStep(): RetentionStep {\n const definitions = this.options.tableMap.quoted('metricDefinitions');\n const samples = this.options.tableMap.quoted('metricSamples');\n const rollups = this.options.tableMap.quoted('metricRollups');\n const completions = this.options.tableMap.quoted('rollupCompletions');\n const failures = this.options.tableMap.quoted('extractionFailures');\n const read = this.options.connection.prepare(\n `SELECT definition.metric_name, definition.definition_version\n FROM ${definitions} AS definition\n WHERE definition.target_id = ? AND definition.active = 0\n AND NOT EXISTS (\n SELECT 1 FROM ${samples} AS sample\n WHERE sample.target_id = definition.target_id\n AND sample.metric_name = definition.metric_name\n AND sample.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${rollups} AS rollup\n WHERE rollup.target_id = definition.target_id\n AND rollup.metric_name = definition.metric_name\n AND rollup.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${completions} AS completion\n WHERE completion.target_id = definition.target_id\n AND completion.metric_name = definition.metric_name\n AND completion.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${failures} AS failure\n WHERE failure.target_id = definition.target_id\n AND failure.metric_name = definition.metric_name\n AND failure.definition_version = definition.definition_version\n )\n ORDER BY definition.registered_at_ms ASC\n LIMIT 500`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${definitions}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ? AND active = 0`,\n );\n return (): RetentionStepOutcome => {\n const rows = read.all(this.options.targetId).map((row) => ({\n metricName: this.readStringField(row, 'metric_name'),\n definitionVersion: this.readNumberField(row, 'definition_version'),\n }));\n if (rows.length === 0) {\n return { deleted: 0, done: true };\n }\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const row of rows) {\n deleted += remove.run(\n this.options.targetId,\n row.metricName,\n row.definitionVersion,\n ).changes;\n }\n return deleted;\n });\n const deleted = transaction();\n for (const row of rows) {\n this.definitions.delete(this.definitionKey(row.metricName, row.definitionVersion));\n }\n return { deleted, done: deleted === 0 || rows.length < RETENTION_PAGE_SIZE };\n };\n }\n\n private acknowledgementRetentionMs(): number {\n return this.options.retention.rawMs + this.options.retention.lateArrivalMs;\n }\n\n private longestRetentionMs(): number {\n return Math.max(\n this.options.retention.rawMs,\n this.options.retention.samplesMs,\n ...this.options.retention.rollups.map((tier) => tier.retainMs),\n );\n }\n\n private hasCompletion(\n metricName: string,\n definitionVersion: number,\n resolutionMs: number,\n bucketStartMs: number,\n ): boolean {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const row = this.options.connection\n .prepare(\n `SELECT 1 AS present FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?\n AND state = 'completed'`,\n )\n .get(this.options.targetId, metricName, definitionVersion, resolutionMs, bucketStartMs);\n return row !== undefined;\n }\n\n private metricDefinitions(metricName: string): MetricDefinition[] {\n return [...this.definitions.values()]\n .filter((definition) => definition.name === metricName)\n .sort((left, right) => left.version - right.version);\n }\n\n private validateMetricQuery(\n query: MetricQuery,\n definitions: readonly MetricDefinition[],\n ): string | null {\n const dimensionSets = definitions.map((definition) => new Set(definition.groupBy));\n const invalidDimension = Object.keys(query.where).find((field) => {\n return dimensionSets.some((dimensions) => !dimensions.has(field));\n });\n if (invalidDimension) {\n return `Metric ${query.metric} does not declare dimension ${invalidDimension}`;\n }\n if (query.resolution !== 'auto') {\n const explicitResolution = query.resolution;\n const unavailable = definitions.every(\n (definition) => !definition.resolutionsMs.includes(explicitResolution),\n );\n if (unavailable) {\n return `Resolution ${query.resolution} is not configured for metric ${query.metric}`;\n }\n }\n const invalidMeasurement = query.measurements.find((measurement) => {\n return definitions.some((definition) =>\n !this.definitionHasMeasurement(definition, measurement),\n );\n });\n return invalidMeasurement\n ? `Metric ${query.metric} does not declare measurement ${invalidMeasurement}`\n : null;\n }\n\n private definitionHasMeasurement(definition: MetricDefinition, requested: string): boolean {\n if (requested === 'count') {\n return definition.measurements.some((measurement) => measurement.kind === 'count');\n }\n const [field, aggregate] = requested.split('.');\n if (!field || !aggregate) {\n return false;\n }\n return definition.measurements.some((measurement) => {\n return (\n measurement.kind === 'field' &&\n measurement.field === field &&\n ((aggregate === 'avg' && measurement.aggregates.includes('sum')) ||\n (this.isMetricAggregate(aggregate) && measurement.aggregates.includes(aggregate)))\n );\n });\n }\n\n private planCoverage(\n query: MetricQuery,\n definitions: readonly MetricDefinition[],\n ): Readonly<{\n intervals: readonly RollupCoverageInterval[];\n gaps: readonly MetricQueryGap[];\n }> {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const rows = this.options.connection\n .prepare(\n `SELECT definition_version, resolution_ms, bucket_start_ms\n FROM ${table}\n WHERE target_id = ? AND metric_name = ?\n AND state = 'completed'\n AND bucket_start_ms < ?\n AND bucket_start_ms + resolution_ms > ?\n ORDER BY bucket_start_ms ASC, resolution_ms ASC, definition_version DESC`,\n )\n .all(this.options.targetId, query.metric, query.toMs, query.fromMs);\n const definitionVersions = new Set(definitions.map((definition) => definition.version));\n const available = rows\n .map((row) => ({\n fromMs: this.readNumberField(row, 'bucket_start_ms'),\n toMs:\n this.readNumberField(row, 'bucket_start_ms') +\n this.readNumberField(row, 'resolution_ms'),\n definitionVersion: this.readNumberField(row, 'definition_version'),\n resolutionMs: this.readNumberField(row, 'resolution_ms'),\n }))\n .filter((row) => {\n return (\n definitionVersions.has(row.definitionVersion) &&\n (query.resolution === 'auto' || row.resolutionMs === query.resolution)\n );\n });\n const intervals: RollupCoverageInterval[] = [];\n for (const definition of definitions) {\n const versionCandidates = available.filter(\n (candidate) => candidate.definitionVersion === definition.version,\n );\n intervals.push(...this.planDefinitionCoverage(query, versionCandidates));\n }\n const orderedIntervals = intervals.sort((left, right) => {\n return (\n left.fromMs - right.fromMs ||\n left.definitionVersion - right.definitionVersion ||\n left.resolutionMs - right.resolutionMs\n );\n });\n return {\n intervals: orderedIntervals,\n gaps: this.coverageGaps(query, orderedIntervals, available),\n };\n }\n\n private planDefinitionCoverage(\n query: MetricQuery,\n candidates: readonly RollupCoverageInterval[],\n ): readonly RollupCoverageInterval[] {\n const contained = candidates.filter((candidate) => {\n return candidate.fromMs >= query.fromMs && candidate.toMs <= query.toMs;\n });\n const intervals: RollupCoverageInterval[] = [];\n let cursor = query.fromMs;\n while (cursor < query.toMs) {\n const starting = contained\n .filter((candidate) => candidate.fromMs === cursor)\n .sort((left, right) => left.resolutionMs - right.resolutionMs);\n const chosen = starting[0];\n if (chosen) {\n this.appendCoverageInterval(intervals, chosen);\n cursor = chosen.toMs;\n continue;\n }\n const nextStart = contained\n .map((candidate) => candidate.fromMs)\n .filter((startMs) => startMs > cursor)\n .sort((left, right) => left - right)[0];\n cursor = nextStart ?? query.toMs;\n }\n return intervals;\n }\n\n private appendCoverageInterval(\n intervals: RollupCoverageInterval[],\n candidate: RollupCoverageInterval,\n ): void {\n const previous = intervals[intervals.length - 1];\n const extendsPrevious =\n previous !== undefined &&\n previous.toMs === candidate.fromMs &&\n previous.resolutionMs === candidate.resolutionMs &&\n previous.definitionVersion === candidate.definitionVersion;\n if (extendsPrevious) {\n intervals[intervals.length - 1] = { ...previous, toMs: candidate.toMs };\n return;\n }\n intervals.push(candidate);\n }\n\n private coverageGaps(\n query: MetricQuery,\n intervals: readonly RollupCoverageInterval[],\n candidates: readonly RollupCoverageInterval[],\n ): readonly MetricQueryGap[] {\n const coverage = [...intervals].sort(\n (left, right) => left.fromMs - right.fromMs || right.toMs - left.toMs,\n );\n const gaps: MetricQueryGap[] = [];\n let cursor = query.fromMs;\n for (const interval of coverage) {\n if (interval.fromMs > cursor) {\n this.appendSplitCoverageGaps(gaps, cursor, interval.fromMs, query, candidates);\n }\n cursor = Math.max(cursor, interval.toMs);\n }\n if (cursor < query.toMs) {\n this.appendSplitCoverageGaps(gaps, cursor, query.toMs, query, candidates);\n }\n return Object.freeze(gaps);\n }\n\n private appendSplitCoverageGaps(\n gaps: MetricQueryGap[],\n fromMs: number,\n toMs: number,\n query: MetricQuery,\n candidates: readonly RollupCoverageInterval[],\n ): void {\n const partialCandidates = candidates.filter((candidate) => {\n const outsideQuery = candidate.fromMs < query.fromMs || candidate.toMs > query.toMs;\n return outsideQuery && candidate.fromMs < toMs && candidate.toMs > fromMs;\n });\n const boundaries = new Set<number>([fromMs, toMs]);\n for (const candidate of partialCandidates) {\n boundaries.add(Math.max(fromMs, candidate.fromMs));\n boundaries.add(Math.min(toMs, candidate.toMs));\n }\n const ordered = [...boundaries].sort((left, right) => left - right);\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const gapStart = ordered[index];\n const gapEnd = ordered[index + 1];\n if (gapStart === undefined || gapEnd === undefined || gapStart >= gapEnd) {\n continue;\n }\n const isPartialBucket = partialCandidates.some((candidate) => {\n return candidate.fromMs < gapEnd && candidate.toMs > gapStart;\n });\n this.appendMetricGap(gaps, {\n fromMs: gapStart,\n toMs: gapEnd,\n reason: isPartialBucket ? 'partial-bucket' : 'not-materialized',\n });\n }\n }\n\n private appendMetricGap(gaps: MetricQueryGap[], gap: MetricQueryGap): void {\n const previous = gaps[gaps.length - 1];\n if (previous && previous.toMs === gap.fromMs && previous.reason === gap.reason) {\n gaps[gaps.length - 1] = { ...previous, toMs: gap.toMs };\n return;\n }\n gaps.push(gap);\n }\n\n private readRollupsForCoverage(\n query: MetricQuery,\n intervals: readonly RollupCoverageInterval[],\n ): Array<\n Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>\n > {\n const table = this.options.tableMap.quoted('metricRollups');\n const parsedRows = [];\n for (const interval of intervals) {\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, resolution_ms, bucket_start_ms,\n dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms >= ?\n AND bucket_start_ms + resolution_ms <= ?`,\n )\n .all(\n this.options.targetId,\n query.metric,\n interval.definitionVersion,\n interval.resolutionMs,\n interval.fromMs,\n interval.toMs,\n );\n for (const row of rows) {\n const parsed = this.rowParser.parseMetricRollup(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n const dimensions = this.rowParser.parseJsonObject(parsed.value.dimensions_json);\n const values = this.rowParser.parseRollupValues(parsed.value.values_json);\n if (!dimensions.ok) {\n throw new Error(dimensions.error);\n }\n if (!values.ok) {\n throw new Error(values.error);\n }\n parsedRows.push({\n bucket: {\n startMs: parsed.value.bucket_start_ms,\n endMs: parsed.value.bucket_start_ms + parsed.value.resolution_ms,\n dimensions: dimensions.value,\n values: this.rollupValuesToJson(values.value),\n },\n resolutionMs: parsed.value.resolution_ms,\n definitionVersion: parsed.value.definition_version,\n dimensionKey: parsed.value.dimension_key,\n });\n }\n }\n return parsedRows;\n }\n\n private rollupValuesToJson(values: MetricRollupValues): TelemetryJsonObject {\n const fields: Record<string, TelemetryJsonValue> = {};\n for (const [field, aggregate] of Object.entries(values.fields)) {\n fields[field] = {\n count: aggregate.count,\n sum: aggregate.sum,\n min: aggregate.min,\n max: aggregate.max,\n last: aggregate.last,\n avg: aggregate.count === 0 ? 0 : aggregate.sum / aggregate.count,\n };\n }\n return Object.freeze({ count: values.count, ...fields });\n }\n\n private selectMeasurements(\n values: TelemetryJsonObject,\n measurements: readonly string[],\n ): TelemetryJsonObject {\n const selected: Record<string, TelemetryJsonValue> = {};\n for (const measurement of measurements) {\n if (measurement === 'count') {\n selected.count = values.count ?? 0;\n continue;\n }\n const [field, aggregate] = measurement.split('.');\n const fieldValues = field ? values[field] : null;\n if (!field || !aggregate) {\n continue;\n }\n if (!this.isJsonObject(fieldValues)) {\n continue;\n }\n const existing = selected[field];\n const selectedField: Record<string, TelemetryJsonValue> = this.isJsonObject(existing)\n ? { ...existing }\n : {};\n const aggregateValue = fieldValues[aggregate];\n if (aggregateValue !== undefined) {\n selectedField[aggregate] = aggregateValue;\n }\n selected[field] = selectedField;\n }\n return Object.freeze(selected);\n }\n\n private matchesWhere(\n dimensions: TelemetryJsonObject,\n where: Readonly<Record<string, MetricDimensionFilter>>,\n ): boolean {\n return Object.entries(where).every(([field, expected]) => {\n const actual = dimensions[field];\n const candidates = Array.isArray(expected) ? expected : [expected];\n return candidates.some((candidate) => canonicalJson(candidate) === canonicalJson(actual));\n });\n }\n\n private compareParsedRollups(\n left: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n right: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n order: 'asc' | 'desc',\n ): number {\n const direction = order === 'asc' ? 1 : -1;\n return (\n direction *\n this.compareRollupIdentity(\n left.bucket.startMs,\n left.resolutionMs,\n left.definitionVersion,\n left.dimensionKey,\n right.bucket.startMs,\n right.resolutionMs,\n right.definitionVersion,\n right.dimensionKey,\n )\n );\n }\n\n private isAfterMetricCursor(\n row: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n cursor: Readonly<{\n bucketStartMs: number;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n order: 'asc' | 'desc',\n ): boolean {\n const comparison = this.compareRollupIdentity(\n row.bucket.startMs,\n row.resolutionMs,\n row.definitionVersion,\n row.dimensionKey,\n cursor.bucketStartMs,\n cursor.resolutionMs,\n cursor.definitionVersion,\n cursor.dimensionKey,\n );\n return order === 'asc' ? comparison > 0 : comparison < 0;\n }\n\n private compareRollupIdentity(\n leftStartMs: number,\n leftResolutionMs: number,\n leftDefinitionVersion: number,\n leftDimensionKey: string,\n rightStartMs: number,\n rightResolutionMs: number,\n rightDefinitionVersion: number,\n rightDimensionKey: string,\n ): number {\n return (\n leftStartMs - rightStartMs ||\n leftResolutionMs - rightResolutionMs ||\n leftDefinitionVersion - rightDefinitionVersion ||\n leftDimensionKey.localeCompare(rightDimensionKey)\n );\n }\n\n private rowsToSegments(\n intervals: readonly RollupCoverageInterval[],\n rows: readonly Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>[],\n ): readonly MetricQuerySegment[] {\n return Object.freeze(\n intervals.map((interval) => ({\n fromMs: interval.fromMs,\n toMs: interval.toMs,\n resolutionMs: interval.resolutionMs,\n isAggregated: true as const,\n definitionVersion: interval.definitionVersion,\n buckets: Object.freeze(\n rows\n .filter(\n (row) =>\n row.resolutionMs === interval.resolutionMs &&\n row.definitionVersion === interval.definitionVersion &&\n row.bucket.startMs >= interval.fromMs &&\n row.bucket.endMs <= interval.toMs,\n )\n .map((row) => row.bucket),\n ),\n })),\n );\n }\n\n private committedTargetState(attempts: number): TelemetryAcknowledgement['targetStates'][number] {\n return {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'committed',\n attempts,\n reason: null,\n };\n }\n\n private definitionKey(name: string, version: number): string {\n return `${name}:${version}`;\n }\n\n private normalizeDefinitions(\n definitions: readonly MetricDefinition[],\n ): readonly MetricDefinition[] {\n return definitions.map((definition) => {\n const normalized = this.definitionContract.normalize(definition);\n if (!normalized.ok) {\n throw new Error(normalized.error);\n }\n return normalized.value;\n });\n }\n\n private bucketStart(occurredAtMs: number, resolutionMs: number): number {\n return Math.floor(occurredAtMs / resolutionMs) * resolutionMs;\n }\n\n private encodeCursor(cursor: object): string {\n return Buffer.from(canonicalJson(cursor), 'utf8').toString('base64url');\n }\n\n private readStringField(row: unknown, field: string): string {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error(`Expected a SQLite row while reading ${field}`);\n }\n const value = Reflect.get(row, field);\n if (typeof value !== 'string') {\n throw new Error(`Expected string field ${field}`);\n }\n return value;\n }\n\n private readNumberField(row: unknown, field: string): number {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error(`Expected a SQLite row while reading ${field}`);\n }\n const value = Reflect.get(row, field);\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Expected numeric field ${field}`);\n }\n return value;\n }\n\n private parseCommittedDropCounter(row: unknown): TelemetryDropCounter {\n const reason = this.readStringField(row, 'reason');\n const priority = this.readStringField(row, 'priority');\n const count = this.readNumberField(row, 'count');\n if (!this.isDropReason(reason) || !this.isDropPriority(priority)) {\n throw new Error('Stored committed telemetry drop counter identity is invalid');\n }\n if (!Number.isSafeInteger(count) || count < 0) {\n throw new Error('Stored committed telemetry drop counter value is invalid');\n }\n return Object.freeze({ reason, priority, count });\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n\n private isJsonObject(value: TelemetryJsonValue | undefined): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private isMetricAggregate(value: string): value is MetricAggregate {\n return value === 'sum' || value === 'min' || value === 'max' || value === 'last';\n }\n\n private isDropReason(value: string): value is TelemetryDropCounter['reason'] {\n return (\n value === 'capacity' ||\n value === 'sampled' ||\n value === 'stopped' ||\n value === 'invalid' ||\n value === 'transport'\n );\n }\n\n private isDropPriority(value: string): value is TelemetryDropCounter['priority'] {\n return value === 'low' || value === 'normal' || value === 'high';\n }\n}\n","import { z } from 'zod';\n\nconst integer = z.number().int();\n\nexport const RawTelemetryEventRowSchema = z\n .object({\n producer_id: z.string(),\n sequence: integer.nonnegative(),\n event_id: z.string(),\n occurred_at_ms: integer,\n monotonic_ns: z.string().nullable(),\n source: z.string(),\n process_kind: z.string(),\n level: z.string(),\n label: z.string(),\n conversation_id: z.string().nullable(),\n conversation_id_kind: z.enum(['string', 'number']).nullable(),\n correlation_id: z.string().nullable(),\n metadata_json: z.string(),\n schema_version: integer.positive(),\n })\n .strict();\n\nexport type RawTelemetryEventRow = z.infer<typeof RawTelemetryEventRowSchema>;\n\nexport const BatchAcknowledgementRowSchema = z\n .object({\n idempotency_key: z.string(),\n producer_id: z.string(),\n sequence_start: integer.nonnegative(),\n sequence_end: integer.nonnegative(),\n schema_version: integer.positive(),\n checksum: z.string(),\n accepted_events: integer.nonnegative(),\n committed_at_ms: integer,\n })\n .strict();\n\nexport type BatchAcknowledgementRow = z.infer<typeof BatchAcknowledgementRowSchema>;\n\nexport const MetricSampleRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n occurred_at_ms: integer,\n producer_id: z.string(),\n sequence: integer.nonnegative(),\n dimension_key: z.string(),\n dimensions_json: z.string(),\n values_json: z.string(),\n })\n .strict();\n\nexport type MetricSampleRow = z.infer<typeof MetricSampleRowSchema>;\n\nexport const MetricRollupRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n resolution_ms: integer.positive(),\n bucket_start_ms: integer,\n dimension_key: z.string(),\n dimensions_json: z.string(),\n values_json: z.string(),\n })\n .strict();\n\nexport type MetricRollupRow = z.infer<typeof MetricRollupRowSchema>;\n\nexport const RollupCompletionRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n resolution_ms: integer.positive(),\n bucket_start_ms: integer,\n sample_count: integer.nonnegative(),\n sample_watermark_ms: integer,\n completed_at_ms: integer,\n state: z.enum(['completed', 'rejected']),\n detail: z.string().nullable(),\n })\n .strict();\n\nexport type RollupCompletionRow = z.infer<typeof RollupCompletionRowSchema>;\n\nexport const TimelineCursorSchema = z\n .object({\n version: z.literal(1),\n order: z.enum(['asc', 'desc']),\n occurredAtMs: integer,\n producerId: z.string(),\n sequence: integer.nonnegative(),\n })\n .strict();\n\nexport type TimelineCursor = z.infer<typeof TimelineCursorSchema>;\n\nexport const MetricCursorSchema = z\n .object({\n version: z.literal(1),\n order: z.enum(['asc', 'desc']),\n bucketStartMs: integer,\n resolutionMs: integer.positive(),\n definitionVersion: integer.positive(),\n dimensionKey: z.string(),\n })\n .strict();\n\nexport type MetricCursor = z.infer<typeof MetricCursorSchema>;\n\nexport const TelemetryJsonObjectSchema = z.record(z.string(), z.json());\nexport const NumericValuesSchema = z.record(z.string(), z.number().finite());\n\nconst StoredMetricMeasurementSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('count') }).strict(),\n z\n .object({\n kind: z.literal('field'),\n field: z.string().min(1),\n aggregates: z.array(z.enum(['sum', 'min', 'max', 'last'])).min(1),\n })\n .strict(),\n]);\n\nexport const StoredMetricDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: integer.positive(),\n selector: z.string().min(1),\n groupBy: z.array(z.string().min(1)),\n measurements: z.array(StoredMetricMeasurementSchema).min(1),\n cardinality: z.record(\n z.string(),\n z\n .object({\n maxValuesPerBucket: integer.positive(),\n overflow: z.enum(['other', 'drop', 'reject']),\n })\n .strict(),\n ),\n targetIds: z.array(z.string().min(1)),\n resolutionsMs: z.array(integer.positive()).min(1),\n missingField: z.enum(['skip', 'record-failure']),\n })\n .strict();\n\nexport const StoredMetricDefinitionRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n definition_json: z.string(),\n definition_checksum: z.string(),\n active: integer.min(0).max(1),\n })\n .strict();\n\nexport const MetricRollupValuesSchema = z\n .object({\n count: integer.nonnegative(),\n fields: z.record(\n z.string(),\n z\n .object({\n count: integer.nonnegative(),\n sum: z.number().finite(),\n min: z.number().finite(),\n max: z.number().finite(),\n last: z.number().finite(),\n lastOccurredAtMs: integer,\n lastProducerId: z.string(),\n lastSequence: integer.nonnegative(),\n })\n .strict(),\n ),\n })\n .strict();\n","import type { TelemetryEnvelope } from '../core/types/envelope.types.js';\nimport type { TelemetryJsonObject } from '../core/types/json.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport {\n MetricCursorSchema,\n MetricRollupRowSchema,\n MetricRollupValuesSchema,\n MetricSampleRowSchema,\n NumericValuesSchema,\n RawTelemetryEventRowSchema,\n TelemetryJsonObjectSchema,\n TimelineCursorSchema,\n type MetricCursor,\n type MetricRollupRow,\n type MetricSampleRow,\n type TimelineCursor,\n} from './schema/telemetry_repository_rows.js';\nimport type { MetricRollupValues } from '../core/types/metric.types.js';\n\nexport class TelemetryRepositoryRowParser {\n parseRawEnvelope(input: unknown): TelemetryResult<TelemetryEnvelope, string> {\n const parsed = RawTelemetryEventRowSchema.safeParse(input);\n if (!parsed.success) {\n return { ok: false, error: parsed.error.message };\n }\n const metadata = this.parseJsonObject(parsed.data.metadata_json);\n if (!metadata.ok) {\n return metadata;\n }\n const conversationId = this.parseConversationId(\n parsed.data.conversation_id,\n parsed.data.conversation_id_kind,\n );\n if (!conversationId.ok) {\n return conversationId;\n }\n return {\n ok: true,\n value: Object.freeze({\n schemaVersion: parsed.data.schema_version,\n eventId: parsed.data.event_id,\n producerId: parsed.data.producer_id,\n sequence: parsed.data.sequence,\n occurredAtMs: parsed.data.occurred_at_ms,\n monotonicNs: parsed.data.monotonic_ns,\n source: parsed.data.source,\n processKind: parsed.data.process_kind,\n level: parsed.data.level,\n label: parsed.data.label,\n conversationId: conversationId.value,\n correlationId: parsed.data.correlation_id,\n metadata: metadata.value,\n }),\n };\n }\n\n parseMetricSample(input: unknown): TelemetryResult<MetricSampleRow, string> {\n const parsed = MetricSampleRowSchema.safeParse(input);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n }\n\n parseMetricRollup(input: unknown): TelemetryResult<MetricRollupRow, string> {\n const parsed = MetricRollupRowSchema.safeParse(input);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n }\n\n parseJsonObject(input: string): TelemetryResult<TelemetryJsonObject, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = TelemetryJsonObjectSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: Object.freeze(parsed.data) }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseNumericValues(input: string): TelemetryResult<Readonly<Record<string, number>>, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = NumericValuesSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: Object.freeze(parsed.data) }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseRollupValues(input: string): TelemetryResult<MetricRollupValues, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = MetricRollupValuesSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseTimelineCursor(input: string): TelemetryResult<TimelineCursor, string> {\n return this.parseCursor(input, TimelineCursorSchema);\n }\n\n parseMetricCursor(input: string): TelemetryResult<MetricCursor, string> {\n return this.parseCursor(input, MetricCursorSchema);\n }\n\n private parseCursor<T>(input: string, schema: { safeParse(value: unknown): { success: true; data: T } | { success: false; error: Error } }): TelemetryResult<T, string> {\n try {\n const decodedText = Buffer.from(input, 'base64url').toString('utf8');\n const decoded: unknown = JSON.parse(decodedText);\n const parsed = schema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n private parseConversationId(\n value: string | null,\n kind: 'string' | 'number' | null,\n ): TelemetryResult<string | number | null, string> {\n if (value === null) {\n return { ok: true, value: null };\n }\n if (kind === 'string') {\n return { ok: true, value };\n }\n if (kind === 'number') {\n const numeric = Number(value);\n return Number.isFinite(numeric)\n ? { ok: true, value: numeric }\n : { ok: false, error: `Invalid numeric conversation id ${value}` };\n }\n return { ok: false, error: 'Conversation id kind is missing' };\n }\n}\n","import type { SqliteSchemaConfiguration } from '../core/types/configuration.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport { telemetryChecksum } from '../core/helper/canonical_json.js';\nimport {\n SQLITE_DEFAULT_TABLE_NAMES,\n SQLITE_LOGICAL_TABLE_NAMES,\n SQLITE_SCHEMA_MANIFEST_TABLE,\n} from './helper/sqlite_table_names.js';\nimport type {\n TelemetryLogicalTableName,\n TelemetryPhysicalTableMapping,\n} from './types/telemetry_table_map.types.js';\n\nexport class TelemetryTableMap {\n private readonly tokenMap: Readonly<Record<string, string>>;\n\n private constructor(\n private readonly mapping: TelemetryPhysicalTableMapping,\n readonly checksum: string,\n ) {\n this.tokenMap = Object.freeze({\n ...mapping,\n rawEventsOccurredIndex: this.indexName(mapping.rawEvents, 'occurred'),\n rawEventsConversationIndex: this.indexName(mapping.rawEvents, 'conversation'),\n rawEventsLabelIndex: this.indexName(mapping.rawEvents, 'label'),\n rawEventsLevelIndex: this.indexName(mapping.rawEvents, 'level'),\n metricSamplesTimeIndex: this.indexName(mapping.metricSamples, 'time'),\n metricSamplesEventIndex: this.indexName(mapping.metricSamples, 'event'),\n metricRollupsTimeIndex: this.indexName(mapping.metricRollups, 'time'),\n });\n }\n\n static create(configuration: SqliteSchemaConfiguration): TelemetryResult<TelemetryTableMap, string> {\n const prefixError = TelemetryTableMap.validateOptionalPrefix(configuration.tablePrefix);\n if (prefixError !== null) {\n return { ok: false, error: prefixError };\n }\n\n const entries = SQLITE_LOGICAL_TABLE_NAMES.map((logicalName) => {\n const override = configuration.tables[logicalName];\n const defaultName = SQLITE_DEFAULT_TABLE_NAMES[logicalName];\n const physicalName = override ?? (configuration.tablePrefix === null\n ? defaultName\n : `${configuration.tablePrefix}${defaultName}`);\n return [logicalName, physicalName] as const;\n });\n\n for (const [logicalName, physicalName] of entries) {\n const identifierError = TelemetryTableMap.validateIdentifier(physicalName);\n if (identifierError !== null) {\n return { ok: false, error: `${logicalName}: ${identifierError}` };\n }\n if (physicalName.toLowerCase() === SQLITE_SCHEMA_MANIFEST_TABLE) {\n return { ok: false, error: `${logicalName} cannot use the fixed schema manifest name` };\n }\n }\n\n const foldedNames = entries.map(([, physicalName]) => physicalName.toLowerCase());\n if (new Set(foldedNames).size !== foldedNames.length) {\n return { ok: false, error: 'Resolved telemetry table names must be unique after case folding' };\n }\n\n const mapping = Object.freeze(Object.fromEntries(entries)) as TelemetryPhysicalTableMapping;\n const checksum = telemetryChecksum(mapping);\n return { ok: true, value: new TelemetryTableMap(mapping, checksum) };\n }\n\n physical(logicalName: TelemetryLogicalTableName): string {\n return this.mapping[logicalName];\n }\n\n quoted(logicalName: TelemetryLogicalTableName): string {\n return this.quote(this.mapping[logicalName]);\n }\n\n manifestMapping(): TelemetryPhysicalTableMapping {\n return this.mapping;\n }\n\n substitute(sql: string): TelemetryResult<string, string> {\n const unknownTokens: string[] = [];\n const substituted = sql.replace(/\\{\\{([A-Za-z][A-Za-z0-9]*)\\}\\}/g, (_match, token: string) => {\n const identifier = this.tokenMap[token];\n if (identifier === undefined) {\n unknownTokens.push(token);\n return `{{${token}}}`;\n }\n return this.quote(identifier);\n });\n if (unknownTokens.length > 0 || substituted.includes('{{')) {\n return {\n ok: false,\n error: `Unknown telemetry migration identifier token(s): ${unknownTokens.join(', ') || 'malformed token'}`,\n };\n }\n return { ok: true, value: substituted };\n }\n\n private quote(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n }\n\n private indexName(tableName: string, purpose: string): string {\n const raw = `${tableName}_${purpose}_idx`;\n if (raw.length <= 63) {\n return raw;\n }\n const suffix = telemetryChecksum(raw).slice(0, 8);\n return `${raw.slice(0, 54)}_${suffix}`;\n }\n\n private static validateOptionalPrefix(prefix: string | null): string | null {\n if (prefix === null) {\n return null;\n }\n return this.validateIdentifier(prefix);\n }\n\n private static validateIdentifier(identifier: string): string | null {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {\n return `Invalid SQLite identifier ${identifier}`;\n }\n if (identifier.length > 63) {\n return `SQLite identifier ${identifier} exceeds 63 characters`;\n }\n if (identifier.toLowerCase().startsWith('sqlite_')) {\n return `SQLite identifier ${identifier} uses the reserved sqlite_ prefix`;\n }\n return null;\n }\n}\n","import { z } from 'zod';\n\nexport const TelemetrySchemaManifestRowSchema = z.object({\n target_id: z.string(),\n format_version: z.number().int().positive(),\n mapping_json: z.string(),\n mapping_checksum: z.string(),\n state: z.enum(['ready', 'renaming']),\n pending_mapping_json: z.string().nullable(),\n updated_at_ms: z.number().int(),\n}).strict();\n\nexport type TelemetrySchemaManifestRow = z.infer<typeof TelemetrySchemaManifestRowSchema>;\n","import { randomUUID } from 'node:crypto';\nimport { TelemetryClient } from '../../core/telemetry_client.js';\nimport type { NodeTelemetryProducerOptions } from './types/node_telemetry_producer_host.types.js';\n\nexport class NodeTelemetryProducerHost {\n readonly client: TelemetryClient;\n\n constructor(options: NodeTelemetryProducerOptions) {\n this.client = new TelemetryClient({\n source: options.source,\n processKind: options.processKind,\n transport: options.transport,\n admission: options.admission,\n metadata: options.metadata,\n producerId: options.producerId ?? randomUUID(),\n now: () => Date.now(),\n monotonicNowNs: () => process.hrtime.bigint().toString(),\n schedule: (work) => queueMicrotask(work),\n delay: (durationMs) => new Promise((resolve) => setTimeout(resolve, durationMs)),\n random: () => Math.random(),\n });\n }\n\n async stop(deadlineMs: number): Promise<void> {\n await this.client.stop(deadlineMs);\n }\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\nimport type { MetadataSnapshot, MetadataSnapshotLimits, MetadataSnapshotStats } from './types/metadata.types.js';\n\nconst SENTINEL_CIRCULAR = '[telemetry:circular]';\nconst SENTINEL_TRUNCATED = '[telemetry:truncated]';\n\nexport class BoundedMetadataSnapshotter {\n constructor(private readonly limits: MetadataSnapshotLimits) {\n this.validateLimits();\n }\n\n snapshot(input: unknown): MetadataSnapshot {\n const state = {\n bytes: 0,\n properties: 0,\n truncatedValues: 0,\n redactedValues: 0,\n serializationFailures: 0,\n seen: new WeakSet<object>(),\n };\n\n let normalized: TelemetryJsonValue;\n try {\n normalized = this.normalize(input, '$', 0, state);\n } catch {\n state.serializationFailures += 1;\n normalized = { __telemetry: '[telemetry:snapshot-failed]' };\n }\n\n const root = this.ensureObject(normalized);\n const canonical = canonicalJson(root);\n const metadata = telemetryUtf8Length(canonical) <= this.limits.maxBytes\n ? root\n : Object.freeze({ __telemetry: SENTINEL_TRUNCATED });\n if (metadata !== root) {\n state.truncatedValues += 1;\n }\n\n const stats: MetadataSnapshotStats = Object.freeze({\n estimatedBytes: Math.min(telemetryUtf8Length(canonical), this.limits.maxBytes),\n truncatedValues: state.truncatedValues,\n redactedValues: state.redactedValues,\n serializationFailures: state.serializationFailures,\n });\n\n return Object.freeze({ metadata, stats });\n }\n\n private normalize(\n input: unknown,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonValue {\n const replacement = this.redactionFor(path);\n if (replacement !== null) {\n state.redactedValues += 1;\n return replacement;\n }\n\n if (depth > this.limits.maxDepth || state.bytes >= this.limits.maxBytes) {\n state.truncatedValues += 1;\n return SENTINEL_TRUNCATED;\n }\n\n if (input === null || typeof input === 'boolean') {\n return input;\n }\n if (typeof input === 'string') {\n return this.normalizeString(input, state);\n }\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : `[telemetry:number:${String(input)}]`;\n }\n if (typeof input === 'bigint') {\n return `[telemetry:bigint:${input.toString()}]`;\n }\n if (typeof input === 'undefined') {\n return '[telemetry:undefined]';\n }\n if (typeof input === 'symbol') {\n return `[telemetry:symbol:${input.description ?? ''}]`;\n }\n if (typeof input === 'function') {\n return '[telemetry:function]';\n }\n if (input instanceof Error) {\n return this.normalizeError(input, path, depth, state);\n }\n if (typeof input !== 'object') {\n return `[telemetry:unsupported:${typeof input}]`;\n }\n if (state.seen.has(input)) {\n return SENTINEL_CIRCULAR;\n }\n\n state.seen.add(input);\n try {\n return Array.isArray(input)\n ? this.normalizeArray(input, path, depth, state)\n : this.normalizeObject(input, path, depth, state);\n } finally {\n state.seen.delete(input);\n }\n }\n\n private normalizeString(\n input: string,\n state: { bytes: number; truncatedValues: number },\n ): string {\n const stringLimit = Math.min(this.limits.maxStringLength, Math.max(0, this.limits.maxBytes - state.bytes));\n const truncated = input.length > stringLimit;\n const normalized = truncated ? input.slice(0, stringLimit) : input;\n state.bytes += telemetryUtf8Length(normalized);\n if (truncated) {\n state.truncatedValues += 1;\n }\n return normalized;\n }\n\n private normalizeArray(\n input: readonly unknown[],\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): readonly TelemetryJsonValue[] {\n const length = Math.min(input.length, this.limits.maxArrayLength);\n const values: TelemetryJsonValue[] = [];\n for (let index = 0; index < length; index += 1) {\n let item: unknown;\n try {\n item = input[index];\n } catch {\n state.serializationFailures += 1;\n item = '[telemetry:property-read-failed]';\n }\n values.push(this.normalize(item, `${path}[${index}]`, depth + 1, state));\n }\n if (input.length > length) {\n values.push(SENTINEL_TRUNCATED);\n state.truncatedValues += 1;\n }\n return Object.freeze(values);\n }\n\n private normalizeObject(\n input: object,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n let keys: string[];\n try {\n keys = Object.keys(input).sort((left, right) => left.localeCompare(right));\n } catch {\n state.serializationFailures += 1;\n return Object.freeze({ __telemetry: '[telemetry:keys-failed]' });\n }\n\n const output: Record<string, TelemetryJsonValue> = {};\n for (const key of keys) {\n if (state.properties >= this.limits.maxProperties) {\n output.__telemetry = SENTINEL_TRUNCATED;\n state.truncatedValues += 1;\n break;\n }\n state.properties += 1;\n state.bytes += telemetryUtf8Length(key);\n const childPath = path === '$' ? key : `${path}.${key}`;\n const redaction = this.redactionFor(childPath);\n if (redaction !== null) {\n output[key] = redaction;\n state.redactedValues += 1;\n continue;\n }\n\n let property: unknown;\n try {\n property = Reflect.get(input, key);\n } catch {\n state.serializationFailures += 1;\n property = '[telemetry:property-read-failed]';\n }\n output[key] = this.normalize(property, childPath, depth + 1, state);\n }\n return Object.freeze(output);\n }\n\n private normalizeError(\n error: Error,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n const name = this.readErrorField(error, 'name', state);\n const message = this.readErrorField(error, 'message', state);\n const stack = this.readErrorField(error, 'stack', state).slice(0, this.limits.maxErrorStackLength);\n return Object.freeze({\n name: this.normalize(name, `${path}.name`, depth + 1, state),\n message: this.normalize(message, `${path}.message`, depth + 1, state),\n stack: this.normalize(stack, `${path}.stack`, depth + 1, state),\n });\n }\n\n private readErrorField(\n error: Error,\n field: 'name' | 'message' | 'stack',\n state: { serializationFailures: number },\n ): string {\n try {\n return typeof error[field] === 'string' ? error[field] : '';\n } catch {\n state.serializationFailures += 1;\n return '[telemetry:error-field-read-failed]';\n }\n }\n\n private ensureObject(value: TelemetryJsonValue): TelemetryJsonObject {\n return this.isJsonObject(value) ? value : Object.freeze({ value });\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private redactionFor(path: string): string | null {\n const matchingRule = this.limits.redactions.find((rule) => rule.path === path);\n return matchingRule?.replacement ?? null;\n }\n\n private validateLimits(): void {\n const limits = [\n this.limits.maxBytes,\n this.limits.maxDepth,\n this.limits.maxProperties,\n this.limits.maxArrayLength,\n this.limits.maxStringLength,\n this.limits.maxErrorStackLength,\n ];\n const hasInvalidLimit = limits.some((limit) => !Number.isInteger(limit) || limit <= 0);\n if (hasInvalidLimit) {\n throw new Error('Metadata snapshot limits must be positive integers');\n }\n }\n}\n","import { BoundedMetadataSnapshotter } from './bounded_metadata_snapshotter.js';\nimport { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport { TelemetryBatchContract } from './telemetry_batch_contract.js';\nimport type { QueuedTelemetryEnvelope } from './types/client_internal.types.js';\nimport type {\n TelemetryAdmissionPriority,\n TelemetryAdmissionResult,\n TelemetryClientOptions,\n TelemetryClientStatus,\n} from './types/client.types.js';\nimport type { TelemetryAdmitInput, TelemetryEnvelope, TelemetryLevel } from './types/envelope.types.js';\nimport type { TelemetryJsonObject } from './types/json.types.js';\nimport type { TelemetryAcknowledgement, TelemetryBatch, TelemetryDropCounter } from './types/transport.types.js';\n\nexport class TelemetryClient {\n private readonly snapshotter: BoundedMetadataSnapshotter;\n private readonly batchContract = new TelemetryBatchContract();\n private readonly queue: QueuedTelemetryEnvelope[] = [];\n private readonly dropCounts = new Map<string, number>();\n private state: 'accepting' | 'draining' | 'stopped' = 'accepting';\n private nextSequence = 0;\n private queuedBytes = 0;\n private inFlightBatches = 0;\n private drainScheduled = false;\n private activeDrain: Promise<void> | null = null;\n private lastAcknowledgement: TelemetryAcknowledgement | null = null;\n\n constructor(private readonly options: TelemetryClientOptions) {\n this.validateOptions();\n this.snapshotter = new BoundedMetadataSnapshotter(options.metadata);\n }\n\n trace(level: TelemetryLevel, label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit(level, label, metadata);\n }\n\n debug(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('debug', label, metadata);\n }\n\n info(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('info', label, metadata);\n }\n\n warn(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('warn', label, metadata);\n }\n\n error(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('error', label, metadata);\n }\n\n fatal(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('fatal', label, metadata);\n }\n\n emit(level: TelemetryLevel, label: string, metadata: unknown): TelemetryAdmissionResult {\n return this.admit({\n source: this.options.source,\n processKind: this.options.processKind,\n level,\n label,\n occurredAtMs: this.options.now(),\n monotonicNs: this.options.monotonicNowNs(),\n conversationId: null,\n correlationId: null,\n metadata,\n });\n }\n\n admit(input: TelemetryAdmitInput): TelemetryAdmissionResult {\n const sequence = this.nextSequence;\n this.nextSequence += 1;\n\n if (this.state !== 'accepting') {\n this.incrementDrop('stopped', this.priorityFor(input.level));\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'client-stopped' };\n }\n\n const hasInvalidIdentity = !this.isValidLabel(input.label)\n || !input.source.trim()\n || !input.processKind.trim()\n || !Number.isFinite(input.occurredAtMs);\n if (hasInvalidIdentity) {\n this.incrementDrop('invalid', this.priorityFor(input.level));\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'invalid-label' };\n }\n\n const priority = this.priorityFor(input.level);\n if (!this.isSampled(priority)) {\n this.incrementDrop('sampled', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'sampled' };\n }\n\n const snapshot = this.snapshotter.snapshot(input.metadata);\n const extractedCorrelation = this.resolveCorrelation(snapshot.metadata);\n const correlation = {\n conversationId: input.conversationId ?? extractedCorrelation.conversationId,\n correlationId: input.correlationId ?? extractedCorrelation.correlationId,\n };\n const envelope = this.createEnvelope(sequence, input, snapshot.metadata, correlation);\n const bytes = telemetryUtf8Length(canonicalJson(envelope));\n const single = this.batchContract.create([envelope], []);\n if (!single.ok) {\n this.incrementDrop('invalid', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'invalid-envelope' };\n }\n const framedBytes = telemetryUtf8Length(canonicalJson(single.value));\n const queueWouldOverflow = this.queue.length >= this.options.admission.maxQueuedEvents\n || this.queuedBytes + bytes > this.options.admission.maxQueuedBytes\n || framedBytes > this.options.admission.maxBatchBytes;\n if (queueWouldOverflow) {\n this.incrementDrop('capacity', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'capacity' };\n }\n\n this.queue.push(Object.freeze({ envelope, bytes }));\n this.queuedBytes += bytes;\n this.scheduleDrain();\n return {\n kind: 'admitted',\n producerId: this.options.producerId,\n sequence,\n eventId: envelope.eventId,\n };\n }\n\n status(): TelemetryClientStatus {\n return Object.freeze({\n state: this.state,\n producerId: this.options.producerId,\n nextSequence: this.nextSequence,\n queuedEvents: this.queue.length,\n queuedBytes: this.queuedBytes,\n inFlightBatches: this.inFlightBatches,\n dropCounters: this.dropCounterSnapshot(),\n lastAcknowledgement: this.lastAcknowledgement,\n });\n }\n\n async flush(deadlineMs: number): Promise<void> {\n this.scheduleDrain();\n while ((this.queue.length > 0 || this.activeDrain !== null) && this.options.now() < deadlineMs) {\n const currentDrain = this.activeDrain;\n if (currentDrain) {\n await Promise.race([currentDrain, this.options.delay(1)]);\n } else {\n await this.options.delay(1);\n }\n }\n await this.settleExternalShutdown(\n () => this.options.transport.flush(deadlineMs),\n deadlineMs,\n );\n }\n\n async stop(deadlineMs: number): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n this.state = 'draining';\n await this.flush(deadlineMs);\n const abandoned = this.queue.splice(0, this.queue.length);\n if (abandoned.length > 0) {\n this.incrementDropBy('transport', 'normal', abandoned.length);\n this.queuedBytes = 0;\n }\n await this.settleExternalShutdown(\n () => this.options.transport.close(deadlineMs),\n deadlineMs,\n );\n this.state = 'stopped';\n }\n\n private createEnvelope(\n sequence: number,\n input: TelemetryAdmitInput,\n metadata: TelemetryJsonObject,\n correlation: Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }>,\n ): TelemetryEnvelope {\n return Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n eventId: `${this.options.producerId}:${sequence}`,\n producerId: this.options.producerId,\n sequence,\n occurredAtMs: input.occurredAtMs,\n monotonicNs: input.monotonicNs,\n source: input.source,\n processKind: input.processKind,\n level: input.level.trim().toLowerCase() || 'info',\n label: input.label,\n conversationId: correlation.conversationId,\n correlationId: correlation.correlationId,\n metadata,\n });\n }\n\n private resolveCorrelation(metadata: TelemetryJsonObject): Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }> {\n const conversationValue = metadata.conversationId ?? metadata.threadId ?? null;\n const conversationId = typeof conversationValue === 'string' || typeof conversationValue === 'number'\n ? conversationValue\n : null;\n const correlationValue = metadata.correlationId;\n const correlationId = typeof correlationValue === 'string' ? correlationValue : null;\n return { conversationId, correlationId };\n }\n\n private scheduleDrain(): void {\n if (this.drainScheduled || this.activeDrain !== null || this.queue.length === 0) {\n return;\n }\n this.drainScheduled = true;\n try {\n this.options.schedule(() => {\n this.drainScheduled = false;\n const drain = this.drainLoop();\n this.activeDrain = drain;\n const settle = () => {\n this.activeDrain = null;\n if (this.queue.length > 0) {\n this.scheduleDrain();\n }\n };\n void drain.then(settle, settle);\n });\n } catch {\n this.drainScheduled = false;\n }\n }\n\n private async drainLoop(): Promise<void> {\n while (this.queue.length > 0) {\n const dropSnapshot = this.dropCounterSnapshot();\n const prepared = this.prepareBatch(dropSnapshot);\n if (prepared === null) {\n continue;\n }\n\n this.inFlightBatches += 1;\n try {\n const acknowledgement = await this.deliverWithRetry(prepared.batch);\n this.lastAcknowledgement = acknowledgement;\n if (acknowledgement.kind === 'committed') {\n this.subtractDropSnapshot(prepared.dropCounters);\n } else {\n this.incrementDropBy('transport', 'normal', prepared.eventCount);\n }\n } finally {\n this.inFlightBatches -= 1;\n }\n }\n }\n\n private prepareBatch(dropCounters: readonly TelemetryDropCounter[]): Readonly<{\n batch: TelemetryBatch;\n dropCounters: readonly TelemetryDropCounter[];\n eventCount: number;\n }> | null {\n const entries = this.peekBatchEntries();\n const withCounters = this.findFittingBatch(entries, dropCounters);\n const prepared = withCounters ?? this.findFittingBatch(entries, []);\n if (prepared === null) {\n const invalid = this.queue.shift();\n if (invalid !== undefined) {\n this.queuedBytes -= invalid.bytes;\n this.incrementDrop('invalid', this.priorityFor(invalid.envelope.level));\n }\n return null;\n }\n for (let index = 0; index < prepared.eventCount; index += 1) {\n const removed = this.queue.shift();\n if (removed !== undefined) {\n this.queuedBytes -= removed.bytes;\n }\n }\n return prepared;\n }\n\n private peekBatchEntries(): QueuedTelemetryEnvelope[] {\n const entries: QueuedTelemetryEnvelope[] = [];\n let batchBytes = 0;\n while (entries.length < this.options.admission.maxBatchEvents) {\n const next = this.queue[entries.length];\n if (!next) {\n break;\n }\n const exceedsBatchBytes = entries.length > 0\n && batchBytes + next.bytes > this.options.admission.maxBatchBytes;\n if (exceedsBatchBytes) {\n break;\n }\n batchBytes += next.bytes;\n entries.push(next);\n }\n return entries;\n }\n\n private findFittingBatch(\n entries: readonly QueuedTelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): Readonly<{\n batch: TelemetryBatch;\n dropCounters: readonly TelemetryDropCounter[];\n eventCount: number;\n }> | null {\n for (let eventCount = entries.length; eventCount > 0; eventCount -= 1) {\n const created = this.batchContract.create(\n entries.slice(0, eventCount).map((entry) => entry.envelope),\n dropCounters,\n );\n if (created.ok\n && telemetryUtf8Length(canonicalJson(created.value)) <= this.options.admission.maxBatchBytes) {\n return Object.freeze({ batch: created.value, dropCounters, eventCount });\n }\n }\n return null;\n }\n\n private async deliverWithRetry(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n let attempt = 0;\n while (attempt <= this.options.admission.retryLimit) {\n let acknowledgement: TelemetryAcknowledgement;\n try {\n const received: unknown = await this.options.transport.send(batch);\n acknowledgement = this.normalizeAcknowledgement(batch, received, attempt);\n } catch (cause) {\n acknowledgement = {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.errorMessage(cause),\n retryAfterMs: this.retryDelay(attempt),\n targetStates: [],\n };\n }\n\n if (acknowledgement.kind !== 'retryable' || attempt === this.options.admission.retryLimit) {\n return acknowledgement;\n }\n const requestedDelay = Math.max(acknowledgement.retryAfterMs, this.retryDelay(attempt));\n await this.options.delay(requestedDelay);\n attempt += 1;\n }\n\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: 'retry-limit-exhausted',\n retryAfterMs: 0,\n targetStates: [],\n };\n }\n\n private retryDelay(attempt: number): number {\n return Math.min(\n Number.MAX_SAFE_INTEGER,\n this.options.admission.retryBaseDelayMs * (2 ** attempt),\n );\n }\n\n private normalizeAcknowledgement(\n batch: TelemetryBatch,\n value: unknown,\n attempt: number,\n ): TelemetryAcknowledgement {\n try {\n const error = this.acknowledgementError(batch, value);\n return error === null\n ? this.detachAcknowledgement(value as TelemetryAcknowledgement)\n : this.invalidAcknowledgement(batch, error, attempt);\n } catch {\n return this.invalidAcknowledgement(batch, 'acknowledgement could not be inspected', attempt);\n }\n }\n\n private acknowledgementError(batch: TelemetryBatch, value: unknown): string | null {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return 'acknowledgement identity is missing or mismatched';\n }\n const targetsError = this.targetStatesError(value.targetStates);\n if (targetsError !== null) {\n return targetsError;\n }\n switch (value.kind) {\n case 'committed':\n return this.committedAcknowledgementError(batch, value);\n case 'retryable':\n return this.retryableAcknowledgementError(value);\n case 'rejected':\n return this.rejectedAcknowledgementError(value);\n case 'conflict':\n return this.conflictAcknowledgementError(value);\n default:\n return 'acknowledgement kind is invalid';\n }\n }\n\n private committedAcknowledgementError(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])\n && Number.isSafeInteger(value.committedAtMs)\n && Number(value.committedAtMs) >= 0\n && value.acceptedEvents === batch.envelopes.length\n && typeof value.duplicate === 'boolean';\n return valid ? null : 'committed acknowledgement fields are invalid';\n }\n\n private retryableAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])\n && this.isBoundedReason(value.reason)\n && Number.isFinite(value.retryAfterMs)\n && Number(value.retryAfterMs) >= 0\n && Number(value.retryAfterMs) <= Number.MAX_SAFE_INTEGER;\n return valid ? null : 'retryable acknowledgement fields are invalid';\n }\n\n private rejectedAcknowledgementError(value: Record<string, unknown>): string | null {\n const codes = ['invalid-batch', 'unsupported-version', 'no-required-terminal', 'closed'];\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])\n && codes.includes(String(value.code))\n && this.isBoundedReason(value.reason);\n return valid ? null : 'rejected acknowledgement fields are invalid';\n }\n\n private conflictAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])\n && this.isBoundedReason(value.reason);\n return valid ? null : 'conflict acknowledgement fields are invalid';\n }\n\n private targetStatesError(value: unknown): string | null {\n if (!Array.isArray(value) || value.length > 1_024) {\n return 'acknowledgement target states are invalid';\n }\n const targetIds = new Set<string>();\n for (const target of value) {\n if (!this.isValidTargetState(target) || targetIds.has(target.targetId as string)) {\n return 'acknowledgement target states are invalid';\n }\n targetIds.add(target.targetId as string);\n }\n return null;\n }\n\n private isValidTargetState(value: unknown): value is Record<string, unknown> {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return false;\n }\n const deliveries = ['required', 'best-effort'];\n const states = ['pending', 'committed', 'failed', 'abandoned'];\n return typeof value.targetId === 'string'\n && value.targetId.length > 0\n && telemetryUtf8Length(value.targetId) <= 256\n && deliveries.includes(String(value.delivery))\n && states.includes(String(value.state))\n && Number.isSafeInteger(value.attempts)\n && Number(value.attempts) >= 0\n && (value.reason === null || this.isBoundedReason(value.reason));\n }\n\n private invalidAcknowledgement(\n batch: TelemetryBatch,\n error: string,\n attempt: number,\n ): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: this.retryDelay(attempt),\n targetStates: [],\n };\n }\n\n private detachAcknowledgement(value: TelemetryAcknowledgement): TelemetryAcknowledgement {\n const detached = JSON.parse(canonicalJson(value)) as TelemetryAcknowledgement;\n const targetStates = Object.freeze(detached.targetStates.map((target) => Object.freeze({ ...target })));\n return Object.freeze({ ...detached, targetStates });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isBoundedReason(value: unknown): value is string {\n return typeof value === 'string' && telemetryUtf8Length(value) <= 512;\n }\n\n private dropCounterSnapshot(): readonly TelemetryDropCounter[] {\n const counters = [...this.dropCounts.entries()]\n .filter(([, count]) => count > 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, count]) => {\n const [reason, priority] = key.split(':');\n return Object.freeze({\n reason: reason as TelemetryDropCounter['reason'],\n priority: priority as TelemetryDropCounter['priority'],\n count,\n });\n });\n return Object.freeze(counters);\n }\n\n private subtractDropSnapshot(snapshot: readonly TelemetryDropCounter[]): void {\n for (const counter of snapshot) {\n const key = `${counter.reason}:${counter.priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.max(0, current - counter.count));\n }\n }\n\n private incrementDrop(reason: TelemetryDropCounter['reason'], priority: TelemetryAdmissionPriority): void {\n this.incrementDropBy(reason, priority, 1);\n }\n\n private incrementDropBy(\n reason: TelemetryDropCounter['reason'],\n priority: TelemetryAdmissionPriority,\n count: number,\n ): void {\n const key = `${reason}:${priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.min(Number.MAX_SAFE_INTEGER, current + count));\n }\n\n private priorityFor(level: string): TelemetryAdmissionPriority {\n const normalized = level.trim().toLowerCase();\n if (normalized === 'error' || normalized === 'fatal') {\n return 'high';\n }\n if (normalized === 'trace' || normalized === 'debug') {\n return 'low';\n }\n return 'normal';\n }\n\n private isSampled(priority: TelemetryAdmissionPriority): boolean {\n const sampleRate = this.options.admission.sampleRates[priority];\n return sampleRate >= 1 || this.options.random() < sampleRate;\n }\n\n private isValidLabel(label: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(label) && label.length <= 256;\n }\n\n private errorMessage(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message.slice(0, 512);\n }\n return String(cause).slice(0, 512);\n }\n\n private async settleExternalShutdown(\n work: () => Promise<void>,\n deadlineMs: number,\n ): Promise<void> {\n const operation = Promise.resolve().then(work);\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n void operation.catch(() => undefined);\n return;\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (failed: boolean, error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (failed) {\n reject(error);\n } else {\n resolve();\n }\n };\n const timer = setTimeout(\n () => finish(false),\n Math.min(remainingMs, 2_147_483_647),\n );\n void operation.then(\n () => finish(false),\n (error: unknown) => finish(true, error),\n );\n });\n }\n\n private validateOptions(): void {\n this.validateIdentityOptions();\n this.validateOrderedDeliveryOptions();\n this.validateCapacityOptions();\n this.validateBatchEventOptions();\n this.validateBatchByteOptions();\n this.validateMetadataOptions();\n this.validateRetryOptions();\n this.validateSampleRateOptions();\n }\n\n private validateIdentityOptions(): void {\n if (!this.options.source.trim() || !this.options.processKind.trim() || !this.options.producerId.trim()) {\n throw new Error('Telemetry client source, process kind, and producer id are required');\n }\n }\n\n private validateOrderedDeliveryOptions(): void {\n if (this.options.admission.maxInFlightBatches !== 1) {\n throw new Error('Ordered telemetry clients currently require maxInFlightBatches to equal 1');\n }\n }\n\n private validateCapacityOptions(): void {\n const capacities = [\n this.options.admission.maxQueuedEvents,\n this.options.admission.maxQueuedBytes,\n this.options.admission.maxBatchEvents,\n this.options.admission.maxBatchBytes,\n this.options.admission.maxInFlightBatches,\n this.options.transport.capabilities.maxBatchBytes,\n this.options.transport.capabilities.boundedCapacity,\n ];\n if (capacities.some((capacity) => !Number.isSafeInteger(capacity) || capacity <= 0)) {\n throw new Error('Telemetry client and transport capacities must be positive safe integers');\n }\n }\n\n private validateBatchEventOptions(): void {\n if (this.options.admission.maxBatchEvents > this.options.admission.maxQueuedEvents\n || this.options.admission.maxBatchEvents > this.batchContract.limits.maxBatchEvents) {\n throw new Error('Telemetry maxBatchEvents must not exceed queue or receiver capacity');\n }\n }\n\n private validateBatchByteOptions(): void {\n if (this.options.admission.maxBatchBytes > this.options.admission.maxQueuedBytes\n || this.options.admission.maxBatchBytes > this.options.transport.capabilities.maxBatchBytes\n || this.options.admission.maxBatchBytes > this.batchContract.limits.maxBatchBytes) {\n throw new Error('Telemetry maxBatchBytes must not exceed queue, transport, or receiver capacity');\n }\n }\n\n private validateMetadataOptions(): void {\n if (this.options.metadata.maxBytes > this.options.admission.maxBatchBytes) {\n throw new Error('Telemetry metadata bytes must not exceed maxBatchBytes');\n }\n }\n\n private validateRetryOptions(): void {\n if (!Number.isSafeInteger(this.options.admission.retryLimit)\n || this.options.admission.retryLimit < 0\n || !Number.isFinite(this.options.admission.retryBaseDelayMs)\n || this.options.admission.retryBaseDelayMs < 0) {\n throw new Error('Telemetry retry limit and delay must be nonnegative finite values');\n }\n }\n\n private validateSampleRateOptions(): void {\n const rates = Object.values(this.options.admission.sampleRates);\n if (rates.some((rate) => !Number.isFinite(rate) || rate < 0 || rate > 1)) {\n throw new Error('Telemetry sample rates must be between zero and one');\n }\n }\n}\n","import { createRequire } from 'node:module';\nimport { dirname, resolve } from 'node:path';\nimport type { TelemetryClient } from '../../core/telemetry_client.js';\nimport type { TelemetryCollectorStatus } from '../../core/types/runtime.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryBatchTransport,\n TelemetryDropCounter,\n} from '../../core/types/transport.types.js';\nimport { NodeTelemetryProducerHost } from './node_telemetry_producer_host.js';\nimport type { NodeCombinedTelemetryOptions } from './types/node_telemetry_host.types.js';\n\ntype NativeCollectorBinding = Readonly<{\n start(): Promise<string>;\n receive(batchJson: string): Promise<string>;\n maintenance(): Promise<string>;\n status(): Promise<string>;\n stop(): Promise<string>;\n}>;\n\ntype NativeCollectorConstructor = new (\n configurationJson: string,\n definitionsJson: string,\n) => NativeCollectorBinding;\n\ntype NativeModule = Readonly<{\n NativeTelemetryCollector: NativeCollectorConstructor;\n}>;\n\nexport class NativeTelemetryHost {\n readonly client: TelemetryClient;\n readonly collector: TelemetryBatchReceiver;\n private readonly native: NativeCollectorBinding;\n private readonly transport: NativeTelemetryTransport;\n\n private constructor(options: NodeCombinedTelemetryOptions) {\n const binding = loadNativeModule();\n this.native = new binding.NativeTelemetryCollector(\n JSON.stringify(options.sqlite),\n JSON.stringify(options.definitions),\n );\n this.transport = new NativeTelemetryTransport(\n this.native,\n options.sqlite.targetId,\n );\n this.collector = this.transport;\n this.client = new NodeTelemetryProducerHost({\n source: options.source,\n processKind: options.processKind,\n transport: this.transport,\n admission: options.admission,\n metadata: options.metadata,\n producerId: options.producerId,\n }).client;\n }\n\n static combined(options: NodeCombinedTelemetryOptions): NativeTelemetryHost {\n return new NativeTelemetryHost(options);\n }\n\n async start(): Promise<void> {\n await this.native.start();\n this.transport.markReady();\n }\n\n async stop(deadlineMs: number): Promise<void> {\n await this.client.stop(deadlineMs);\n await this.transport.close(deadlineMs);\n }\n\n async status(): Promise<unknown> {\n return JSON.parse(await this.native.status());\n }\n\n collectorStatus(): TelemetryCollectorStatus {\n return this.transport.status();\n }\n\n async maintenance(): Promise<unknown> {\n return JSON.parse(await this.native.maintenance());\n }\n}\n\nclass NativeTelemetryTransport implements TelemetryBatchTransport, TelemetryBatchReceiver {\n readonly transportId = 'native-rust-collector';\n readonly receiverId = 'native-rust-collector';\n readonly capabilities = Object.freeze({\n maxBatchBytes: 1_048_576,\n acknowledgement: 'durable' as const,\n ordering: 'producer' as const,\n boundedCapacity: 64,\n });\n private closed = false;\n private state: TelemetryCollectorStatus['state'] = 'created';\n private acceptedBatches = 0;\n private committedEvents = 0;\n private rejectedBatches = 0;\n private lastFailure: string | null = null;\n private readonly dropCounters = new Map<string, TelemetryDropCounter>();\n\n constructor(\n private readonly native: NativeCollectorBinding,\n private readonly targetId: string,\n ) {}\n\n markReady(): void {\n this.state = 'ready';\n }\n\n receive(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n return this.send(batch);\n }\n\n async send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n if (this.closed) {\n return rejectedClosed(batch.idempotencyKey);\n }\n this.acceptedBatches += 1;\n try {\n const value: unknown = JSON.parse(await this.native.receive(JSON.stringify(batch)));\n const acknowledgement = parseAcknowledgement(value, batch.idempotencyKey);\n if (acknowledgement.kind === 'committed' && !acknowledgement.duplicate) {\n this.committedEvents += acknowledgement.acceptedEvents;\n this.aggregateDropCounters(batch.dropCounters);\n } else if (acknowledgement.kind !== 'committed') {\n this.rejectedBatches += 1;\n this.lastFailure = acknowledgement.reason;\n }\n return acknowledgement;\n } catch (error) {\n this.lastFailure = error instanceof Error ? error.message : String(error);\n throw error;\n }\n }\n\n async flush(_deadlineMs: number): Promise<void> {}\n\n async close(deadlineMs: number): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.state = 'draining';\n const operation = this.native.stop().then(() => {\n this.state = 'stopped';\n });\n const remainingMs = Math.max(0, deadlineMs - Date.now());\n let timer: ReturnType<typeof setTimeout> | null = null;\n await Promise.race([\n operation,\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, remainingMs);\n }),\n ]);\n if (timer !== null) {\n clearTimeout(timer);\n }\n }\n\n status(): TelemetryCollectorStatus {\n return Object.freeze({\n state: this.state,\n acceptedBatches: this.acceptedBatches,\n committedEvents: this.committedEvents,\n rejectedBatches: this.rejectedBatches,\n dropCounters: Object.freeze([...this.dropCounters.values()]),\n lastFailure: this.lastFailure,\n targets: Object.freeze([{\n targetId: this.targetId,\n state: this.state === 'draining' ? 'ready' : this.state,\n detail: this.lastFailure,\n writerLeaseHeld: this.state === 'ready',\n }]),\n });\n }\n\n private aggregateDropCounters(counters: readonly TelemetryDropCounter[]): void {\n for (const counter of counters) {\n const key = `${counter.reason}:${counter.priority}`;\n const previous = this.dropCounters.get(key);\n this.dropCounters.set(key, Object.freeze({\n ...counter,\n count: Math.min(Number.MAX_SAFE_INTEGER, (previous?.count ?? 0) + counter.count),\n }));\n }\n }\n}\n\nfunction loadNativeModule(): NativeModule {\n const require = createRequire(resolve(process.cwd(), 'package.json'));\n const packageRoot = dirname(require.resolve('@noego/telemetry/package.json'));\n const modulePath = resolve(packageRoot, 'native', 'noego_telemetry_native.node');\n const loaded: unknown = require(modulePath);\n if (!isRecord(loaded) || typeof loaded.NativeTelemetryCollector !== 'function') {\n throw new Error(`Native telemetry binding at ${modulePath} has an invalid export contract`);\n }\n return loaded as NativeModule;\n}\n\nfunction parseAcknowledgement(value: unknown, idempotencyKey: string): TelemetryAcknowledgement {\n if (!isRecord(value) || value.idempotencyKey !== idempotencyKey || typeof value.kind !== 'string') {\n throw new Error('Native telemetry acknowledgement has an invalid identity');\n }\n if (value.kind === 'committed'\n && isSafeNumber(value.committedAtMs)\n && isSafeNumber(value.acceptedEvents)\n && typeof value.duplicate === 'boolean'\n && Array.isArray(value.targetStates)) {\n return {\n kind: 'committed',\n idempotencyKey,\n committedAtMs: value.committedAtMs,\n acceptedEvents: value.acceptedEvents,\n duplicate: value.duplicate,\n targetStates: parseTargetStates(value.targetStates),\n };\n }\n const reason = typeof value.reason === 'string' ? value.reason : 'Native telemetry request failed';\n if (value.kind === 'retryable') {\n return {\n kind: 'retryable',\n idempotencyKey,\n reason,\n retryAfterMs: isSafeNumber(value.retryAfterMs) ? value.retryAfterMs : 100,\n targetStates: parseTargetStates(value.targetStates),\n };\n }\n if (value.kind === 'rejected') {\n const code = value.code === 'unsupported-version' || value.code === 'no-required-terminal'\n || value.code === 'closed' ? value.code : 'invalid-batch';\n return {\n kind: 'rejected',\n idempotencyKey,\n code,\n reason,\n targetStates: parseTargetStates(value.targetStates),\n };\n }\n return {\n kind: 'conflict',\n idempotencyKey,\n reason,\n targetStates: parseTargetStates(value.targetStates),\n };\n}\n\nfunction parseTargetStates(value: unknown): TelemetryAcknowledgement['targetStates'] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((state) => {\n if (!isRecord(state)\n || typeof state.targetId !== 'string'\n || (state.delivery !== 'required' && state.delivery !== 'best-effort')\n || (state.state !== 'pending' && state.state !== 'committed'\n && state.state !== 'failed' && state.state !== 'abandoned')\n || !isSafeNumber(state.attempts)) {\n return [];\n }\n return [{\n targetId: state.targetId,\n delivery: state.delivery,\n state: state.state,\n attempts: state.attempts,\n reason: typeof state.reason === 'string' ? state.reason : null,\n }];\n });\n}\n\nfunction rejectedClosed(idempotencyKey: string): TelemetryAcknowledgement {\n return {\n kind: 'rejected',\n idempotencyKey,\n code: 'closed',\n reason: 'Native telemetry transport is closed',\n targetStates: [],\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSafeNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n","import { dirname, resolve } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { load as loadYaml } from 'js-yaml';\nimport { MetricDefinitionContract } from '../../core/metric_definition_contract.js';\nimport type {\n ResolvedTelemetryConfiguration,\n SqliteTableOverrides,\n SqliteTargetConfiguration,\n} from '../../core/types/configuration.types.js';\nimport type { MetricDefinition, MetricMeasurement } from '../../core/types/metric.types.js';\nimport { TelemetryTableMap } from '../../storage/telemetry_table_map.js';\nimport { TelemetryDurationParser } from './helper/telemetry_duration_parser.js';\nimport {\n TelemetryConfigurationDocumentSchema,\n type SerializedMetricDefinition,\n type SerializedSqliteTarget,\n} from './schema/telemetry_configuration_schema.js';\nimport type { NodeTelemetryConfigurationParseOptions } from './types/telemetry_configuration_parser.types.js';\n\nconst DEFAULT_LEASE_EXPIRY = '30s';\nconst DEFAULT_QUERY_RANGE = '365d';\nconst DEFAULT_QUERY_ROWS = 10_000;\nconst DEFAULT_QUERY_BUCKETS = 10_000;\nconst DEFAULT_QUERY_BYTES = 5_000_000;\nconst DEFAULT_RECLAIM_PAGES = 100;\n\nexport class TelemetryConfigurationError extends Error {\n constructor(\n message: string,\n readonly source: string,\n ) {\n super(`${source}: ${message}`);\n this.name = 'TelemetryConfigurationError';\n }\n}\n\nexport class NodeTelemetryConfigurationParser {\n constructor(\n private readonly durations = new TelemetryDurationParser(),\n private readonly metricContract = new MetricDefinitionContract(),\n ) {}\n\n parseFile(\n configurationPath: string,\n options: NodeTelemetryConfigurationParseOptions = {},\n ): ResolvedTelemetryConfiguration {\n const absolutePath = resolve(configurationPath);\n let source: string;\n try {\n source = readFileSync(absolutePath, 'utf8');\n } catch (cause) {\n throw new TelemetryConfigurationError(this.errorMessage(cause), absolutePath);\n }\n return this.parseYaml(source, {\n sourceName: options.sourceName ?? absolutePath,\n storageBaseDirectory: options.storageBaseDirectory ?? dirname(absolutePath),\n });\n }\n\n parseYaml(\n source: string,\n options: NodeTelemetryConfigurationParseOptions = {},\n ): ResolvedTelemetryConfiguration {\n const sourceName = options.sourceName ?? '<telemetry-configuration>';\n let document: unknown;\n try {\n document = loadYaml(source);\n } catch (cause) {\n throw new TelemetryConfigurationError(this.errorMessage(cause), sourceName);\n }\n const parsed = TelemetryConfigurationDocumentSchema.safeParse(document);\n if (!parsed.success) {\n throw new TelemetryConfigurationError(parsed.error.message, sourceName);\n }\n try {\n const baseDirectory =\n options.storageBaseDirectory === undefined\n ? dirname(resolve(sourceName))\n : resolve(options.storageBaseDirectory);\n return this.resolveDocument(parsed.data, baseDirectory);\n } catch (cause) {\n if (cause instanceof TelemetryConfigurationError) {\n throw cause;\n }\n throw new TelemetryConfigurationError(this.errorMessage(cause), sourceName);\n }\n }\n\n private resolveDocument(\n document: ReturnType<typeof TelemetryConfigurationDocumentSchema.parse>,\n baseDirectory: string,\n ): ResolvedTelemetryConfiguration {\n const telemetry = document.telemetry;\n this.validateRole(telemetry.role, telemetry.trace);\n const serializedTargets = telemetry.trace.storage?.targets ?? [];\n const targets = serializedTargets.map((target, index) =>\n this.resolveTarget(target, baseDirectory, index),\n );\n this.validateTargets(telemetry.role, targets, telemetry.trace.storage?.defaultTarget ?? null);\n const metrics = (telemetry.metrics ?? []).map((metric, index) =>\n this.resolveMetric(metric, targets, index),\n );\n this.validateMetricIdentities(metrics);\n return Object.freeze({\n version: telemetry.version ?? 1,\n role: telemetry.role,\n ingestionTransport: telemetry.trace.ingestionTransport ?? null,\n logTransport: telemetry.logs?.transport ?? null,\n defaultTargetId: telemetry.trace.storage?.defaultTarget ?? null,\n sqliteTargets: Object.freeze(targets),\n metrics: Object.freeze(metrics),\n });\n }\n\n private validateRole(\n role: 'producer' | 'collector' | 'combined',\n trace: Readonly<{\n ingestionTransport?: string | undefined;\n storage?: unknown;\n }>,\n ): void {\n const hasIngestion = trace.ingestionTransport !== undefined;\n const hasStorage = trace.storage !== undefined;\n if (role === 'producer' && (!hasIngestion || hasStorage)) {\n throw new Error('Producer telemetry requires ingestionTransport and forbids storage');\n }\n if (role === 'collector' && !hasStorage) {\n throw new Error('Collector telemetry requires storage targets');\n }\n if (role === 'combined' && (!hasIngestion || !hasStorage)) {\n throw new Error('Combined telemetry requires ingestionTransport and storage targets');\n }\n }\n\n private resolveTarget(\n target: SerializedSqliteTarget,\n baseDirectory: string,\n index: number,\n ): SqliteTargetConfiguration {\n const field = `telemetry.trace.storage.targets[${index}]`;\n const rawMs = this.durations.parse(target.retention.raw, `${field}.retention.raw`);\n const lateArrivalMs = this.durations.parse(\n target.retention.lateArrival ?? '0ms',\n `${field}.retention.lateArrival`,\n true,\n );\n const samplesMs =\n target.retention.samples === undefined\n ? rawMs + lateArrivalMs\n : this.durations.parse(target.retention.samples, `${field}.retention.samples`);\n const levelMs = this.resolveLevelRetention(target.retention.levels, field);\n const rollups = target.retention.rollups.map((tier, tierIndex) =>\n Object.freeze({\n resolutionMs: this.durations.parse(\n tier.resolution,\n `${field}.retention.rollups[${tierIndex}].resolution`,\n ),\n retainMs: this.durations.parse(\n tier.retain,\n `${field}.retention.rollups[${tierIndex}].retain`,\n ),\n }),\n );\n const tables = Object.freeze(\n Object.fromEntries(\n Object.entries(target.schema?.tables ?? {}).filter((entry) => entry[1] !== undefined),\n ),\n ) as SqliteTableOverrides;\n const schema = Object.freeze({\n tablePrefix: target.schema?.tablePrefix ?? null,\n tables,\n });\n const tableMap = TelemetryTableMap.create(schema);\n if (!tableMap.ok) {\n throw new Error(`${field}.schema: ${tableMap.error}`);\n }\n const resolved = Object.freeze({\n targetId: target.id,\n path: resolve(baseDirectory, target.path),\n delivery: target.delivery,\n schema,\n retention: Object.freeze({\n rawMs,\n lateArrivalMs,\n samplesMs,\n levelMs,\n rollups: Object.freeze(rollups),\n }),\n maintenance: Object.freeze({\n intervalMs: this.durations.parse(\n target.maintenance.interval,\n `${field}.maintenance.interval`,\n ),\n maxWorkMs: target.maintenance.maxWorkMs,\n maxReclaimPages: target.maintenance.maxReclaimPages ?? DEFAULT_RECLAIM_PAGES,\n }),\n leaseExpiryMs: this.durations.parse(\n target.leaseExpiry ?? DEFAULT_LEASE_EXPIRY,\n `${field}.leaseExpiry`,\n ),\n query: Object.freeze({\n maxRangeMs: this.durations.parse(\n target.query?.maxRange ?? DEFAULT_QUERY_RANGE,\n `${field}.query.maxRange`,\n ),\n maxRows: target.query?.maxRows ?? DEFAULT_QUERY_ROWS,\n maxBuckets: target.query?.maxBuckets ?? DEFAULT_QUERY_BUCKETS,\n maxResponseBytes: target.query?.maxResponseBytes ?? DEFAULT_QUERY_BYTES,\n }),\n });\n this.validateRetention(resolved, field);\n if (resolved.leaseExpiryMs < 1_000) {\n throw new Error(`${field}.leaseExpiry must be at least 1s`);\n }\n return resolved;\n }\n\n private resolveLevelRetention(\n levels: Readonly<Record<string, string>> | undefined,\n field: string,\n ): Readonly<Record<string, number>> {\n if (levels === undefined) {\n return Object.freeze({});\n }\n const resolved: Record<string, number> = {};\n for (const [level, duration] of Object.entries(levels)) {\n const normalized = level.trim().toLowerCase();\n if (normalized.length === 0) {\n throw new Error(`${field}.retention.levels contains an empty level name`);\n }\n if (resolved[normalized] !== undefined) {\n throw new Error(`${field}.retention.levels declares \"${normalized}\" more than once`);\n }\n resolved[normalized] = this.durations.parse(\n duration,\n `${field}.retention.levels.${normalized}`,\n );\n }\n return Object.freeze(resolved);\n }\n\n private validateRetention(target: SqliteTargetConfiguration, field: string): void {\n const retention = target.retention;\n const requiredSamplesMs = retention.rawMs + retention.lateArrivalMs;\n if (!Number.isSafeInteger(requiredSamplesMs) || retention.samplesMs < requiredSamplesMs) {\n throw new Error(`${field}.retention.samples must cover raw plus lateArrival`);\n }\n for (let index = 0; index < retention.rollups.length; index += 1) {\n const tier = retention.rollups[index];\n const previous = retention.rollups[index - 1];\n if (!tier || tier.retainMs < retention.rawMs) {\n throw new Error(`${field}.retention rollup retention cannot be shorter than raw retention`);\n }\n if (\n previous &&\n (tier.resolutionMs <= previous.resolutionMs || tier.retainMs <= previous.retainMs)\n ) {\n throw new Error(\n `${field}.retention rollup tiers must increase by resolution and retention`,\n );\n }\n }\n }\n\n private validateTargets(\n role: 'producer' | 'collector' | 'combined',\n targets: readonly SqliteTargetConfiguration[],\n defaultTargetId: string | null,\n ): void {\n if (role === 'producer') {\n return;\n }\n const targetIds = targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error('Telemetry storage target ids must be unique');\n }\n if (!targets.some((target) => target.delivery === 'required')) {\n throw new Error('Telemetry storage requires at least one required durable target');\n }\n if (defaultTargetId !== null && !targetIds.includes(defaultTargetId)) {\n throw new Error(`Unknown default telemetry target ${defaultTargetId}`);\n }\n }\n\n private resolveMetric(\n metric: SerializedMetricDefinition,\n targets: readonly SqliteTargetConfiguration[],\n index: number,\n ): MetricDefinition {\n if (metric.selector.endsWith('[*]') && (metric.groupBy?.length ?? 0) > 0) {\n throw new Error(`telemetry.metrics[${index}] selector [*] cannot declare groupBy`);\n }\n const targetIds = metric.targets ?? targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error(`telemetry.metrics[${index}] has duplicate target ids`);\n }\n const unknownTarget = targetIds.find(\n (targetId) => !targets.some((target) => target.targetId === targetId),\n );\n if (unknownTarget !== undefined) {\n throw new Error(`telemetry.metrics[${index}] references unknown target ${unknownTarget}`);\n }\n const resolutionsMs =\n metric.resolutions?.map((resolution, resolutionIndex) =>\n this.durations.parse(\n resolution,\n `telemetry.metrics[${index}].resolutions[${resolutionIndex}]`,\n ),\n ) ?? this.metricResolutions(targets, targetIds);\n this.validateMetricResolutions(resolutionsMs, targets, targetIds, index);\n const cardinality = Object.freeze(\n Object.fromEntries(\n Object.entries(metric.cardinality ?? {}).map(([field, rule]) => [\n field,\n Object.freeze({ ...rule }),\n ]),\n ),\n );\n const definition: MetricDefinition = {\n name: metric.name,\n version: metric.version ?? 1,\n selector: metric.selector,\n groupBy: Object.freeze([...(metric.groupBy ?? [])]),\n measurements: Object.freeze(\n metric.measurements.map((measurement) => this.resolveMeasurement(measurement)),\n ),\n cardinality,\n targetIds: Object.freeze([...targetIds]),\n resolutionsMs: Object.freeze(resolutionsMs),\n missingField: metric.missingField ?? 'record-failure',\n };\n const normalized = this.metricContract.normalize(definition);\n if (!normalized.ok) {\n throw new Error(`telemetry.metrics[${index}]: ${normalized.error}`);\n }\n this.validateNormalizedMetric(normalized.value, index);\n return normalized.value;\n }\n\n private validateNormalizedMetric(definition: MetricDefinition, index: number): void {\n const segments = definition.selector.split('.');\n const invalidSelector = segments.some(\n (segment) =>\n segment !== '*' && segment !== '**' && !/^[A-Za-z0-9_:-][A-Za-z0-9_:\\-]*$/.test(segment),\n );\n if (invalidSelector) {\n throw new Error(`telemetry.metrics[${index}] has an invalid dotted selector`);\n }\n const invalidGroupBy = definition.groupBy.find((field) => !this.isFieldPath(field));\n if (\n invalidGroupBy !== undefined ||\n new Set(definition.groupBy).size !== definition.groupBy.length\n ) {\n throw new Error(`telemetry.metrics[${index}] has invalid or duplicate groupBy fields`);\n }\n const extraCardinality = Object.keys(definition.cardinality).find(\n (field) => !definition.groupBy.includes(field),\n );\n if (extraCardinality !== undefined) {\n throw new Error(\n `telemetry.metrics[${index}] cardinality policy ${extraCardinality} is not a declared dimension`,\n );\n }\n const measurementKeys = definition.measurements.map((measurement) =>\n measurement.kind === 'count' ? 'count' : `field:${measurement.field}`,\n );\n const invalidField = definition.measurements.find(\n (measurement) => measurement.kind === 'field' && !this.isFieldPath(measurement.field),\n );\n if (invalidField !== undefined || new Set(measurementKeys).size !== measurementKeys.length) {\n throw new Error(`telemetry.metrics[${index}] has invalid or duplicate measurements`);\n }\n }\n\n private isFieldPath(value: string): boolean {\n return value.split('.').every((segment) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(segment));\n }\n\n private resolveMeasurement(\n measurement: SerializedMetricDefinition['measurements'][number],\n ): MetricMeasurement {\n if (measurement === 'count') {\n return Object.freeze({ kind: 'count' });\n }\n if (new Set(measurement.aggregate).size !== measurement.aggregate.length) {\n throw new Error(`Metric field ${measurement.field} has duplicate aggregates`);\n }\n return Object.freeze({\n kind: 'field',\n field: measurement.field,\n aggregates: Object.freeze([...measurement.aggregate]),\n });\n }\n\n private metricResolutions(\n targets: readonly SqliteTargetConfiguration[],\n targetIds: readonly string[],\n ): number[] {\n const selected = targets.filter((target) => targetIds.includes(target.targetId));\n const first = selected[0]?.retention.rollups.map((tier) => tier.resolutionMs) ?? [];\n return first\n .filter((resolution) =>\n selected.every((target) =>\n target.retention.rollups.some((tier) => tier.resolutionMs === resolution),\n ),\n )\n .sort((left, right) => left - right);\n }\n\n private validateMetricResolutions(\n resolutions: readonly number[],\n targets: readonly SqliteTargetConfiguration[],\n targetIds: readonly string[],\n metricIndex: number,\n ): void {\n for (const targetId of targetIds) {\n const target = targets.find((candidate) => candidate.targetId === targetId);\n const unavailable = resolutions.find(\n (resolution) => !target?.retention.rollups.some((tier) => tier.resolutionMs === resolution),\n );\n if (unavailable !== undefined) {\n throw new Error(\n `telemetry.metrics[${metricIndex}] resolution ${unavailable} is not configured for target ${targetId}`,\n );\n }\n }\n }\n\n private validateMetricIdentities(metrics: readonly MetricDefinition[]): void {\n const identities = metrics.map((metric) => `${metric.name}:${metric.version}`);\n if (new Set(identities).size !== identities.length) {\n throw new Error('Metric name/version identities must be unique');\n }\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","export class TelemetryDurationParser {\n private static readonly MULTIPLIERS = Object.freeze({\n ms: 1,\n s: 1_000,\n m: 60_000,\n h: 60 * 60_000,\n d: 24 * 60 * 60_000,\n w: 7 * 24 * 60 * 60_000,\n y: 365 * 24 * 60 * 60_000,\n });\n\n parse(value: string, field: string, allowZero = false): number {\n const match = /^(0|[1-9][0-9]*)(ms|s|m|h|d|w|y)$/.exec(value);\n if (!match) {\n throw new Error(`${field} must be an integer duration using ms, s, m, h, d, w, or y`);\n }\n const amount = Number(match[1]);\n const unit = match[2] as keyof typeof TelemetryDurationParser.MULTIPLIERS;\n const milliseconds = amount * TelemetryDurationParser.MULTIPLIERS[unit];\n if (!Number.isSafeInteger(milliseconds) || (!allowZero && milliseconds <= 0)) {\n throw new Error(`${field} is outside the supported duration range`);\n }\n return milliseconds;\n }\n}\n","import { z } from 'zod';\n\nconst DurationSchema = z.string().min(1);\nconst NonEmptyStringSchema = z.string().trim().min(1);\nconst StableIdSchema = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/);\n\nconst CardinalityRuleSchema = z\n .object({\n maxValuesPerBucket: z.number().int().positive(),\n overflow: z.enum(['other', 'drop', 'reject']),\n })\n .strict();\n\nconst MetricMeasurementSchema = z.union([\n z.literal('count'),\n z\n .object({\n field: z.string().min(1),\n aggregate: z.array(z.enum(['sum', 'min', 'max', 'last'])).min(1),\n })\n .strict(),\n]);\n\nconst MetricDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: z.number().int().positive().optional(),\n selector: z.string().min(1),\n groupBy: z.array(z.string().min(1)).optional(),\n measurements: z.array(MetricMeasurementSchema).min(1),\n cardinality: z.record(z.string(), CardinalityRuleSchema).optional(),\n targets: z.array(StableIdSchema).min(1).optional(),\n resolutions: z.array(DurationSchema).min(1).optional(),\n missingField: z.enum(['skip', 'record-failure']).optional(),\n })\n .strict();\n\nconst SqliteTablesSchema = z\n .object({\n rawEvents: NonEmptyStringSchema.optional(),\n batchAcknowledgements: NonEmptyStringSchema.optional(),\n ingestWatermarks: NonEmptyStringSchema.optional(),\n metricDefinitions: NonEmptyStringSchema.optional(),\n metricSamples: NonEmptyStringSchema.optional(),\n metricRollups: NonEmptyStringSchema.optional(),\n rollupCompletions: NonEmptyStringSchema.optional(),\n extractionFailures: NonEmptyStringSchema.optional(),\n maintenanceRuns: NonEmptyStringSchema.optional(),\n readerLeases: NonEmptyStringSchema.optional(),\n committedDropCounters: NonEmptyStringSchema.optional(),\n migrationHistory: NonEmptyStringSchema.optional(),\n })\n .strict();\n\nconst SqliteTargetSchema = z\n .object({\n id: StableIdSchema,\n transport: z.literal('sqlite'),\n delivery: z.enum(['required', 'best-effort']),\n path: z.string().min(1),\n schema: z\n .object({\n tablePrefix: NonEmptyStringSchema.nullable().optional(),\n tables: SqliteTablesSchema.optional(),\n })\n .strict()\n .optional(),\n retention: z\n .object({\n raw: DurationSchema,\n lateArrival: DurationSchema.optional(),\n samples: DurationSchema.optional(),\n levels: z.record(z.string().min(1), DurationSchema).optional(),\n rollups: z\n .array(\n z\n .object({\n resolution: DurationSchema,\n retain: DurationSchema,\n })\n .strict(),\n )\n .min(1),\n })\n .strict(),\n maintenance: z\n .object({\n interval: DurationSchema,\n maxWorkMs: z.number().int().positive(),\n reclaim: z.literal('incremental'),\n maxReclaimPages: z.number().int().positive().optional(),\n })\n .strict(),\n leaseExpiry: DurationSchema.optional(),\n query: z\n .object({\n maxRange: DurationSchema.optional(),\n maxRows: z.number().int().positive().optional(),\n maxBuckets: z.number().int().positive().optional(),\n maxResponseBytes: z.number().int().positive().optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nconst StorageSchema = z\n .object({\n defaultTarget: StableIdSchema.nullable().optional(),\n targets: z.array(SqliteTargetSchema).min(1),\n })\n .strict();\n\nconst TraceSchema = z\n .object({\n ingestionTransport: z.string().min(1).optional(),\n storage: StorageSchema.optional(),\n })\n .strict();\n\nexport const TelemetryConfigurationDocumentSchema = z\n .object({\n telemetry: z\n .object({\n version: z.literal(1).optional(),\n role: z.enum(['producer', 'collector', 'combined']),\n trace: TraceSchema,\n metrics: z.array(MetricDefinitionSchema).optional(),\n logs: z\n .object({\n transport: z.literal('console'),\n })\n .strict()\n .optional(),\n })\n .strict(),\n })\n .strict();\n\nexport type TelemetryConfigurationDocument = z.infer<typeof TelemetryConfigurationDocumentSchema>;\n\nexport type SerializedMetricDefinition = z.infer<typeof MetricDefinitionSchema>;\nexport type SerializedSqliteTarget = z.infer<typeof SqliteTargetSchema>;\n"],"mappings":"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","names":["randomUUID","resolve","resolve","resolve","target","resolve","resolve","resolve","deleted","z","resolve","randomUUID","resolve","randomUUID","resolve","randomUUID","dirname","resolve","resolve","require","dirname","dirname","resolve","readFileSync","z","resolve","readFileSync","dirname"]}
1
+ {"version":3,"sources":["../../src/platform/node/node_telemetry_host.ts","../../src/maintenance/maintenance_coordinator.ts","../../src/runtime/in_memory_batch_transport.ts","../../src/core/metric_definition_contract.ts","../../src/core/helper/canonical_json.ts","../../src/core/metric_extractor.ts","../../src/core/helper/client_defaults.ts","../../src/core/telemetry_batch_contract.ts","../../src/core/helper/telemetry_deadline_guard.ts","../../src/core/telemetry_acknowledgement_contract.ts","../../src/core/telemetry_storage_router.ts","../../src/plugins/telemetry_plugin_registry.ts","../../src/runtime/telemetry_runtime.ts","../../src/transports/sqlite_transport.ts","../../src/storage/helper/sqlite_table_names.ts","../../src/storage/sqlite_ownership_lease.ts","../../src/storage/telemetry_proper_sql_runner.ts","../../src/storage/telemetry_repository.ts","../../src/storage/schema/telemetry_repository_rows.ts","../../src/storage/telemetry_repository_row_parser.ts","../../src/storage/telemetry_table_map.ts","../../src/transports/schema/telemetry_schema_manifest.ts","../../src/platform/node/node_telemetry_producer_host.ts","../../src/core/bounded_metadata_snapshotter.ts","../../src/core/telemetry_client.ts","../../src/platform/node/native_telemetry_host.ts","../../src/platform/node/telemetry_configuration_parser.ts","../../src/platform/node/helper/telemetry_duration_parser.ts","../../src/platform/node/schema/telemetry_configuration_schema.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { TelemetryClient } from '../../core/telemetry_client.js';\nimport type {\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n} from '../../core/types/storage.types.js';\nimport { MaintenanceCoordinator } from '../../maintenance/maintenance_coordinator.js';\nimport { InMemoryBatchTransport } from '../../runtime/in_memory_batch_transport.js';\nimport { TelemetryCollectorRuntime } from '../../runtime/telemetry_runtime.js';\nimport { SQLiteTelemetryTransport } from '../../transports/sqlite_transport.js';\nimport { NodeTelemetryProducerHost } from './node_telemetry_producer_host.js';\nimport type {\n NodeCombinedTelemetryOptions,\n NodeLocalTelemetryProducerOptions,\n NodeTelemetryCollectorOptions,\n NodeTelemetryProducerOptions,\n} from './types/node_telemetry_host.types.js';\n\nexport class NodeTelemetryHost {\n private readonly localClients = new Set<TelemetryClient>();\n private acceptingLocalProducers = true;\n\n private constructor(\n readonly client: TelemetryClient | null,\n readonly collector: TelemetryCollectorRuntime | null,\n private readonly maintenance: MaintenanceCoordinator<ReturnType<typeof setInterval>> | null,\n ) {}\n\n static producer(options: NodeTelemetryProducerOptions): NodeTelemetryHost {\n return new NodeTelemetryHost(new NodeTelemetryProducerHost(options).client, null, null);\n }\n\n static collector(options: NodeTelemetryCollectorOptions): NodeTelemetryHost {\n const maintenanceConfiguration = options.maintenance\n ?? this.inferMaintenanceConfiguration(options.storage);\n const collector = new TelemetryCollectorRuntime({\n storage: options.storage,\n definitions: options.definitions,\n sinkPlugins: options.sinkPlugins,\n schemaVersions: [1],\n volatile: options.volatile,\n defaultTargetId: options.defaultTargetId,\n requiredCapabilities: this.requiredCollectorCapabilities(\n maintenanceConfiguration !== null,\n options.requiredCapabilities,\n ),\n ...(options.batchValidation === undefined ? {} : { batchValidation: options.batchValidation }),\n now: () => Date.now(),\n });\n if (collector.storageTransport().capabilities.maintenance && maintenanceConfiguration === null) {\n throw new Error('A maintenance-capable collector requires maintenance configuration');\n }\n const maintenance = maintenanceConfiguration === null\n ? null\n : this.createMaintenanceCoordinator(\n collector.storageTransport(),\n maintenanceConfiguration,\n options.observeMaintenance,\n );\n return new NodeTelemetryHost(null, collector, maintenance);\n }\n\n static combined(options: NodeCombinedTelemetryOptions): NodeTelemetryHost {\n const sqlite = new SQLiteTelemetryTransport(SQLiteTelemetryTransport.defaults(options.sqlite));\n const collector = new TelemetryCollectorRuntime({\n storage: sqlite,\n definitions: options.definitions,\n sinkPlugins: options.sinkPlugins,\n schemaVersions: [1],\n volatile: false,\n requiredCapabilities: this.requiredCombinedCapabilities(),\n ...(options.batchValidation === undefined ? {} : { batchValidation: options.batchValidation }),\n now: () => Date.now(),\n });\n const pipe = new InMemoryBatchTransport(`combined:${options.sqlite.targetId}`, collector);\n const client = new NodeTelemetryProducerHost({\n source: options.source,\n processKind: options.processKind,\n transport: pipe,\n admission: options.admission,\n metadata: options.metadata,\n producerId: options.producerId,\n }).client;\n const maintenance = this.createMaintenanceCoordinator(\n sqlite,\n options.sqlite.maintenance,\n options.observeMaintenance,\n );\n return new NodeTelemetryHost(client, collector, maintenance);\n }\n\n createLocalProducer(options: NodeLocalTelemetryProducerOptions): TelemetryClient {\n if (this.collector === null) {\n throw new Error('A local telemetry producer requires a collector host');\n }\n if (!this.acceptingLocalProducers) {\n throw new Error('The telemetry collector host is stopping or stopped');\n }\n const producerId = options.producerId ?? randomUUID();\n if (this.hasProducer(producerId)) {\n throw new Error(`Telemetry producer id ${producerId} is already active in this host`);\n }\n const transport = new InMemoryBatchTransport(`local:${producerId}`, this.collector);\n const client = new NodeTelemetryProducerHost({ ...options, producerId, transport }).client;\n this.localClients.add(client);\n return client;\n }\n\n async start(): Promise<void> {\n await this.collector?.start();\n this.maintenance?.start();\n await this.maintenance?.run();\n }\n\n async stop(deadlineMs: number): Promise<void> {\n this.acceptingLocalProducers = false;\n await this.maintenance?.stop(deadlineMs);\n await this.client?.stop(deadlineMs);\n await Promise.all([...this.localClients].map((client) => client.stop(deadlineMs)));\n this.localClients.clear();\n await this.maintenance?.runFinal(deadlineMs);\n await this.collector?.stop(deadlineMs);\n }\n\n private hasProducer(producerId: string): boolean {\n if (this.client?.status().producerId === producerId) {\n return true;\n }\n return [...this.localClients].some((client) => client.status().producerId === producerId);\n }\n\n private static createMaintenanceCoordinator(\n storage: TelemetryStorageTransport,\n configuration: NodeCombinedTelemetryOptions['sqlite']['maintenance'],\n observe: NodeCombinedTelemetryOptions['observeMaintenance'],\n ): MaintenanceCoordinator<ReturnType<typeof setInterval>> {\n return new MaintenanceCoordinator({\n storage,\n intervalMs: configuration.intervalMs,\n maxWorkMs: configuration.maxWorkMs,\n maxReclaimPages: configuration.maxReclaimPages,\n now: () => Date.now(),\n createRunId: () => randomUUID(),\n createInterval: (work, intervalMs) => setInterval(work, intervalMs),\n clearInterval: (handle) => clearInterval(handle),\n observe: observe ?? (() => undefined),\n });\n }\n\n private static inferMaintenanceConfiguration(\n storage: NodeTelemetryCollectorOptions['storage'],\n ): NodeCombinedTelemetryOptions['sqlite']['maintenance'] | null {\n return storage instanceof SQLiteTelemetryTransport\n ? storage.maintenanceConfiguration()\n : null;\n }\n\n private static requiredCollectorCapabilities(\n maintenanceConfigured: boolean,\n requested: readonly (keyof TelemetryStorageCapabilities)[] = [],\n ): readonly (keyof TelemetryStorageCapabilities)[] {\n const required = new Set<keyof TelemetryStorageCapabilities>(requested);\n if (maintenanceConfigured) {\n required.add('rollups');\n required.add('retention');\n required.add('maintenance');\n }\n return Object.freeze([...required]);\n }\n\n private static requiredCombinedCapabilities(): readonly (keyof TelemetryStorageCapabilities)[] {\n return Object.freeze([\n 'rawPersistence',\n 'metricSamples',\n 'rollups',\n 'queries',\n 'retention',\n 'maintenance',\n ]);\n }\n}\n","import type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n} from '../core/types/storage.types.js';\nimport type {\n MaintenanceCoordinatorOptions,\n MaintenanceLifecycleEvent,\n MaintenanceRunResult,\n} from './types/maintenance_coordinator.types.js';\n\nexport class MaintenanceCoordinator<IntervalHandle = unknown> {\n private running = false;\n private stopped = true;\n private intervalHandle: IntervalHandle | null = null;\n private activeCompletion: Promise<void> = Promise.resolve();\n private resolveActiveCompletion: () => void = () => undefined;\n\n constructor(private readonly options: MaintenanceCoordinatorOptions<IntervalHandle>) {\n if (options.intervalMs <= 0 || options.maxWorkMs <= 0 || options.maxReclaimPages < 0) {\n throw new Error('Telemetry maintenance interval and budgets are invalid');\n }\n }\n\n start(): void {\n if (!this.stopped) {\n return;\n }\n this.stopped = false;\n this.intervalHandle = this.options.createInterval(() => {\n void this.run().catch(() => undefined);\n }, this.options.intervalMs);\n }\n\n async run(): Promise<MaintenanceRunResult> {\n if (this.stopped) {\n return { kind: 'skipped', reason: 'stopped' };\n }\n if (this.running) {\n return { kind: 'skipped', reason: 'already-running' };\n }\n this.running = true;\n this.beginActiveRun();\n let runId = 'maintenance-run-unavailable';\n let startedAtMs = 0;\n const stages: MaintenanceStageResult[] = [];\n try {\n runId = this.options.createRunId();\n startedAtMs = this.options.now();\n this.publish({\n type: 'maintenance.started',\n occurredAtMs: startedAtMs,\n runId,\n payload: { stages: [], failedStage: null, error: null },\n });\n const started = await this.record({\n runId,\n kind: 'scheduled',\n state: 'started',\n startedAtMs,\n completedAtMs: null,\n stages: [],\n failedStage: null,\n error: null,\n });\n if (!started.ok) {\n return await this.failed(runId, startedAtMs, stages, 'rollup', started.error, 'scheduled');\n }\n const rollup = await this.options.storage.materializeRollups(this.options.now(), this.options.maxWorkMs);\n if (!rollup.ok) {\n return await this.failed(runId, startedAtMs, stages, 'rollup', rollup.error, 'scheduled');\n }\n stages.push(rollup.value);\n\n const retention = await this.options.storage.enforceRetention(\n this.options.now(),\n () => !this.stopped,\n );\n if (!retention.ok) {\n return await this.failed(runId, startedAtMs, stages, 'retention', retention.error, 'scheduled');\n }\n stages.push(retention.value);\n\n const checkpoint = await this.options.storage.checkpoint();\n if (!checkpoint.ok) {\n return await this.failed(runId, startedAtMs, stages, 'checkpoint', checkpoint.error, 'scheduled');\n }\n stages.push(checkpoint.value);\n\n const reclaim = await this.options.storage.reclaim(this.options.maxReclaimPages);\n if (!reclaim.ok) {\n return await this.failed(runId, startedAtMs, stages, 'reclaim', reclaim.error, 'scheduled');\n }\n stages.push(reclaim.value);\n\n const result: MaintenanceRunResult = {\n kind: 'completed',\n runId,\n stages: Object.freeze(stages),\n };\n const completedAtMs = this.options.now();\n const recorded = await this.record({\n runId,\n kind: 'scheduled',\n state: 'completed',\n startedAtMs,\n completedAtMs,\n stages: result.stages,\n failedStage: null,\n error: null,\n });\n if (!recorded.ok) {\n return await this.failed(\n runId,\n startedAtMs,\n stages,\n 'reclaim',\n recorded.error,\n 'scheduled',\n );\n }\n this.publish({\n type: 'maintenance.completed',\n occurredAtMs: completedAtMs,\n runId,\n payload: { stages: result.stages, failedStage: null, error: null },\n });\n return result;\n } catch (cause) {\n return await this.failed(\n runId,\n startedAtMs,\n stages,\n stages[stages.length - 1]?.stage ?? 'rollup',\n cause instanceof Error ? cause.message : String(cause),\n 'scheduled',\n );\n } finally {\n this.running = false;\n this.finishActiveRun();\n }\n }\n\n async runFinal(deadlineMs: number): Promise<MaintenanceRunResult> {\n if (!this.stopped) {\n throw new Error('Final telemetry maintenance requires a stopped, quiescent scheduler');\n }\n if (this.running) {\n return { kind: 'skipped', reason: 'already-running' };\n }\n if (this.options.now() >= deadlineMs) {\n return { kind: 'skipped', reason: 'deadline-exhausted' };\n }\n this.stopped = false;\n try {\n const result = await this.waitForRunResult(this.run(), deadlineMs);\n return result ?? { kind: 'skipped', reason: 'deadline-exhausted' };\n } finally {\n this.stopped = true;\n }\n }\n\n async compact(deadlineMs: number): Promise<MaintenanceRunResult> {\n if (this.stopped) {\n return { kind: 'skipped', reason: 'stopped' };\n }\n if (this.running) {\n return { kind: 'skipped', reason: 'already-running' };\n }\n this.running = true;\n this.beginActiveRun();\n const runId = this.options.createRunId();\n const startedAtMs = this.options.now();\n this.publish({\n type: 'maintenance.started',\n occurredAtMs: startedAtMs,\n runId,\n payload: { stages: [], failedStage: null, error: null },\n });\n try {\n const started = await this.record({\n runId,\n kind: 'compaction',\n state: 'started',\n startedAtMs,\n completedAtMs: null,\n stages: [],\n failedStage: null,\n error: null,\n });\n if (!started.ok) {\n return await this.failed(runId, startedAtMs, [], 'compaction', started.error, 'compaction');\n }\n const compacted = await this.options.storage.compact(deadlineMs);\n if (!compacted.ok) {\n return await this.failed(runId, startedAtMs, [], 'compaction', compacted.error, 'compaction');\n }\n const stages = Object.freeze([compacted.value]);\n const completedAtMs = this.options.now();\n const recorded = await this.record({\n runId,\n kind: 'compaction',\n state: 'completed',\n startedAtMs,\n completedAtMs,\n stages,\n failedStage: null,\n error: null,\n });\n if (!recorded.ok) {\n return await this.failed(\n runId,\n startedAtMs,\n stages,\n 'compaction',\n recorded.error,\n 'compaction',\n );\n }\n this.publish({\n type: 'maintenance.completed',\n occurredAtMs: completedAtMs,\n runId,\n payload: { stages, failedStage: null, error: null },\n });\n return { kind: 'completed', runId, stages };\n } catch (cause) {\n return await this.failed(\n runId,\n startedAtMs,\n [],\n 'compaction',\n cause instanceof Error ? cause.message : String(cause),\n 'compaction',\n );\n } finally {\n this.running = false;\n this.finishActiveRun();\n }\n }\n\n async stop(deadlineMs: number): Promise<void> {\n this.stopped = true;\n if (this.intervalHandle !== null) {\n this.options.clearInterval(this.intervalHandle);\n this.intervalHandle = null;\n }\n await this.waitForActiveCompletion(deadlineMs);\n }\n\n private beginActiveRun(): void {\n this.activeCompletion = new Promise<void>((resolve) => {\n this.resolveActiveCompletion = resolve;\n });\n }\n\n private finishActiveRun(): void {\n this.resolveActiveCompletion();\n this.resolveActiveCompletion = () => undefined;\n }\n\n private async waitForActiveCompletion(deadlineMs: number): Promise<void> {\n if (!this.running) {\n return;\n }\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n return;\n }\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(finish, Math.min(remainingMs, 2_147_483_647));\n void this.activeCompletion.then(finish, finish);\n });\n }\n\n private async waitForRunResult(\n operation: Promise<MaintenanceRunResult>,\n deadlineMs: number,\n ): Promise<MaintenanceRunResult | null> {\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n void operation.catch(() => undefined);\n return null;\n }\n return new Promise<MaintenanceRunResult | null>((resolve, reject) => {\n let settled = false;\n const finish = (result: MaintenanceRunResult | null, error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (error === undefined) {\n resolve(result);\n } else {\n reject(error);\n }\n };\n const timer = setTimeout(() => finish(null), Math.min(remainingMs, 2_147_483_647));\n void operation.then(\n (result) => finish(result),\n (error: unknown) => finish(null, error),\n );\n });\n }\n\n private async failed(\n runId: string,\n startedAtMs: number,\n stages: readonly MaintenanceStageResult[],\n stage: MaintenanceStageResult['stage'],\n error: string,\n kind: MaintenanceRunRecord['kind'],\n ): Promise<MaintenanceRunResult> {\n const completedAtMs = this.options.now();\n const recorded = await this.record({\n runId,\n kind,\n state: 'failed',\n startedAtMs,\n completedAtMs,\n stages,\n failedStage: stage,\n error,\n });\n const resolvedError = recorded.ok\n ? error\n : `${error}; maintenance record failed: ${recorded.error}`;\n const result: MaintenanceRunResult = {\n kind: 'failed',\n runId,\n stages: Object.freeze([...stages]),\n stage,\n error: resolvedError,\n };\n this.publish({\n type: 'maintenance.failed',\n occurredAtMs: completedAtMs,\n runId,\n payload: {\n stages: result.stages,\n failedStage: stage,\n error: resolvedError,\n },\n });\n return result;\n }\n\n private async record(record: MaintenanceRunRecord) {\n const recorder = this.options.storage.recordMaintenance;\n return recorder\n ? recorder.call(this.options.storage, Object.freeze(record))\n : { ok: true as const, value: undefined };\n }\n\n private publish(event: MaintenanceLifecycleEvent): void {\n try {\n this.options.observe(Object.freeze(event));\n } catch {\n // Maintenance observation is out-of-band and cannot alter storage work.\n }\n }\n}\n","import type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryBatchTransport,\n TelemetryBatchTransportCapabilities,\n} from '../core/types/transport.types.js';\n\nexport class InMemoryBatchTransport implements TelemetryBatchTransport {\n readonly capabilities: TelemetryBatchTransportCapabilities;\n private receiver: TelemetryBatchReceiver | null;\n private pending = 0;\n private closed = false;\n\n constructor(\n readonly transportId: string,\n receiver: TelemetryBatchReceiver | null,\n maxPendingBatches = 16,\n ) {\n this.receiver = receiver;\n this.capabilities = Object.freeze({\n maxBatchBytes: 1_000_000,\n acknowledgement: 'durable',\n ordering: 'producer',\n boundedCapacity: maxPendingBatches,\n });\n }\n\n connect(receiver: TelemetryBatchReceiver | null): void {\n this.receiver = receiver;\n }\n\n async send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n if (this.closed) {\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'closed',\n reason: 'In-memory telemetry transport is closed',\n targetStates: [],\n };\n }\n if (this.receiver === null || this.pending >= this.capabilities.boundedCapacity) {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.receiver === null ? 'No receiver is connected' : 'Transport capacity is full',\n retryAfterMs: 1,\n targetStates: [],\n };\n }\n this.pending += 1;\n try {\n return await this.receiver.receive(batch);\n } finally {\n this.pending -= 1;\n }\n }\n\n async flush(deadlineMs: number): Promise<void> {\n while (this.pending > 0 && Date.now() < deadlineMs) {\n const remainingMs = Math.max(0, deadlineMs - Date.now());\n await new Promise<void>((resolve) => setTimeout(resolve, Math.min(1, remainingMs)));\n }\n }\n\n async close(deadlineMs: number): Promise<void> {\n this.closed = true;\n await this.flush(deadlineMs);\n }\n}\n","import type { MetricDefinition } from './types/metric.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\n\nexport class MetricDefinitionContract {\n normalize(definition: MetricDefinition): TelemetryResult<MetricDefinition, string> {\n const parsedSelector = this.parseSelector(definition.selector);\n if (!parsedSelector.ok) {\n return parsedSelector;\n }\n\n const bracketGroupBy = parsedSelector.value.groupBy;\n const configuredGroupBy = definition.groupBy;\n const bothSpecifyDifferentGrouping = bracketGroupBy.length > 0\n && configuredGroupBy.length > 0\n && bracketGroupBy.join('.') !== configuredGroupBy.join('.');\n if (bothSpecifyDifferentGrouping) {\n return { ok: false, error: `Metric ${definition.name} has conflicting selector and groupBy declarations` };\n }\n const groupBy = configuredGroupBy.length > 0 ? configuredGroupBy : bracketGroupBy;\n\n const basicError = this.validateBasic(definition, parsedSelector.value.selector, groupBy);\n if (basicError !== null) {\n return { ok: false, error: basicError };\n }\n if (parsedSelector.value.wildcardUngrouped\n && definition.measurements.some((measurement) => measurement.kind !== 'count')) {\n return {\n ok: false,\n error: `Metric ${definition.name} uses [*] and may only declare count`,\n };\n }\n\n return {\n ok: true,\n value: Object.freeze({\n ...definition,\n selector: parsedSelector.value.selector,\n groupBy: Object.freeze([...groupBy]),\n resolutionsMs: Object.freeze([...definition.resolutionsMs].sort((left, right) => left - right)),\n measurements: Object.freeze([...definition.measurements]),\n targetIds: Object.freeze([...definition.targetIds]),\n cardinality: Object.freeze({ ...definition.cardinality }),\n }),\n };\n }\n\n matches(selector: string, label: string): boolean {\n const selectorSegments = selector.split('.');\n const labelSegments = label.split('.');\n return this.matchSegments(selectorSegments, labelSegments, 0, 0);\n }\n\n private parseSelector(selector: string): TelemetryResult<Readonly<{\n selector: string;\n groupBy: readonly string[];\n wildcardUngrouped: boolean;\n }>, string> {\n if (selector.startsWith('[')) {\n return { ok: false, error: 'A metric selector cannot omit its event label or glob' };\n }\n\n const bracketStart = selector.lastIndexOf('[');\n if (bracketStart < 0) {\n return { ok: true, value: { selector, groupBy: [], wildcardUngrouped: false } };\n }\n if (!selector.endsWith(']')) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n\n const eventSelector = selector.slice(0, bracketStart);\n const bracket = selector.slice(bracketStart + 1, -1).trim();\n if (!eventSelector || !bracket) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n return {\n ok: true,\n value: {\n selector: eventSelector,\n groupBy: bracket === '*' ? [] : [bracket],\n wildcardUngrouped: bracket === '*',\n },\n };\n }\n\n private validateBasic(\n definition: MetricDefinition,\n selector: string,\n groupBy: readonly string[],\n ): string | null {\n if (!/^[A-Za-z0-9_*][A-Za-z0-9_.:*\\-]*$/.test(selector)) {\n return `Metric ${definition.name} has an invalid selector`;\n }\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(definition.name)) {\n return `Metric name ${definition.name} is invalid`;\n }\n if (!Number.isInteger(definition.version) || definition.version <= 0) {\n return `Metric ${definition.name} must have a positive integer version`;\n }\n if (definition.measurements.length === 0) {\n return `Metric ${definition.name} must declare at least one measurement`;\n }\n const invalidResolution = definition.resolutionsMs.some(\n (resolution) => !Number.isInteger(resolution) || resolution <= 0,\n );\n const duplicateResolution = new Set(definition.resolutionsMs).size !== definition.resolutionsMs.length;\n if (invalidResolution || duplicateResolution || definition.resolutionsMs.length === 0) {\n return `Metric ${definition.name} has invalid or duplicate resolutions`;\n }\n const missingCardinality = groupBy.find((field) => definition.cardinality[field] === undefined);\n if (missingCardinality) {\n return `Metric ${definition.name} is missing cardinality policy for ${missingCardinality}`;\n }\n const invalidCardinality = Object.values(definition.cardinality).some(\n (rule) => !Number.isInteger(rule.maxValuesPerBucket) || rule.maxValuesPerBucket <= 0,\n );\n if (invalidCardinality) {\n return `Metric ${definition.name} has an invalid cardinality limit`;\n }\n return null;\n }\n\n private matchSegments(\n selector: readonly string[],\n label: readonly string[],\n selectorIndex: number,\n labelIndex: number,\n ): boolean {\n if (selectorIndex === selector.length) {\n return labelIndex === label.length;\n }\n const segment = selector[selectorIndex];\n if (segment === '**') {\n if (selectorIndex === selector.length - 1) {\n return true;\n }\n for (let next = labelIndex; next <= label.length; next += 1) {\n if (this.matchSegments(selector, label, selectorIndex + 1, next)) {\n return true;\n }\n }\n return false;\n }\n if (labelIndex >= label.length) {\n return false;\n }\n const segmentMatches = segment === '*' || segment === label[labelIndex];\n return segmentMatches\n && this.matchSegments(selector, label, selectorIndex + 1, labelIndex + 1);\n }\n}\n","const UTF8_ENCODER = new TextEncoder();\n\n/**\n * Canonical key order is UTF-8 byte order. This must stay byte-identical to\n * the native Rust collector, whose serde_json BTreeMap serialization sorts\n * object keys the same way; locale-aware comparisons (localeCompare) depend\n * on the ICU build and diverge from the Rust side, which invalidates every\n * cross-language checksum.\n */\nexport function compareCanonicalKeys(left: string, right: string): number {\n if (left === right) return 0;\n // Code-unit comparison equals UTF-8 byte order for ASCII-only keys.\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x7f]*$/.test(left) && /^[\\x00-\\x7f]*$/.test(right)) {\n return left < right ? -1 : 1;\n }\n const leftBytes = UTF8_ENCODER.encode(left);\n const rightBytes = UTF8_ENCODER.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = (leftBytes[index] ?? 0) - (rightBytes[index] ?? 0);\n if (difference !== 0) return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error('Canonical telemetry JSON cannot encode a non-finite number');\n }\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((item) => canonicalJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof value !== 'object') {\n throw new Error(`Canonical telemetry JSON cannot encode ${typeof value}`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => compareCanonicalKeys(left, right));\n const properties = entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);\n return `{${properties.join(',')}}`;\n}\n\nexport function telemetryUtf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function telemetryChecksum(value: unknown): string {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = BigInt.asUintN(64, hash * prime);\n }\n\n return hash.toString(16).padStart(16, '0');\n}\n","import { canonicalJson } from './helper/canonical_json.js';\nimport { MetricDefinitionContract } from './metric_definition_contract.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type {\n ExtractedMetricSample,\n MetricDefinition,\n MetricExtraction,\n MetricExtractionFailure,\n} from './types/metric.types.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\n\nexport class MetricExtractor {\n private readonly contract = new MetricDefinitionContract();\n\n constructor(private readonly definitions: readonly MetricDefinition[]) {}\n\n extract(envelopes: readonly TelemetryEnvelope[]): MetricExtraction {\n const samples: ExtractedMetricSample[] = [];\n const failures: MetricExtractionFailure[] = [];\n for (const envelope of envelopes) {\n for (const definition of this.definitions) {\n if (!this.contract.matches(definition.selector, envelope.label)) {\n continue;\n }\n const extracted = this.extractDefinition(definition, envelope);\n if (extracted.ok) {\n samples.push(extracted.sample);\n } else if (definition.missingField === 'record-failure') {\n failures.push({\n metricName: definition.name,\n definitionVersion: definition.version,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n reason: extracted.reason,\n });\n }\n }\n }\n return Object.freeze({\n samples: Object.freeze(samples),\n failures: Object.freeze(failures),\n });\n }\n\n private extractDefinition(\n definition: MetricDefinition,\n envelope: TelemetryEnvelope,\n ):\n | Readonly<{ ok: true; sample: ExtractedMetricSample }>\n | Readonly<{ ok: false; reason: string }> {\n const dimensions: Record<string, TelemetryJsonValue> = {};\n for (const field of definition.groupBy) {\n const dimension = this.readField(envelope, field);\n if (!this.isDimensionValue(dimension)) {\n return { ok: false, reason: `Missing or invalid dimension ${field}` };\n }\n dimensions[field] = dimension;\n }\n\n const values: Record<string, number> = { __count: 1 };\n for (const measurement of definition.measurements) {\n if (measurement.kind === 'count') {\n continue;\n }\n const measured = this.readField(envelope, measurement.field);\n if (typeof measured !== 'number' || !Number.isFinite(measured)) {\n return { ok: false, reason: `Missing or non-numeric measurement ${measurement.field}` };\n }\n values[measurement.field] = measured;\n }\n\n const frozenDimensions = Object.freeze(dimensions);\n return {\n ok: true,\n sample: Object.freeze({\n metricName: definition.name,\n definitionVersion: definition.version,\n occurredAtMs: envelope.occurredAtMs,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n dimensions: frozenDimensions,\n dimensionKey: canonicalJson(frozenDimensions),\n values: Object.freeze(values),\n targetIds: definition.targetIds,\n }),\n };\n }\n\n private readField(envelope: TelemetryEnvelope, path: string): TelemetryJsonValue | undefined {\n const topLevel = this.readTopLevel(envelope, path);\n if (topLevel !== undefined) {\n return topLevel;\n }\n const segments = path.split('.');\n let current: TelemetryJsonValue = envelope.metadata;\n for (const segment of segments) {\n if (!this.isJsonObject(current)) {\n return undefined;\n }\n const nextValue: TelemetryJsonValue | undefined = current[segment];\n if (nextValue === undefined) {\n return undefined;\n }\n current = nextValue;\n }\n return current;\n }\n\n private readTopLevel(envelope: TelemetryEnvelope, path: string): TelemetryJsonValue | undefined {\n switch (path) {\n case 'conversationId':\n return envelope.conversationId;\n case 'correlationId':\n return envelope.correlationId;\n case 'source':\n return envelope.source;\n case 'processKind':\n return envelope.processKind;\n case 'level':\n return envelope.level;\n case 'label':\n return envelope.label;\n case 'producerId':\n return envelope.producerId;\n default:\n return undefined;\n }\n }\n\n private isDimensionValue(value: TelemetryJsonValue | undefined): value is string | number | boolean | null {\n return value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n}\n","import type { TelemetryAdmissionPolicy } from '../types/client.types.js';\nimport type { MetadataSnapshotLimits } from '../types/metadata.types.js';\nimport type { TelemetryBatchValidationLimits } from '../types/transport.types.js';\n\nexport const DEFAULT_TELEMETRY_ADMISSION_POLICY: TelemetryAdmissionPolicy = Object.freeze({\n maxQueuedEvents: 2_000,\n maxQueuedBytes: 2_000_000,\n maxBatchEvents: 128,\n maxBatchBytes: 256_000,\n maxInFlightBatches: 1,\n retryLimit: 3,\n retryBaseDelayMs: 25,\n sampleRates: Object.freeze({\n low: 1,\n normal: 1,\n high: 1,\n }),\n});\n\nexport const DEFAULT_METADATA_SNAPSHOT_LIMITS: MetadataSnapshotLimits = Object.freeze({\n maxBytes: 32_768,\n maxDepth: 8,\n maxProperties: 256,\n maxArrayLength: 128,\n maxStringLength: 4_096,\n maxErrorStackLength: 8_192,\n redactions: Object.freeze([]),\n});\n\nexport const DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS: TelemetryBatchValidationLimits = Object.freeze({\n maxBatchEvents: 1_024,\n maxBatchBytes: 1_000_000,\n maxEventBytes: 256_000,\n maxMetadataBytes: 131_072,\n maxMetadataDepth: 16,\n maxMetadataProperties: 1_024,\n maxMetadataArrayLength: 1_024,\n maxMetadataStringBytes: 65_536,\n maxDropCounters: 15,\n maxIdentityBytes: 1_024,\n});\n","import {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from './helper/canonical_json.js';\nimport { DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS } from './helper/client_defaults.js';\nimport type { TelemetryEnvelope } from './types/envelope.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryBatch,\n TelemetryBatchValidationLimits,\n TelemetryDropCounter,\n} from './types/transport.types.js';\n\nconst BATCH_KEYS = Object.freeze([\n 'schemaVersion',\n 'producerId',\n 'sequenceStart',\n 'sequenceEnd',\n 'idempotencyKey',\n 'checksum',\n 'envelopes',\n 'dropCounters',\n]);\n\nconst ENVELOPE_KEYS = Object.freeze([\n 'schemaVersion',\n 'eventId',\n 'producerId',\n 'sequence',\n 'occurredAtMs',\n 'monotonicNs',\n 'source',\n 'processKind',\n 'level',\n 'label',\n 'conversationId',\n 'correlationId',\n 'metadata',\n]);\n\nconst DROP_COUNTER_KEYS = Object.freeze(['reason', 'priority', 'count']);\nconst DROP_REASONS = new Set(['capacity', 'sampled', 'stopped', 'invalid', 'transport']);\nconst DROP_PRIORITIES = new Set(['low', 'normal', 'high']);\n\ntype JsonValidationState = {\n properties: number;\n bytes: number;\n active: WeakSet<object>;\n};\n\nexport class TelemetryBatchContract {\n static readonly schemaVersion = 1;\n static readonly checksumAlgorithm = 'fnv1a64-canonical-json-v1';\n readonly limits: TelemetryBatchValidationLimits;\n\n constructor(limits: Partial<TelemetryBatchValidationLimits> = {}) {\n this.limits = Object.freeze({\n ...DEFAULT_TELEMETRY_BATCH_VALIDATION_LIMITS,\n ...limits,\n });\n this.validateLimits();\n }\n\n create(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.createChecked(envelopes, dropCounters);\n } catch {\n return { ok: false, error: 'Telemetry batch creation failed safe validation' };\n }\n }\n\n validate(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n try {\n return this.validateChecked(batch);\n } catch {\n return { ok: false, error: 'Telemetry batch validation failed safely' };\n }\n }\n\n private createChecked(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): TelemetryResult<TelemetryBatch, string> {\n const payloadError = this.validatePayload(envelopes, dropCounters);\n if (payloadError !== null) {\n return { ok: false, error: payloadError };\n }\n const payloadBytesError = this.payloadBytesError(envelopes, dropCounters);\n if (payloadBytesError !== null) {\n return { ok: false, error: payloadBytesError };\n }\n\n const first = envelopes[0];\n const last = envelopes[envelopes.length - 1];\n if (!first || !last) {\n return { ok: false, error: 'A telemetry batch must contain a first and last envelope' };\n }\n\n const producerId = first.producerId;\n const sequenceStart = first.sequence;\n const sequenceEnd = last.sequence;\n const checksumPayload = this.checksumPayload(\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n );\n const checksum = telemetryChecksum(checksumPayload);\n const idempotencyKey = `tb1:${producerId}:${sequenceStart}-${sequenceEnd}:${checksum}`;\n const batch = Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n idempotencyKey,\n checksum,\n envelopes: Object.freeze([...envelopes]),\n dropCounters: Object.freeze([...dropCounters]),\n });\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const byteError = this.serializedByteError(batch, this.limits.maxBatchBytes, 'batch');\n return byteError === null\n ? { ok: true, value: this.detachBatch(batch) }\n : { ok: false, error: byteError };\n }\n\n private validateChecked(batch: unknown): TelemetryResult<TelemetryBatch, string> {\n if (!this.isRecord(batch)) {\n return { ok: false, error: 'Telemetry batch must be a plain object' };\n }\n const schemaVersion = batch.schemaVersion;\n if (!Number.isSafeInteger(schemaVersion)) {\n return { ok: false, error: 'Telemetry batch schema version must be a safe integer' };\n }\n if (schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return { ok: false, error: `Unsupported telemetry schema version ${String(schemaVersion)}` };\n }\n if (!this.hasExactKeys(batch, BATCH_KEYS)) {\n return { ok: false, error: 'Telemetry batch fields do not match the schema' };\n }\n\n const framingError = this.validateFraming(batch);\n if (framingError !== null) {\n return { ok: false, error: framingError };\n }\n const recreated = this.create(\n batch.envelopes as readonly TelemetryEnvelope[],\n batch.dropCounters as readonly TelemetryDropCounter[],\n );\n if (!recreated.ok) {\n return recreated;\n }\n const identityError = this.compareFraming(batch, recreated.value);\n return identityError === null\n ? { ok: true, value: recreated.value }\n : { ok: false, error: identityError };\n }\n\n private validatePayload(envelopes: unknown, dropCounters: unknown): string | null {\n if (!Array.isArray(envelopes) || envelopes.length === 0) {\n return 'A telemetry batch must contain at least one envelope';\n }\n if (envelopes.length > this.limits.maxBatchEvents) {\n return `Telemetry batch exceeds ${this.limits.maxBatchEvents} envelopes`;\n }\n const envelopeError = this.validateEnvelopes(envelopes);\n return envelopeError ?? this.validateDropCounters(dropCounters);\n }\n\n private validateEnvelopes(envelopes: readonly unknown[]): string | null {\n let previousSequence = -1;\n let producerId: string | null = null;\n for (const envelope of envelopes) {\n const envelopeError = this.validateEnvelope(envelope, producerId, previousSequence);\n if (envelopeError !== null) {\n return envelopeError;\n }\n const typedEnvelope = envelope as TelemetryEnvelope;\n producerId = typedEnvelope.producerId;\n previousSequence = typedEnvelope.sequence;\n }\n return null;\n }\n\n private validateEnvelope(\n envelope: unknown,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (!this.isRecord(envelope) || !this.hasExactKeys(envelope, ENVELOPE_KEYS)) {\n return 'Telemetry envelope fields do not match the schema';\n }\n const identityError = this.validateEnvelopeIdentity(envelope, expectedProducerId, previousSequence);\n if (identityError !== null) {\n return identityError;\n }\n const valueError = this.validateEnvelopeValues(envelope);\n if (valueError !== null) {\n return valueError;\n }\n const metadataError = this.validateMetadata(envelope.metadata);\n return metadataError ?? this.serializedByteError(envelope, this.limits.maxEventBytes, 'event');\n }\n\n private validateEnvelopeIdentity(\n envelope: Record<string, unknown>,\n expectedProducerId: string | null,\n previousSequence: number,\n ): string | null {\n if (envelope.schemaVersion !== TelemetryBatchContract.schemaVersion) {\n return 'Telemetry envelope schema version does not match its batch';\n }\n if (!this.isIdentity(envelope.producerId)) {\n return 'Telemetry envelope producer identity is invalid';\n }\n if (!this.isSequence(envelope.sequence) || envelope.sequence <= previousSequence) {\n return 'Telemetry envelope sequences must be nonnegative safe integers in increasing order';\n }\n if (expectedProducerId !== null && envelope.producerId !== expectedProducerId) {\n return 'A telemetry batch cannot mix producer identities';\n }\n const eventId = `${envelope.producerId}:${envelope.sequence}`;\n if (envelope.eventId !== eventId || telemetryUtf8Length(eventId) > this.limits.maxIdentityBytes) {\n return 'Telemetry envelope event identity is invalid';\n }\n return null;\n }\n\n private validateEnvelopeValues(envelope: Record<string, unknown>): string | null {\n if (!Number.isSafeInteger(envelope.occurredAtMs) || Number(envelope.occurredAtMs) < 0) {\n return 'Telemetry envelope occurredAtMs must be a nonnegative safe integer';\n }\n if (!this.isMonotonicTimestamp(envelope.monotonicNs)) {\n return 'Telemetry envelope monotonicNs is invalid';\n }\n if (!this.isIdentity(envelope.source) || !this.isIdentity(envelope.processKind)) {\n return 'Telemetry envelope source and process kind are invalid';\n }\n if (!this.isIdentity(envelope.level)) {\n return 'Telemetry envelope level is invalid';\n }\n if (!this.isLabel(envelope.label)) {\n return 'Telemetry envelope label is invalid';\n }\n if (!this.isConversationId(envelope.conversationId)) {\n return 'Telemetry envelope conversation identity is invalid';\n }\n if (!this.isOptionalBoundedString(envelope.correlationId)) {\n return 'Telemetry envelope correlation identity is invalid';\n }\n return null;\n }\n\n private validateMetadata(metadata: unknown): string | null {\n if (!this.isRecord(metadata)) {\n return 'Telemetry envelope metadata must be a plain JSON object';\n }\n const state: JsonValidationState = { properties: 0, bytes: 0, active: new WeakSet<object>() };\n const jsonError = this.validateJsonValue(metadata, 0, state);\n return jsonError ?? this.serializedByteError(metadata, this.limits.maxMetadataBytes, 'metadata');\n }\n\n private validateJsonValue(value: unknown, depth: number, state: JsonValidationState): string | null {\n if (value === null || typeof value === 'boolean') {\n state.bytes += value === null ? 4 : 5;\n return null;\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n return 'Telemetry metadata contains a non-finite number';\n }\n state.bytes += String(value).length;\n return this.metadataBudgetError(state);\n }\n if (typeof value === 'string') {\n if (!this.isWithinUtf8Limit(value, this.limits.maxMetadataStringBytes)) {\n return 'Telemetry metadata string exceeds the receiver limit';\n }\n state.bytes += telemetryUtf8Length(value);\n return this.metadataBudgetError(state);\n }\n if (typeof value !== 'object') {\n return 'Telemetry metadata contains a non-JSON value';\n }\n if (depth > this.limits.maxMetadataDepth) {\n return 'Telemetry metadata exceeds the receiver depth limit';\n }\n return Array.isArray(value)\n ? this.validateJsonArray(value, depth, state)\n : this.validateJsonObject(value, depth, state);\n }\n\n private validateJsonArray(value: readonly unknown[], depth: number, state: JsonValidationState): string | null {\n if (value.length > this.limits.maxMetadataArrayLength) {\n return 'Telemetry metadata array exceeds the receiver length limit';\n }\n const keys = Object.keys(value);\n if (keys.length !== value.length || Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata arrays must be dense JSON arrays';\n }\n return this.validateJsonChildren(value, value, depth, state);\n }\n\n private validateJsonObject(value: object, depth: number, state: JsonValidationState): string | null {\n if (!this.isRecord(value)) {\n return 'Telemetry metadata contains a non-plain object';\n }\n const keys = Object.keys(value);\n if (Object.getOwnPropertySymbols(value).length > 0) {\n return 'Telemetry metadata objects cannot contain symbol keys';\n }\n state.properties += keys.length;\n if (state.properties > this.limits.maxMetadataProperties) {\n return 'Telemetry metadata exceeds the receiver property limit';\n }\n if (keys.some((key) => !this.isWithinUtf8Limit(key, this.limits.maxMetadataStringBytes))) {\n return 'Telemetry metadata property name exceeds the receiver string limit';\n }\n for (const key of keys) {\n state.bytes += telemetryUtf8Length(key);\n }\n const budgetError = this.metadataBudgetError(state);\n if (budgetError !== null) {\n return budgetError;\n }\n return this.validateJsonChildren(value, keys.map((key) => Reflect.get(value, key)), depth, state);\n }\n\n private validateJsonChildren(\n owner: object,\n values: readonly unknown[],\n depth: number,\n state: JsonValidationState,\n ): string | null {\n if (state.active.has(owner)) {\n return 'Telemetry metadata cannot contain a cycle';\n }\n state.active.add(owner);\n try {\n for (const value of values) {\n const error = this.validateJsonValue(value, depth + 1, state);\n if (error !== null) {\n return error;\n }\n }\n return null;\n } finally {\n state.active.delete(owner);\n }\n }\n\n private validateDropCounters(dropCounters: unknown): string | null {\n if (!Array.isArray(dropCounters) || dropCounters.length > this.limits.maxDropCounters) {\n return 'Telemetry drop counters exceed the fixed receiver limit';\n }\n const identities = new Set<string>();\n let total = 0;\n for (const counter of dropCounters) {\n const error = this.validateDropCounter(counter, identities, total);\n if (error !== null) {\n return error;\n }\n total += (counter as TelemetryDropCounter).count;\n }\n return null;\n }\n\n private validateDropCounter(\n counter: unknown,\n identities: Set<string>,\n currentTotal: number,\n ): string | null {\n if (!this.isRecord(counter) || !this.hasExactKeys(counter, DROP_COUNTER_KEYS)) {\n return 'Telemetry drop counter fields do not match the schema';\n }\n if (!DROP_REASONS.has(String(counter.reason)) || !DROP_PRIORITIES.has(String(counter.priority))) {\n return 'Telemetry drop counter identity is invalid';\n }\n if (!Number.isSafeInteger(counter.count) || Number(counter.count) <= 0) {\n return 'Telemetry drop counter count must be a positive safe integer';\n }\n if (currentTotal > Number.MAX_SAFE_INTEGER - Number(counter.count)) {\n return 'Telemetry drop counter total exceeds the safe integer range';\n }\n const identity = `${counter.reason}:${counter.priority}`;\n if (identities.has(identity)) {\n return 'Telemetry drop counter identities must be unique within a batch';\n }\n identities.add(identity);\n return null;\n }\n\n private validateFraming(batch: Record<string, unknown>): string | null {\n if (!this.isIdentity(batch.producerId)) {\n return 'Telemetry batch producer identity is invalid';\n }\n if (!this.isSequence(batch.sequenceStart) || !this.isSequence(batch.sequenceEnd)) {\n return 'Telemetry batch sequence range must use nonnegative safe integers';\n }\n if (Number(batch.sequenceEnd) < Number(batch.sequenceStart)) {\n return 'Telemetry batch sequence range is reversed';\n }\n if (typeof batch.checksum !== 'string' || !/^[a-f0-9]{16}$/.test(batch.checksum)) {\n return 'Telemetry batch checksum is invalid';\n }\n if (typeof batch.idempotencyKey !== 'string'\n || !this.isWithinUtf8Limit(batch.idempotencyKey, this.limits.maxIdentityBytes)) {\n return 'Telemetry batch idempotency identity is invalid';\n }\n return null;\n }\n\n private compareFraming(batch: Record<string, unknown>, recreated: TelemetryBatch): string | null {\n const matches = recreated.checksum === batch.checksum\n && recreated.idempotencyKey === batch.idempotencyKey\n && recreated.sequenceStart === batch.sequenceStart\n && recreated.sequenceEnd === batch.sequenceEnd\n && recreated.producerId === batch.producerId;\n return matches ? null : 'Telemetry batch framing or checksum is invalid';\n }\n\n private checksumPayload(\n producerId: string,\n sequenceStart: number,\n sequenceEnd: number,\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): object {\n return {\n schemaVersion: TelemetryBatchContract.schemaVersion,\n producerId,\n sequenceStart,\n sequenceEnd,\n envelopes,\n dropCounters,\n };\n }\n\n private serializedByteError(value: unknown, maximum: number, kind: string): string | null {\n const bytes = telemetryUtf8Length(canonicalJson(value));\n return bytes <= maximum ? null : `Telemetry ${kind} exceeds ${maximum} bytes`;\n }\n\n private payloadBytesError(\n envelopes: readonly TelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): string | null {\n let bytes = 0;\n for (const envelope of envelopes) {\n bytes += telemetryUtf8Length(canonicalJson(envelope));\n if (bytes > this.limits.maxBatchBytes) {\n return `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`;\n }\n }\n bytes += telemetryUtf8Length(canonicalJson(dropCounters));\n return bytes > this.limits.maxBatchBytes\n ? `Telemetry batch exceeds ${this.limits.maxBatchBytes} bytes`\n : null;\n }\n\n private metadataBudgetError(state: JsonValidationState): string | null {\n return state.bytes > this.limits.maxMetadataBytes\n ? `Telemetry metadata exceeds ${this.limits.maxMetadataBytes} bytes`\n : null;\n }\n\n private detachBatch(batch: TelemetryBatch): TelemetryBatch {\n const detached = JSON.parse(canonicalJson(batch)) as TelemetryBatch;\n return this.deepFreeze(detached);\n }\n\n private deepFreeze<T>(value: T): T {\n if (typeof value !== 'object' || value === null || Object.isFrozen(value)) {\n return value;\n }\n for (const child of Object.values(value)) {\n this.deepFreeze(child);\n }\n return Object.freeze(value);\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const prototype = Object.getPrototypeOf(value) as { constructor?: { name?: unknown } } | null;\n return prototype === null || prototype.constructor?.name === 'Object';\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isSequence(value: unknown): value is number {\n return Number.isSafeInteger(value) && Number(value) >= 0;\n }\n\n private isIdentity(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && value.trim().length > 0\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value);\n }\n\n private isLabel(value: unknown): value is string {\n return typeof value === 'string'\n && value.length <= Math.min(256, this.limits.maxIdentityBytes)\n && /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(value)\n && this.isWithinUtf8Limit(value, Math.min(256, this.limits.maxIdentityBytes));\n }\n\n private isMonotonicTimestamp(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && value.length <= this.limits.maxIdentityBytes\n && /^\\d+$/.test(value)\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes));\n }\n\n private isConversationId(value: unknown): boolean {\n return value === null\n || (typeof value === 'number' && Number.isSafeInteger(value))\n || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isOptionalBoundedString(value: unknown): boolean {\n return value === null || (typeof value === 'string'\n && this.isWithinUtf8Limit(value, this.limits.maxIdentityBytes)\n && !/[\\u0000-\\u001f\\u007f]/.test(value));\n }\n\n private isWithinUtf8Limit(value: string, maximum: number): boolean {\n return value.length <= maximum && telemetryUtf8Length(value) <= maximum;\n }\n\n private validateLimits(): void {\n const values = Object.values(this.limits);\n if (values.some((value) => !Number.isSafeInteger(value) || value <= 0)) {\n throw new Error('Telemetry batch validation limits must be positive safe integers');\n }\n if (this.limits.maxMetadataBytes > this.limits.maxEventBytes\n || this.limits.maxEventBytes > this.limits.maxBatchBytes) {\n throw new Error('Telemetry receiver byte limits must satisfy metadata <= event <= batch');\n }\n }\n}\n","export type TelemetryDeadlineOutcome<T> =\n | Readonly<{ kind: 'completed'; value: T }>\n | Readonly<{ kind: 'failed'; error: unknown }>\n | Readonly<{ kind: 'deadline-exhausted' }>;\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nexport class TelemetryDeadlineGuard {\n async settle<T>(\n operation: Promise<T>,\n deadlineMs: number,\n now: () => number,\n ): Promise<TelemetryDeadlineOutcome<T>> {\n const observed: Promise<TelemetryDeadlineOutcome<T>> = operation.then(\n (value) => ({ kind: 'completed', value }),\n (error: unknown) => ({ kind: 'failed', error }),\n );\n const remainingMs = deadlineMs - now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n return { kind: 'deadline-exhausted' };\n }\n let timer: ReturnType<typeof setTimeout> | null = null;\n const outcome = await Promise.race([\n observed,\n new Promise<TelemetryDeadlineOutcome<T>>((resolve) => {\n timer = setTimeout(\n () => resolve({ kind: 'deadline-exhausted' }),\n Math.min(remainingMs, MAX_TIMER_DELAY_MS),\n );\n }),\n ]);\n if (timer !== null) {\n clearTimeout(timer);\n }\n return outcome;\n }\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryTargetDeliveryState,\n} from './types/transport.types.js';\n\nconst MAX_TARGET_STATES = 1_024;\nconst MAX_TARGET_ID_BYTES = 256;\nconst MAX_REASON_BYTES = 512;\n\nexport class TelemetryAcknowledgementContract {\n exceptionReason(cause: unknown): string {\n try {\n const value = cause instanceof Error ? cause.message : cause;\n return this.truncateReason(String(value));\n } catch {\n return 'Unknown telemetry transport failure';\n }\n }\n\n validateAndDetach(\n batch: TelemetryBatch,\n value: unknown,\n ): TelemetryResult<TelemetryAcknowledgement, string> {\n try {\n const initialError = this.acknowledgementError(batch, value);\n if (initialError !== null) {\n return { ok: false, error: initialError };\n }\n const detached: unknown = JSON.parse(canonicalJson(value));\n const detachedError = this.acknowledgementError(batch, detached);\n if (detachedError !== null) {\n return { ok: false, error: detachedError };\n }\n return { ok: true, value: this.freezeAcknowledgement(detached as TelemetryAcknowledgement) };\n } catch {\n return { ok: false, error: 'acknowledgement could not be inspected' };\n }\n }\n\n private acknowledgementError(batch: TelemetryBatch, value: unknown): string | null {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return 'acknowledgement identity is missing or mismatched';\n }\n const targetsError = this.targetStatesError(value.targetStates);\n if (targetsError !== null) {\n return targetsError;\n }\n switch (value.kind) {\n case 'committed':\n return this.committedAcknowledgementError(batch, value);\n case 'retryable':\n return this.retryableAcknowledgementError(value);\n case 'rejected':\n return this.rejectedAcknowledgementError(value);\n case 'conflict':\n return this.conflictAcknowledgementError(value);\n default:\n return 'acknowledgement kind is invalid';\n }\n }\n\n private committedAcknowledgementError(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])\n && Number.isSafeInteger(value.committedAtMs)\n && Number(value.committedAtMs) >= 0\n && value.acceptedEvents === batch.envelopes.length\n && typeof value.duplicate === 'boolean';\n return valid ? null : 'committed acknowledgement fields are invalid';\n }\n\n private retryableAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])\n && this.isBoundedReason(value.reason)\n && Number.isFinite(value.retryAfterMs)\n && Number(value.retryAfterMs) >= 0\n && Number(value.retryAfterMs) <= Number.MAX_SAFE_INTEGER;\n return valid ? null : 'retryable acknowledgement fields are invalid';\n }\n\n private rejectedAcknowledgementError(value: Record<string, unknown>): string | null {\n const codes = ['invalid-batch', 'unsupported-version', 'no-required-terminal', 'closed'];\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])\n && codes.includes(String(value.code))\n && this.isBoundedReason(value.reason);\n return valid ? null : 'rejected acknowledgement fields are invalid';\n }\n\n private conflictAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])\n && this.isBoundedReason(value.reason);\n return valid ? null : 'conflict acknowledgement fields are invalid';\n }\n\n private targetStatesError(value: unknown): string | null {\n if (!Array.isArray(value)\n || value.length > MAX_TARGET_STATES\n || !this.hasExactArrayIndexes(value)) {\n return 'acknowledgement target states are invalid';\n }\n const targetIds = new Set<string>();\n for (const target of value) {\n if (!this.isValidTargetState(target) || targetIds.has(target.targetId)) {\n return 'acknowledgement target states are invalid';\n }\n targetIds.add(target.targetId);\n }\n return null;\n }\n\n private isValidTargetState(value: unknown): value is Record<string, unknown> & TelemetryTargetDeliveryState {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return false;\n }\n const deliveries = ['required', 'best-effort'];\n const states = ['pending', 'committed', 'failed', 'abandoned'];\n return typeof value.targetId === 'string'\n && value.targetId.length > 0\n && telemetryUtf8Length(value.targetId) <= MAX_TARGET_ID_BYTES\n && deliveries.includes(String(value.delivery))\n && states.includes(String(value.state))\n && Number.isSafeInteger(value.attempts)\n && Number(value.attempts) >= 0\n && (value.reason === null || this.isBoundedReason(value.reason));\n }\n\n private freezeAcknowledgement(value: TelemetryAcknowledgement): TelemetryAcknowledgement {\n const targetStates = value.targetStates.map((target) => Object.freeze({ ...target }));\n return Object.freeze({ ...value, targetStates: Object.freeze(targetStates) });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Reflect.ownKeys(value);\n return keys.length === expected.length\n && keys.every((key) => typeof key === 'string' && expected.includes(key));\n }\n\n private hasExactArrayIndexes(value: readonly unknown[]): boolean {\n const keys = Reflect.ownKeys(value);\n if (keys.length !== value.length + 1 || !keys.includes('length')) {\n return false;\n }\n return value.every((_item, index) => keys.includes(String(index)));\n }\n\n private isBoundedReason(value: unknown): value is string {\n return typeof value === 'string' && telemetryUtf8Length(value) <= MAX_REASON_BYTES;\n }\n\n private truncateReason(value: string): string {\n const encoded = new TextEncoder().encode(value);\n if (encoded.length <= MAX_REASON_BYTES) {\n return value;\n }\n const decoder = new TextDecoder('utf-8', { fatal: true });\n for (let length = MAX_REASON_BYTES; length > 0; length -= 1) {\n try {\n return decoder.decode(encoded.subarray(0, length));\n } catch {\n // At most three trailing continuation bytes need to be removed.\n }\n }\n return '';\n }\n}\n","import { TelemetryDeadlineGuard } from './helper/telemetry_deadline_guard.js';\nimport { TelemetryAcknowledgementContract } from './telemetry_acknowledgement_contract.js';\nimport type { MetricDefinition } from './types/metric.types.js';\nimport type { MetricQuery, MetricQueryResponse, TelemetryQueryError, TimelineQuery, TimelineQueryResponse } from './types/query.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\nimport type {\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageRouterOptions,\n TelemetryStorageTransport,\n TelemetryStorageTarget,\n} from './types/storage.types.js';\nimport type { TelemetryAcknowledgement, TelemetryTargetDeliveryState } from './types/transport.types.js';\n\ntype StorageTargetResult = Readonly<{\n target: TelemetryStorageTarget;\n acknowledgement: TelemetryAcknowledgement;\n attempts: number;\n}>;\n\ntype RollbackTargetResult = Readonly<{\n targetId: string;\n error: string | null;\n}>;\n\nconst START_ROLLBACK_TIMEOUT_MS = 5_000;\n\nexport class TelemetryStorageRouter implements TelemetryStorageTransport {\n readonly targetId: string;\n readonly capabilities: TelemetryStorageCapabilities;\n private readonly acknowledgementContract = new TelemetryAcknowledgementContract();\n private readonly deadlineGuard = new TelemetryDeadlineGuard();\n private readonly committed = new Map<string, Set<string>>();\n private readonly definitionTargets = new Map<string, readonly string[]>();\n private state: StorageTargetStatus['state'] = 'created';\n private detail: string | null = null;\n\n constructor(private readonly options: TelemetryStorageRouterOptions) {\n this.targetId = options.routerId;\n this.validateOptions();\n this.capabilities = Object.freeze({\n rawPersistence: options.targets.every((target) => target.transport.capabilities.rawPersistence),\n metricSamples: options.targets.every((target) => target.transport.capabilities.metricSamples),\n rollups: options.targets.some((target) => target.transport.capabilities.rollups),\n queries: options.targets.some((target) => target.transport.capabilities.queries),\n retention: options.targets.some((target) => target.transport.capabilities.retention),\n maintenance: options.targets.some((target) => target.transport.capabilities.maintenance),\n });\n }\n\n async start(definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n return { ok: false, error: `Cannot start telemetry storage router from state ${this.state}` };\n }\n this.state = 'starting';\n this.detail = null;\n this.definitionTargets.clear();\n for (const definition of definitions) {\n this.definitionTargets.set(\n `${definition.name}:${definition.version}`,\n Object.freeze([...definition.targetIds]),\n );\n }\n const attemptedTargets: TelemetryStorageTarget[] = [];\n const bestEffortFailures: string[] = [];\n for (const target of this.options.targets) {\n attemptedTargets.push(target);\n const targetDefinitions = definitions.filter((definition) => {\n return definition.targetIds.length === 0 || definition.targetIds.includes(target.targetId);\n });\n const started = await this.startTarget(target, targetDefinitions);\n if (started.ok) {\n continue;\n }\n const failure = `${target.targetId}: ${started.error}`;\n if (target.delivery === 'required') {\n await this.rollbackAttemptedTargets(attemptedTargets, failure);\n return { ok: false, error: failure };\n }\n bestEffortFailures.push(failure);\n }\n this.state = 'ready';\n this.detail = bestEffortFailures.length > 0\n ? `Best-effort target startup failures: ${bestEffortFailures.join('; ')}`\n : null;\n return { ok: true, value: undefined };\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n const matchingTargets = this.options.targets.filter((target) => target.matches(request.batch));\n const hasRequiredTarget = matchingTargets.some((target) => target.delivery === 'required');\n if (!hasRequiredTarget && !this.options.volatile) {\n return {\n kind: 'rejected',\n idempotencyKey: request.batch.idempotencyKey,\n code: 'no-required-terminal',\n reason: 'No required storage target matched this batch',\n targetStates: this.unmatchedStates(matchingTargets),\n };\n }\n\n const committedTargets = this.committed.get(request.batch.idempotencyKey) ?? new Set<string>();\n const targetResults = await this.persistMatchingTargets(request, matchingTargets, committedTargets);\n this.remember(request.batch.idempotencyKey, committedTargets);\n return this.aggregateAcknowledgement(request, matchingTargets, targetResults);\n }\n\n async timeline(query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n const target = this.resolveQueryTarget(query.targetId);\n if (!target.ok) {\n return target;\n }\n return target.value.transport.timeline(Object.freeze({ ...query, targetId: target.value.targetId }));\n }\n\n async metrics(query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n const target = this.resolveQueryTarget(query.targetId);\n if (!target.ok) {\n return target;\n }\n return target.value.transport.metrics(Object.freeze({ ...query, targetId: target.value.targetId }));\n }\n\n async materializeRollups(nowMs: number, maxWorkMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('rollup', (target) => target.materializeRollups(nowMs, maxWorkMs));\n }\n\n async enforceRetention(nowMs: number, shouldContinue?: () => boolean): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('retention', (target) => target.enforceRetention(nowMs, shouldContinue));\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('checkpoint', (target) => target.checkpoint());\n }\n\n async reclaim(maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('reclaim', (target) => target.reclaim(maxPages));\n }\n\n async compact(deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.runMaintenance('compaction', (target) => target.compact(deadlineMs));\n }\n\n status(): StorageTargetStatus {\n const states = this.options.targets.map((target) => target.transport.status());\n const requiredIds = new Set(this.options.targets\n .filter((target) => target.delivery === 'required')\n .map((target) => target.targetId));\n const failedRequired = states.find((state) => {\n return requiredIds.has(state.targetId) && state.state === 'failed';\n });\n return {\n targetId: this.targetId,\n state: failedRequired ? 'failed' : this.state,\n detail: this.state === 'failed' ? this.detail : failedRequired?.detail ?? this.detail,\n writerLeaseHeld: states.some((state) => state.writerLeaseHeld),\n };\n }\n\n async stop(deadlineMs: number): Promise<void> {\n const operations = this.options.targets.map((target) => {\n return Promise.resolve().then(() => target.transport.stop(deadlineMs));\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.allSettled(operations),\n deadlineMs,\n this.options.now,\n );\n if (outcome.kind === 'deadline-exhausted') {\n this.state = 'failed';\n this.detail = 'Telemetry storage router stop deadline exceeded';\n return;\n }\n if (outcome.kind === 'failed') {\n this.state = 'failed';\n this.detail = `Telemetry storage router stop failed: ${this.errorMessage(outcome.error)}`;\n throw outcome.error;\n }\n const failed = outcome.value.find((result): result is PromiseRejectedResult => result.status === 'rejected');\n if (failed) {\n this.state = 'failed';\n this.detail = `Telemetry storage router stop failed: ${this.errorMessage(failed.reason)}`;\n throw failed.reason;\n }\n this.state = 'stopped';\n this.detail = null;\n }\n\n targetStatuses(): readonly StorageTargetStatus[] {\n return this.options.targets.map((target) => target.transport.status());\n }\n\n private async startTarget(\n target: TelemetryStorageTarget,\n definitions: readonly MetricDefinition[],\n ): Promise<TelemetryResult<void, string>> {\n try {\n return await target.transport.start(definitions);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private async rollbackAttemptedTargets(\n attemptedTargets: readonly TelemetryStorageTarget[],\n primaryFailure: string,\n ): Promise<void> {\n const deadlineMs = this.options.now() + START_ROLLBACK_TIMEOUT_MS;\n const rollbackTargets = [...attemptedTargets].reverse();\n const settled = new Map<string, RollbackTargetResult>();\n const operations = rollbackTargets.map(async (target) => {\n const result = await this.stopRollbackTarget(target, deadlineMs);\n settled.set(target.targetId, result);\n });\n const outcome = await this.deadlineGuard.settle(\n Promise.all(operations),\n deadlineMs,\n this.options.now,\n );\n const timedOut = outcome.kind === 'deadline-exhausted';\n const cleanupFailures = rollbackTargets.flatMap((target) => {\n const result = settled.get(target.targetId);\n if (result === undefined) {\n return timedOut ? [`${target.targetId}: rollback deadline exceeded`] : [];\n }\n return result.error === null ? [] : [`${target.targetId}: ${result.error}`];\n });\n this.state = 'failed';\n this.detail = cleanupFailures.length > 0\n ? `${primaryFailure}; rollback cleanup failures: ${cleanupFailures.join('; ')}`\n : primaryFailure;\n }\n\n private async stopRollbackTarget(\n target: TelemetryStorageTarget,\n deadlineMs: number,\n ): Promise<RollbackTargetResult> {\n try {\n await target.transport.stop(deadlineMs);\n return { targetId: target.targetId, error: null };\n } catch (cause) {\n return { targetId: target.targetId, error: this.errorMessage(cause) };\n }\n }\n\n private async persistMatchingTargets(\n request: StoragePersistRequest,\n targets: readonly TelemetryStorageTarget[],\n committedTargets: Set<string>,\n ): Promise<readonly StorageTargetResult[]> {\n return Promise.all(targets.map(async (target): Promise<StorageTargetResult> => {\n if (committedTargets.has(target.targetId)) {\n return { target, acknowledgement: this.alreadyCommitted(request), attempts: 0 };\n }\n const targetRequest = this.requestForTarget(request, target.targetId);\n const acknowledgement = await this.persistSafely(target, targetRequest);\n if (acknowledgement.kind === 'committed') {\n committedTargets.add(target.targetId);\n }\n return { target, acknowledgement, attempts: 1 };\n }));\n }\n\n private aggregateAcknowledgement(\n request: StoragePersistRequest,\n matchingTargets: readonly TelemetryStorageTarget[],\n targetResults: readonly StorageTargetResult[],\n ): TelemetryAcknowledgement {\n const targetStates = this.deliveryStates(targetResults, matchingTargets);\n const requiredResults = targetResults.filter(({ target }) => target.delivery === 'required');\n const conflict = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'conflict');\n const conflictAcknowledgement = conflict?.acknowledgement;\n if (conflictAcknowledgement?.kind === 'conflict') {\n return {\n kind: 'conflict',\n idempotencyKey: request.batch.idempotencyKey,\n reason: conflictAcknowledgement.reason,\n targetStates,\n };\n }\n const rejected = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'rejected');\n const rejectedAcknowledgement = rejected?.acknowledgement;\n if (rejectedAcknowledgement?.kind === 'rejected') {\n return {\n kind: 'rejected',\n idempotencyKey: request.batch.idempotencyKey,\n code: rejectedAcknowledgement.code,\n reason: rejectedAcknowledgement.reason,\n targetStates,\n };\n }\n const retryable = requiredResults.find(({ acknowledgement }) => acknowledgement.kind === 'retryable');\n const retryableAcknowledgement = retryable?.acknowledgement;\n if (retryableAcknowledgement?.kind === 'retryable') {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: retryableAcknowledgement.reason,\n retryAfterMs: retryableAcknowledgement.retryAfterMs,\n targetStates,\n };\n }\n\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: targetResults.length > 0 && targetResults.every(({ attempts }) => attempts === 0),\n targetStates,\n };\n }\n\n private deliveryStates(\n targetResults: readonly StorageTargetResult[],\n matchingTargets: readonly TelemetryStorageTarget[],\n ): readonly TelemetryTargetDeliveryState[] {\n return [\n ...targetResults.map(({ target, acknowledgement, attempts }) => this.deliveryState(\n target,\n acknowledgement,\n attempts,\n )),\n ...this.unmatchedStates(matchingTargets),\n ];\n }\n\n private requestForTarget(request: StoragePersistRequest, targetId: string): StoragePersistRequest {\n const samples = request.samples.filter((sample) => {\n return sample.targetIds.length === 0 || sample.targetIds.includes(targetId);\n });\n const extractionFailures = request.extractionFailures.filter((failure) => {\n const targetIds = this.definitionTargets.get(`${failure.metricName}:${failure.definitionVersion}`);\n return targetIds === undefined || targetIds.length === 0 || targetIds.includes(targetId);\n });\n return Object.freeze({\n batch: request.batch,\n samples: Object.freeze(samples),\n extractionFailures: Object.freeze(extractionFailures),\n });\n }\n\n private async persistSafely(\n target: TelemetryStorageTarget,\n request: StoragePersistRequest,\n ): Promise<TelemetryAcknowledgement> {\n try {\n const received: unknown = await target.transport.persist(request);\n const validated = this.acknowledgementContract.validateAndDetach(request.batch, received);\n return validated.ok\n ? validated.value\n : this.invalidAcknowledgement(request, validated.error);\n } catch (cause) {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: this.acknowledgementContract.exceptionReason(cause),\n retryAfterMs: 50,\n targetStates: [],\n };\n }\n }\n\n private invalidAcknowledgement(\n request: StoragePersistRequest,\n error: string,\n ): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: 50,\n targetStates: [],\n };\n }\n\n private alreadyCommitted(request: StoragePersistRequest): TelemetryAcknowledgement {\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: this.options.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: true,\n targetStates: [],\n };\n }\n\n private deliveryState(\n target: TelemetryStorageTarget,\n acknowledgement: TelemetryAcknowledgement,\n attempts: number,\n ): TelemetryTargetDeliveryState {\n return acknowledgement.kind === 'committed'\n ? {\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'committed',\n attempts,\n reason: null,\n }\n : {\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'failed',\n attempts,\n reason: acknowledgement.reason,\n };\n }\n\n private unmatchedStates(matchingTargets: readonly TelemetryStorageTarget[]): TelemetryTargetDeliveryState[] {\n const matchingIds = new Set(matchingTargets.map((target) => target.targetId));\n return this.options.targets\n .filter((target) => !matchingIds.has(target.targetId))\n .map((target) => ({\n targetId: target.targetId,\n delivery: target.delivery,\n state: 'abandoned' as const,\n attempts: 0,\n reason: 'route-not-matched',\n }));\n }\n\n private resolveQueryTarget(\n requestedTargetId: string | null,\n ): TelemetryResult<TelemetryStorageTarget, TelemetryQueryError> {\n const queryable = this.options.targets.filter((target) => target.transport.capabilities.queries);\n if (queryable.length === 0) {\n return {\n ok: false,\n error: { kind: 'unsupported', message: 'No configured telemetry target supports queries' },\n };\n }\n const resolvedId = requestedTargetId ?? this.options.defaultTargetId ?? (queryable.length === 1\n ? queryable[0]?.targetId ?? null\n : null);\n if (resolvedId === null) {\n return {\n ok: false,\n error: { kind: 'ambiguous-target', message: 'Multiple queryable targets exist and no default was configured' },\n };\n }\n const target = queryable.find((candidate) => candidate.targetId === resolvedId);\n if (!target) {\n return { ok: false, error: { kind: 'unknown-target', message: `Unknown query target ${resolvedId}` } };\n }\n return { ok: true, value: target };\n }\n\n private async runMaintenance(\n stage: MaintenanceStageResult['stage'],\n run: (target: TelemetryStorageTransport) => Promise<TelemetryResult<MaintenanceStageResult, string>>,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n let affectedRows = 0;\n let affectedPages = 0;\n let elapsedMs = 0;\n for (const target of this.options.targets) {\n if (!target.transport.capabilities.maintenance) {\n continue;\n }\n const completed = await run(target.transport);\n if (!completed.ok && target.delivery === 'required') {\n return { ok: false, error: `${target.targetId}: ${completed.error}` };\n }\n if (completed.ok) {\n affectedRows += completed.value.affectedRows;\n affectedPages += completed.value.affectedPages;\n elapsedMs += completed.value.elapsedMs;\n }\n }\n return {\n ok: true,\n value: { stage, affectedRows, affectedPages, elapsedMs, detail: null },\n };\n }\n\n private validateOptions(): void {\n if (!this.options.routerId.trim() || this.options.targets.length === 0) {\n throw new Error('A telemetry storage router requires an id and at least one target');\n }\n if (this.options.maxRememberedBatches !== undefined\n && (!Number.isSafeInteger(this.options.maxRememberedBatches)\n || this.options.maxRememberedBatches <= 0)) {\n throw new Error('Telemetry storage router memory must be a positive safe integer');\n }\n const targetIds = this.options.targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error('Telemetry storage target ids must be unique');\n }\n const requiredTargets = this.options.targets.filter((target) => target.delivery === 'required');\n if (!this.options.volatile && requiredTargets.length === 0) {\n throw new Error('A non-volatile storage router requires a required target');\n }\n const defaultExists = this.options.defaultTargetId === null\n || targetIds.includes(this.options.defaultTargetId);\n if (!defaultExists) {\n throw new Error(`Unknown default telemetry target ${this.options.defaultTargetId}`);\n }\n const defaultTarget = this.options.targets.find((target) => target.targetId === this.options.defaultTargetId);\n if (defaultTarget && !defaultTarget.transport.capabilities.queries) {\n throw new Error(`Default telemetry target ${defaultTarget.targetId} does not support queries`);\n }\n }\n\n private remember(idempotencyKey: string, targets: Set<string>): void {\n this.committed.set(idempotencyKey, targets);\n const maximum = this.options.maxRememberedBatches ?? 1_024;\n while (this.committed.size > maximum) {\n const oldest = this.committed.keys().next().value;\n if (typeof oldest !== 'string') {\n return;\n }\n this.committed.delete(oldest);\n }\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type { MetricExtraction } from '../core/types/metric.types.js';\nimport type { TelemetryMetricPlugin, TelemetrySinkPlugin } from '../core/types/plugin.types.js';\nimport type { TelemetryBatch } from '../core/types/transport.types.js';\nimport type {\n TelemetryPluginRegistryOptions,\n TelemetryPluginRegistryStatus,\n} from './types/telemetry_plugin_registry.types.js';\n\nexport class TelemetryPluginRegistry {\n private readonly sinks = new Map<string, TelemetrySinkPlugin>();\n private readonly metrics = new Map<string, TelemetryMetricPlugin>();\n private readonly sinkChains = new Map<string, Promise<void>>();\n private readonly pendingBySink = new Map<string, number>();\n private readonly sinkFailures = new Map<string, number>();\n private readonly sinkDrops = new Map<string, number>();\n\n constructor(private readonly options: TelemetryPluginRegistryOptions) {}\n\n registerSink(plugin: TelemetrySinkPlugin): void {\n this.assertUnique(plugin.name);\n const supportsRuntime = plugin.supportedSchemaVersions.some((version) => {\n return this.options.supportedSchemaVersions.includes(version);\n });\n if (!supportsRuntime) {\n throw new Error(`Sink plugin ${plugin.name} supports no collector schema version`);\n }\n this.sinks.set(plugin.name, plugin);\n }\n\n registerMetric(plugin: TelemetryMetricPlugin): void {\n this.assertUnique(plugin.name);\n this.metrics.set(plugin.name, plugin);\n }\n\n extract(batch: TelemetryBatch): MetricExtraction {\n const samples = [];\n const failures = [];\n for (const plugin of this.metrics.values()) {\n try {\n const extracted = plugin.extract(batch);\n samples.push(...extracted.samples);\n failures.push(...extracted.failures);\n } catch (cause) {\n for (const envelope of batch.envelopes) {\n failures.push({\n metricName: plugin.definition.name,\n definitionVersion: plugin.definition.version,\n producerId: envelope.producerId,\n sequence: envelope.sequence,\n reason: cause instanceof Error ? cause.message : String(cause),\n });\n }\n }\n }\n return { samples, failures };\n }\n\n dispatchCommitted(batch: TelemetryBatch): void {\n for (const sink of this.sinks.values()) {\n const pending = this.pendingBySink.get(sink.name) ?? 0;\n if (pending >= this.options.maxPendingPerSink) {\n this.sinkDrops.set(sink.name, (this.sinkDrops.get(sink.name) ?? 0) + 1);\n continue;\n }\n this.pendingBySink.set(sink.name, pending + 1);\n const prior = this.sinkChains.get(sink.name) ?? Promise.resolve();\n const next = prior\n .then(() => sink.onCommitted(batch))\n .catch(() => {\n this.sinkFailures.set(sink.name, (this.sinkFailures.get(sink.name) ?? 0) + 1);\n })\n .finally(() => {\n const remaining = Math.max(0, (this.pendingBySink.get(sink.name) ?? 1) - 1);\n this.pendingBySink.set(sink.name, remaining);\n });\n this.sinkChains.set(sink.name, next);\n }\n }\n\n status(): TelemetryPluginRegistryStatus {\n return Object.freeze({\n sinkFailures: Object.freeze(Object.fromEntries(this.sinkFailures)),\n sinkDrops: Object.freeze(Object.fromEntries(this.sinkDrops)),\n pendingBySink: Object.freeze(Object.fromEntries(this.pendingBySink)),\n });\n }\n\n async close(deadlineMs: number, now: () => number): Promise<void> {\n const chains = [...this.sinkChains.values()];\n while (chains.length > 0 && now() < deadlineMs) {\n await Promise.race([\n Promise.allSettled(chains).then(() => undefined),\n new Promise<void>((resolve) => setTimeout(resolve, 1)),\n ]);\n const allSettled = [...this.pendingBySink.values()].every((pending) => pending === 0);\n if (allSettled) {\n break;\n }\n }\n await Promise.allSettled([...this.sinks.values()].map((sink) => sink.close(deadlineMs)));\n }\n\n private assertUnique(name: string): void {\n const duplicate = this.sinks.has(name) || this.metrics.has(name);\n if (!name.trim() || duplicate) {\n throw new Error(`Telemetry plugin name ${name || '<empty>'} is invalid or duplicated`);\n }\n }\n}\n","import { MetricDefinitionContract } from '../core/metric_definition_contract.js';\nimport { MetricExtractor } from '../core/metric_extractor.js';\nimport { telemetryUtf8Length } from '../core/helper/canonical_json.js';\nimport { TelemetryBatchContract } from '../core/telemetry_batch_contract.js';\nimport { TelemetryStorageRouter } from '../core/telemetry_storage_router.js';\nimport type { MetricDefinition, MetricExtraction } from '../core/types/metric.types.js';\nimport type { TelemetryCollectorOptions, TelemetryCollectorStatus } from '../core/types/runtime.types.js';\nimport type {\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n TelemetryStorageTarget,\n} from '../core/types/storage.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryDropCounter,\n TelemetryTargetDeliveryState,\n} from '../core/types/transport.types.js';\nimport { TelemetryPluginRegistry } from '../plugins/telemetry_plugin_registry.js';\n\nexport class TelemetryCollectorRuntime implements TelemetryBatchReceiver {\n readonly receiverId = 'telemetry-collector';\n private readonly batchContract: TelemetryBatchContract;\n private readonly definitionContract = new MetricDefinitionContract();\n private readonly storage: TelemetryStorageTransport;\n private readonly pluginRegistry: TelemetryPluginRegistry;\n private readonly dropCounts = new Map<string, number>();\n private extractor: MetricExtractor | null = null;\n private state: TelemetryCollectorStatus['state'] = 'created';\n private acceptedBatches = 0;\n private committedEvents = 0;\n private rejectedBatches = 0;\n private lastFailure: string | null = null;\n private readonly pending = new Set<Promise<TelemetryAcknowledgement>>();\n\n constructor(private readonly options: TelemetryCollectorOptions) {\n this.batchContract = new TelemetryBatchContract(options.batchValidation);\n this.storage = this.resolveStorage(options.storage);\n this.pluginRegistry = new TelemetryPluginRegistry({\n supportedSchemaVersions: options.schemaVersions,\n maxPendingPerSink: 64,\n });\n for (const sink of options.sinkPlugins) {\n this.pluginRegistry.registerSink(sink);\n }\n }\n\n async start(): Promise<void> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n throw new Error(`Cannot start telemetry collector from state ${this.state}`);\n }\n this.state = 'starting';\n const definitions = this.normalizeDefinitions(this.options.definitions);\n const capabilityError = this.storageCapabilityError(definitions);\n if (capabilityError !== null) {\n this.state = 'failed';\n this.lastFailure = capabilityError;\n throw new Error(`Telemetry collector storage is incompatible: ${capabilityError}`);\n }\n const started = await this.storage.start(definitions);\n if (!started.ok) {\n this.state = 'failed';\n this.lastFailure = started.error;\n throw new Error(`Telemetry collector storage failed to start: ${started.error}`);\n }\n this.extractor = new MetricExtractor(definitions);\n this.state = 'ready';\n }\n\n receive(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n const operation = this.acceptBatch(batch);\n this.pending.add(operation);\n void operation.then(\n () => this.pending.delete(operation),\n () => this.pending.delete(operation),\n );\n return operation;\n }\n\n status(): TelemetryCollectorStatus {\n const targets = this.storage instanceof TelemetryStorageRouter\n ? this.storage.targetStatuses()\n : [this.storage.status()];\n return Object.freeze({\n state: this.state,\n acceptedBatches: this.acceptedBatches,\n committedEvents: this.committedEvents,\n rejectedBatches: this.rejectedBatches,\n dropCounters: this.dropCounterSnapshot(),\n lastFailure: this.lastFailure,\n targets: Object.freeze(targets),\n });\n }\n\n async stop(deadlineMs: number): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n this.state = 'draining';\n while (this.pending.size > 0 && this.options.now() < deadlineMs) {\n await Promise.race([...this.pending, new Promise<void>((resolve) => setTimeout(resolve, 1))]);\n }\n await this.settleExternalShutdown(\n () => this.pluginRegistry.close(deadlineMs, this.options.now),\n deadlineMs,\n );\n await this.settleExternalShutdown(() => this.storage.stop(deadlineMs), deadlineMs);\n this.state = 'stopped';\n }\n\n storageTransport(): TelemetryStorageTransport {\n return this.storage;\n }\n\n private async acceptBatch(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n const idempotencyKey = this.safeIdempotencyKey(batch);\n if (this.state !== 'ready' || this.extractor === null) {\n this.rejectedBatches += 1;\n return {\n kind: 'rejected',\n idempotencyKey,\n code: 'closed',\n reason: `Telemetry collector is ${this.state}`,\n targetStates: [],\n };\n }\n const validated = this.batchContract.validate(batch);\n if (!validated.ok) {\n this.rejectedBatches += 1;\n return {\n kind: 'rejected',\n idempotencyKey,\n code: this.validationCode(validated.error),\n reason: validated.error,\n targetStates: [],\n };\n }\n const acceptedBatch = validated.value;\n if (!this.options.schemaVersions.includes(acceptedBatch.schemaVersion)) {\n this.rejectedBatches += 1;\n return {\n kind: 'rejected',\n idempotencyKey,\n code: 'unsupported-version',\n reason: `Unsupported telemetry batch schema ${acceptedBatch.schemaVersion}`,\n targetStates: [],\n };\n }\n\n this.acceptedBatches += 1;\n try {\n return await this.persistAcceptedBatch(acceptedBatch);\n } catch (cause) {\n const reason = this.errorMessage(cause);\n this.lastFailure = reason;\n return {\n kind: 'retryable',\n idempotencyKey: acceptedBatch.idempotencyKey,\n reason: `Telemetry collector pipeline failed: ${reason}`.slice(0, 512),\n retryAfterMs: 1,\n targetStates: [],\n };\n }\n }\n\n private async persistAcceptedBatch(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n const extractor = this.extractor;\n if (extractor === null) {\n throw new Error('Telemetry metric extractor is unavailable');\n }\n const declarative = extractor.extract(batch.envelopes);\n const plugins = this.pluginRegistry.extract(batch);\n const extraction = this.mergeExtractions(declarative, plugins);\n const received: unknown = await this.storage.persist({\n batch,\n samples: extraction.samples,\n extractionFailures: extraction.failures,\n });\n const acknowledgement = this.normalizeStorageAcknowledgement(batch, received);\n if (acknowledgement.kind !== 'committed') {\n this.lastFailure = acknowledgement.reason;\n return acknowledgement;\n }\n if (!acknowledgement.duplicate) {\n this.committedEvents += acknowledgement.acceptedEvents;\n this.aggregateDropCounters(batch.dropCounters);\n this.pluginRegistry.dispatchCommitted(batch);\n }\n return acknowledgement;\n }\n\n private normalizeStorageAcknowledgement(\n batch: TelemetryBatch,\n value: unknown,\n ): TelemetryAcknowledgement {\n try {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return this.invalidStorageAcknowledgement(batch, 'identity is missing or mismatched');\n }\n let normalized: TelemetryAcknowledgement | null;\n switch (value.kind) {\n case 'committed':\n normalized = this.normalizeCommittedAcknowledgement(batch, value);\n break;\n case 'retryable':\n normalized = this.normalizeRetryableAcknowledgement(batch, value);\n break;\n case 'rejected':\n normalized = this.normalizeRejectedAcknowledgement(batch, value);\n break;\n case 'conflict':\n normalized = this.normalizeConflictAcknowledgement(batch, value);\n break;\n default:\n normalized = null;\n }\n return normalized ?? this.invalidStorageAcknowledgement(batch, 'fields are invalid');\n } catch {\n return this.invalidStorageAcknowledgement(batch, 'value could not be inspected');\n }\n }\n\n private normalizeCommittedAcknowledgement(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): TelemetryAcknowledgement | null {\n if (!this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])) {\n return null;\n }\n const committedAtMs = value.committedAtMs;\n const acceptedEvents = value.acceptedEvents;\n const duplicate = value.duplicate;\n const targetStates = this.normalizeTargetStates(value.targetStates);\n const valid = typeof committedAtMs === 'number'\n && Number.isSafeInteger(committedAtMs)\n && committedAtMs >= 0\n && typeof acceptedEvents === 'number'\n && acceptedEvents === batch.envelopes.length\n && typeof duplicate === 'boolean'\n && targetStates !== null;\n if (!valid || targetStates === null) {\n return null;\n }\n return Object.freeze({\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs,\n acceptedEvents,\n duplicate,\n targetStates,\n });\n }\n\n private normalizeRetryableAcknowledgement(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): TelemetryAcknowledgement | null {\n if (!this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])) {\n return null;\n }\n const reason = value.reason;\n const retryAfterMs = value.retryAfterMs;\n const targetStates = this.normalizeTargetStates(value.targetStates);\n const valid = this.isBoundedText(reason, 512)\n && typeof retryAfterMs === 'number'\n && Number.isFinite(retryAfterMs)\n && retryAfterMs >= 0\n && retryAfterMs <= Number.MAX_SAFE_INTEGER\n && targetStates !== null;\n if (!valid || typeof reason !== 'string' || typeof retryAfterMs !== 'number' || targetStates === null) {\n return null;\n }\n return Object.freeze({\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason,\n retryAfterMs,\n targetStates,\n });\n }\n\n private normalizeRejectedAcknowledgement(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): TelemetryAcknowledgement | null {\n if (!this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])) {\n return null;\n }\n const code = value.code;\n const reason = value.reason;\n const targetStates = this.normalizeTargetStates(value.targetStates);\n if (!this.isRejectionCode(code)\n || !this.isBoundedText(reason, 512)\n || typeof reason !== 'string'\n || targetStates === null) {\n return null;\n }\n return Object.freeze({\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code,\n reason,\n targetStates,\n });\n }\n\n private normalizeConflictAcknowledgement(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): TelemetryAcknowledgement | null {\n if (!this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])) {\n return null;\n }\n const reason = value.reason;\n const targetStates = this.normalizeTargetStates(value.targetStates);\n if (!this.isBoundedText(reason, 512) || typeof reason !== 'string' || targetStates === null) {\n return null;\n }\n return Object.freeze({\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason,\n targetStates,\n });\n }\n\n private normalizeTargetStates(value: unknown): readonly TelemetryTargetDeliveryState[] | null {\n if (!Array.isArray(value)) {\n return null;\n }\n const targetCount = value.length;\n if (!Number.isSafeInteger(targetCount) || targetCount < 0 || targetCount > 1_024) {\n return null;\n }\n const normalized: TelemetryTargetDeliveryState[] = [];\n const targetIds = new Set<string>();\n for (let index = 0; index < targetCount; index += 1) {\n const target = this.normalizeTargetState(value[index]);\n if (target === null || targetIds.has(target.targetId)) {\n return null;\n }\n targetIds.add(target.targetId);\n normalized.push(target);\n }\n return Object.freeze(normalized);\n }\n\n private normalizeTargetState(value: unknown): TelemetryTargetDeliveryState | null {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return null;\n }\n const targetId = value.targetId;\n const delivery = value.delivery;\n const state = value.state;\n const attempts = value.attempts;\n const reason = value.reason;\n if (!this.isTargetId(targetId)\n || !this.isDeliveryMode(delivery)\n || !this.isDeliveryState(state)\n || !this.isAttemptCount(attempts)\n || !this.isTargetReason(reason)) {\n return null;\n }\n return Object.freeze({ targetId, delivery, state, attempts, reason });\n }\n\n private invalidStorageAcknowledgement(\n batch: TelemetryBatch,\n detail: string,\n ): TelemetryAcknowledgement {\n return Object.freeze({\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: `Invalid telemetry storage acknowledgement: ${detail}`.slice(0, 512),\n retryAfterMs: 1,\n targetStates: Object.freeze([]),\n });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isBoundedText(value: unknown, maxBytes: number): value is string {\n return typeof value === 'string'\n && value.length <= maxBytes\n && telemetryUtf8Length(value) <= maxBytes;\n }\n\n private isRejectionCode(\n value: unknown,\n ): value is 'invalid-batch' | 'unsupported-version' | 'no-required-terminal' | 'closed' {\n return value === 'invalid-batch'\n || value === 'unsupported-version'\n || value === 'no-required-terminal'\n || value === 'closed';\n }\n\n private isTargetId(value: unknown): value is string {\n return this.isBoundedText(value, 256) && value !== '';\n }\n\n private isDeliveryMode(value: unknown): value is TelemetryTargetDeliveryState['delivery'] {\n return value === 'required' || value === 'best-effort';\n }\n\n private isDeliveryState(value: unknown): value is TelemetryTargetDeliveryState['state'] {\n return value === 'pending'\n || value === 'committed'\n || value === 'failed'\n || value === 'abandoned';\n }\n\n private isAttemptCount(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n }\n\n private isTargetReason(value: unknown): value is string | null {\n return value === null || this.isBoundedText(value, 512);\n }\n\n private aggregateDropCounters(counters: readonly TelemetryDropCounter[]): void {\n for (const counter of counters) {\n const key = `${counter.reason}:${counter.priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.min(Number.MAX_SAFE_INTEGER, current + counter.count));\n }\n }\n\n private dropCounterSnapshot(): readonly TelemetryDropCounter[] {\n return Object.freeze([...this.dropCounts.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, count]) => {\n const [reason, priority] = key.split(':');\n return Object.freeze({\n reason: reason as TelemetryDropCounter['reason'],\n priority: priority as TelemetryDropCounter['priority'],\n count,\n });\n }));\n }\n\n private safeIdempotencyKey(batch: unknown): string {\n try {\n if (typeof batch !== 'object' || batch === null) {\n return 'invalid-batch';\n }\n const value = Reflect.get(batch, 'idempotencyKey');\n return typeof value === 'string' && value.length > 0\n ? value.slice(0, 1_024)\n : 'invalid-batch';\n } catch {\n return 'invalid-batch';\n }\n }\n\n private validationCode(error: string): 'invalid-batch' | 'unsupported-version' {\n return error.startsWith('Unsupported telemetry schema version')\n ? 'unsupported-version'\n : 'invalid-batch';\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error\n ? cause.message.slice(0, 512)\n : String(cause).slice(0, 512);\n }\n\n private async settleExternalShutdown(\n work: () => Promise<void>,\n deadlineMs: number,\n ): Promise<void> {\n const operation = Promise.resolve().then(work);\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n void operation.catch(() => undefined);\n return;\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (failed: boolean, error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (failed) {\n reject(error);\n } else {\n resolve();\n }\n };\n const timer = setTimeout(\n () => finish(false),\n Math.min(remainingMs, 2_147_483_647),\n );\n void operation.then(\n () => finish(false),\n (error: unknown) => finish(true, error),\n );\n });\n }\n\n private mergeExtractions(left: MetricExtraction, right: MetricExtraction): MetricExtraction {\n return Object.freeze({\n samples: Object.freeze([...left.samples, ...right.samples]),\n failures: Object.freeze([...left.failures, ...right.failures]),\n });\n }\n\n private normalizeDefinitions(definitions: readonly MetricDefinition[]): readonly MetricDefinition[] {\n const normalized = definitions.map((definition) => {\n const parsed = this.definitionContract.normalize(definition);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n const definitionIds = normalized.map((definition) => `${definition.name}:${definition.version}`);\n if (new Set(definitionIds).size !== definitionIds.length) {\n throw new Error('Telemetry metric name/version pairs must be unique');\n }\n return Object.freeze(normalized);\n }\n\n private storageCapabilityError(definitions: readonly MetricDefinition[]): string | null {\n const required = new Set<keyof TelemetryStorageCapabilities>(this.options.requiredCapabilities ?? []);\n if (!this.options.volatile) {\n required.add('rawPersistence');\n }\n if (definitions.length > 0) {\n required.add('metricSamples');\n required.add('rollups');\n }\n const capabilityOrder: readonly (keyof TelemetryStorageCapabilities)[] = [\n 'rawPersistence',\n 'metricSamples',\n 'rollups',\n 'queries',\n 'retention',\n 'maintenance',\n ];\n const missing = capabilityOrder.filter((capability) => {\n return required.has(capability) && this.storage.capabilities[capability] !== true;\n });\n return missing.length === 0\n ? null\n : `missing required capabilities: ${missing.join(', ')}`;\n }\n\n private resolveStorage(\n storage: TelemetryStorageTransport | readonly TelemetryStorageTarget[],\n ): TelemetryStorageTransport {\n if (this.isStorageTransport(storage)) {\n return storage;\n }\n return new TelemetryStorageRouter({\n routerId: 'collector-storage-router',\n targets: storage,\n defaultTargetId: this.options.defaultTargetId ?? null,\n volatile: this.options.volatile,\n now: this.options.now,\n });\n }\n\n private isStorageTransport(\n storage: TelemetryStorageTransport | readonly TelemetryStorageTarget[],\n ): storage is TelemetryStorageTransport {\n return !Array.isArray(storage) && typeof storage === 'object' && storage !== null && 'persist' in storage;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { MigrationRunnerFactory } from '@noego/proper';\nimport BetterSqlite3 from 'better-sqlite3';\nimport { createSqliteDb } from 'sqlstack/adapters';\nimport {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from '../core/helper/canonical_json.js';\nimport type { MetricDefinition } from '../core/types/metric.types.js';\nimport type {\n MetricQuery,\n MetricQueryResponse,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n} from '../core/types/storage.types.js';\nimport type { TelemetryAcknowledgement } from '../core/types/transport.types.js';\nimport { SQLITE_LOGICAL_TABLE_NAMES, SQLITE_SCHEMA_MANIFEST_TABLE } from '../storage/helper/sqlite_table_names.js';\nimport { SqliteOwnershipLease } from '../storage/sqlite_ownership_lease.js';\nimport { TelemetryProperSqlRunner } from '../storage/telemetry_proper_sql_runner.js';\nimport { TelemetryRepository } from '../storage/telemetry_repository.js';\nimport { TelemetryTableMap } from '../storage/telemetry_table_map.js';\nimport { TelemetrySchemaManifestRowSchema } from './schema/telemetry_schema_manifest.js';\nimport type { SQLiteTelemetryTransportOptions } from './types/sqlite_transport.types.js';\n\nconst DEFAULT_MIGRATIONS_DIRECTORY = typeof __dirname === 'string'\n ? resolve(__dirname, '../../migrations')\n : fileURLToPath(new URL('../../migrations/', import.meta.url));\n\nexport class SQLiteTelemetryTransport<IntervalHandle = unknown> implements TelemetryStorageTransport {\n readonly targetId: string;\n readonly capabilities: TelemetryStorageCapabilities = Object.freeze({\n rawPersistence: true,\n metricSamples: true,\n rollups: true,\n queries: true,\n retention: true,\n maintenance: true,\n });\n private state: StorageTargetStatus['state'] = 'created';\n private detail: string | null = null;\n private tableMap: TelemetryTableMap | null = null;\n private connection: BetterSqlite3.Database | null = null;\n private repository: TelemetryRepository | null = null;\n private definitions: readonly MetricDefinition[] = Object.freeze([]);\n private lease: SqliteOwnershipLease | null = null;\n private heartbeatHandle: IntervalHandle | null = null;\n private activeReaders = 0;\n private activeWrites = 0;\n private accepting = false;\n\n constructor(private readonly options: SQLiteTelemetryTransportOptions<IntervalHandle>) {\n this.targetId = options.configuration.targetId;\n this.validateConfiguration();\n }\n\n static defaults(\n configuration: SQLiteTelemetryTransportOptions['configuration'],\n ): SQLiteTelemetryTransportOptions<ReturnType<typeof setInterval>> {\n return {\n configuration,\n migrationsDirectory: DEFAULT_MIGRATIONS_DIRECTORY,\n processToken: randomUUID(),\n now: () => Date.now(),\n createInterval: (work, intervalMs) => setInterval(work, intervalMs),\n clearInterval: (handle) => clearInterval(handle),\n delay: (durationMs) => new Promise((resolve) => setTimeout(resolve, durationMs)),\n };\n }\n\n async start(definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n return { ok: false, error: `Cannot start SQLite telemetry target from state ${this.state}` };\n }\n this.state = 'starting';\n this.detail = null;\n const tableMap = TelemetryTableMap.create(this.options.configuration.schema);\n if (!tableMap.ok) {\n return this.failStart(tableMap.error);\n }\n this.tableMap = tableMap.value;\n this.lease = new SqliteOwnershipLease({\n targetId: this.targetId,\n databasePath: this.options.configuration.path,\n mode: 'writer',\n expiryMs: this.options.configuration.leaseExpiryMs,\n processToken: this.options.processToken,\n now: this.options.now,\n });\n const acquired = this.lease.acquire();\n if (!acquired.ok) {\n return this.failStart(acquired.error);\n }\n\n try {\n const connection = new BetterSqlite3(this.options.configuration.path);\n this.connection = connection;\n this.configureConnection(connection);\n const manifestNeedsUpgrade = this.initializeAndVerifyManifest(connection, tableMap.value);\n await this.runMigrations(connection, tableMap.value);\n this.verifySchema(connection, tableMap.value);\n if (manifestNeedsUpgrade) {\n this.upgradeManifestMapping(connection, tableMap.value);\n }\n const stackDatabase = await createSqliteDb(connection);\n this.repository = new TelemetryRepository({\n targetId: this.targetId,\n connection,\n stackDatabase,\n tableMap: tableMap.value,\n retention: this.options.configuration.retention,\n now: this.options.now,\n });\n const recovered = this.repository.recoverInterruptedMaintenance(this.options.now());\n if (!recovered.ok) {\n throw new Error(recovered.error);\n }\n const registered = this.repository.registerDefinitions(definitions);\n if (!registered.ok) {\n throw new Error(registered.error);\n }\n this.definitions = Object.freeze([...definitions]);\n this.startHeartbeat();\n this.accepting = true;\n this.state = 'ready';\n return { ok: true, value: undefined };\n } catch (cause) {\n this.closeOwnedResources();\n return this.failStart(this.errorMessage(cause));\n }\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n if (!this.accepting || this.state !== 'ready' || this.repository === null) {\n return this.closedAcknowledgement(request.batch.idempotencyKey);\n }\n this.activeWrites += 1;\n try {\n const persisted = this.repository.persist(request);\n if (persisted.kind === 'acknowledged') {\n return persisted.acknowledgement;\n }\n this.detail = persisted.reason;\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: persisted.reason,\n retryAfterMs: 100,\n targetStates: [{\n targetId: this.targetId,\n delivery: this.options.configuration.delivery,\n state: 'failed',\n attempts: 1,\n reason: persisted.reason,\n }],\n };\n } finally {\n this.activeWrites -= 1;\n }\n }\n\n async timeline(query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n const queryError = this.validateTimelineQuery(query);\n if (queryError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: queryError } };\n }\n const result = this.withReaderLease(() => {\n const repository = this.requireRepository();\n const rawCutoffMs = this.options.now() - this.options.configuration.retention.rawMs;\n return repository.timeline(query, rawCutoffMs);\n });\n return this.enforceResponseBytes(result);\n }\n\n async metrics(query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n const queryError = this.validateMetricQuery(query);\n if (queryError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: queryError } };\n }\n const result = this.withReaderLease(() => this.requireRepository().metrics(query));\n if (result.ok) {\n const bucketCount = result.value.segments.reduce((count, segment) => count + segment.buckets.length, 0);\n if (bucketCount > this.options.configuration.query.maxBuckets) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Metric result exceeds the configured bucket maximum' },\n };\n }\n }\n return this.enforceResponseBytes(result);\n }\n\n async materializeRollups(\n nowMs: number,\n maxWorkMs: number,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.materializeRollups(nowMs, maxWorkMs));\n }\n\n async enforceRetention(\n nowMs: number,\n shouldContinue: () => boolean = () => true,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n const startedAt = this.options.now();\n let drain: ReturnType<TelemetryRepository['beginRetentionDrain']>;\n try {\n drain = this.requireRepository().beginRetentionDrain(nowMs);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n let affectedRows = 0;\n let deletionRounds = 0;\n let interrupted = false;\n for (;;) {\n if (!shouldContinue()) {\n interrupted = true;\n break;\n }\n const batch = drain.nextBatch();\n if (!batch.ok) {\n return batch;\n }\n affectedRows += batch.value.deletedRows;\n deletionRounds += 1;\n if (!batch.value.hasMore) {\n break;\n }\n await this.options.delay(0);\n }\n return {\n ok: true,\n value: {\n stage: 'retention',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: interrupted ? 'interrupted' : null,\n deletionRounds,\n completed: !interrupted,\n interrupted,\n },\n };\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.checkpoint());\n }\n\n async reclaim(maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.reclaim(maxPages));\n }\n\n async compact(deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n const startedAt = this.options.now();\n this.accepting = false;\n while ((this.activeReaders > 0 || this.activeWrites > 0) && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n }\n if (this.activeReaders > 0 || this.activeWrites > 0) {\n this.accepting = true;\n return { ok: false, error: 'Timed out waiting for telemetry readers/writers to quiesce' };\n }\n try {\n const tableMap = this.requireTableMap();\n this.closeDatabaseConnectionForCompaction();\n this.compactClosedDatabase(tableMap);\n await this.reopenDatabaseAfterCompaction(tableMap);\n this.accepting = true;\n return {\n ok: true,\n value: {\n stage: 'compaction',\n affectedRows: 0,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n const compactionError = this.errorMessage(cause);\n try {\n await this.reopenDatabaseAfterCompaction(this.requireTableMap());\n this.accepting = true;\n } catch (reopenCause) {\n this.state = 'failed';\n this.detail = this.errorMessage(reopenCause);\n }\n return { ok: false, error: compactionError };\n }\n }\n\n async recordMaintenance(\n record: MaintenanceRunRecord,\n ): Promise<TelemetryResult<void, string>> {\n try {\n return this.requireRepository().recordMaintenance(record);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n status(): StorageTargetStatus {\n const committedDropCounters = this.repository?.committedDropCounters();\n return Object.freeze({\n targetId: this.targetId,\n state: this.state,\n detail: this.detail,\n writerLeaseHeld: this.lease?.isHeld() ?? false,\n committedDropCounters:\n committedDropCounters?.ok === true ? committedDropCounters.value : Object.freeze([]),\n });\n }\n\n maintenanceConfiguration(): SQLiteTelemetryTransportOptions['configuration']['maintenance'] {\n return this.options.configuration.maintenance;\n }\n\n async stop(deadlineMs: number): Promise<void> {\n this.accepting = false;\n while ((this.activeReaders > 0 || this.activeWrites > 0) && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n }\n this.closeOwnedResources();\n this.state = 'stopped';\n this.detail = null;\n }\n\n private configureConnection(connection: BetterSqlite3.Database): void {\n const userTableCount = this.readCount(connection.prepare(\n `SELECT COUNT(*) AS count FROM sqlite_master\n WHERE type = 'table' AND name NOT LIKE 'sqlite_%'`,\n ).get());\n if (userTableCount === 0) {\n connection.pragma('auto_vacuum = INCREMENTAL');\n connection.exec('VACUUM');\n }\n const autoVacuum = Number(connection.pragma('auto_vacuum', { simple: true }));\n if (autoVacuum !== 2) {\n throw new Error('Telemetry SQLite target must use auto_vacuum=INCREMENTAL');\n }\n connection.pragma('journal_mode = WAL');\n connection.pragma('synchronous = NORMAL');\n connection.pragma('foreign_keys = ON');\n connection.pragma('busy_timeout = 5000');\n }\n\n private closeDatabaseConnectionForCompaction(): void {\n const connection = this.requireConnection();\n connection.pragma('wal_checkpoint(TRUNCATE)');\n this.repository = null;\n this.connection = null;\n connection.close();\n }\n\n private compactClosedDatabase(tableMap: TelemetryTableMap): void {\n const connection = new BetterSqlite3(this.options.configuration.path);\n try {\n this.configureConnection(connection);\n connection.exec('VACUUM');\n this.verifySchema(connection, tableMap);\n } finally {\n connection.close();\n }\n }\n\n private async reopenDatabaseAfterCompaction(tableMap: TelemetryTableMap): Promise<void> {\n if (this.connection !== null && this.repository !== null) {\n return;\n }\n const connection = new BetterSqlite3(this.options.configuration.path);\n try {\n this.configureConnection(connection);\n this.initializeAndVerifyManifest(connection, tableMap);\n this.verifySchema(connection, tableMap);\n const stackDatabase = await createSqliteDb(connection);\n const repository = new TelemetryRepository({\n targetId: this.targetId,\n connection,\n stackDatabase,\n tableMap,\n retention: this.options.configuration.retention,\n now: this.options.now,\n });\n const loaded = repository.loadDefinitionsReadOnly(this.definitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n this.connection = connection;\n this.repository = repository;\n } catch (cause) {\n connection.close();\n throw cause;\n }\n }\n\n private initializeAndVerifyManifest(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): boolean {\n connection.exec(\n `CREATE TABLE IF NOT EXISTS \"${SQLITE_SCHEMA_MANIFEST_TABLE}\" (\n target_id TEXT PRIMARY KEY,\n format_version INTEGER NOT NULL,\n mapping_json TEXT NOT NULL,\n mapping_checksum TEXT NOT NULL,\n state TEXT NOT NULL CHECK (state IN ('ready', 'renaming')),\n pending_mapping_json TEXT,\n updated_at_ms INTEGER NOT NULL\n )`,\n );\n const rows = connection.prepare(\n `SELECT target_id, format_version, mapping_json, mapping_checksum,\n state, pending_mapping_json, updated_at_ms\n FROM \"${SQLITE_SCHEMA_MANIFEST_TABLE}\"`,\n ).all();\n if (rows.length === 0) {\n connection.prepare(\n `INSERT INTO \"${SQLITE_SCHEMA_MANIFEST_TABLE}\" (\n target_id, format_version, mapping_json, mapping_checksum,\n state, pending_mapping_json, updated_at_ms\n ) VALUES (?, ?, ?, ?, 'ready', NULL, ?)`,\n ).run(\n this.targetId,\n 2,\n JSON.stringify(tableMap.manifestMapping()),\n tableMap.checksum,\n this.options.now(),\n );\n return false;\n }\n if (rows.length !== 1) {\n throw new Error('Telemetry schema manifest must contain exactly one target mapping');\n }\n const parsed = TelemetrySchemaManifestRowSchema.safeParse(rows[0]);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n if (parsed.data.target_id !== this.targetId) {\n throw new Error(`Telemetry database belongs to target ${parsed.data.target_id}, not ${this.targetId}`);\n }\n if (parsed.data.state !== 'ready') {\n throw new Error('Telemetry schema rename recovery is required before startup');\n }\n if (parsed.data.mapping_checksum === tableMap.checksum) {\n return false;\n }\n if (this.isLegacyManifestMapping(parsed.data, tableMap)) {\n return true;\n }\n throw new Error('Telemetry table mapping differs from the schema manifest; run offline schema rename');\n }\n\n private isLegacyManifestMapping(\n manifest: Readonly<{\n format_version: number;\n mapping_json: string;\n mapping_checksum: string;\n }>,\n tableMap: TelemetryTableMap,\n ): boolean {\n if (manifest.format_version !== 1) {\n return false;\n }\n const parsed: unknown = JSON.parse(manifest.mapping_json);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return false;\n }\n if (telemetryChecksum(parsed) !== manifest.mapping_checksum) {\n return false;\n }\n const expected = tableMap.manifestMapping();\n const legacyEntries = Object.entries(expected).filter(\n ([logicalName]) => logicalName !== 'committedDropCounters',\n );\n const actualEntries = Object.entries(parsed as Record<string, unknown>);\n return (\n actualEntries.length === legacyEntries.length &&\n legacyEntries.every(([logicalName, physicalName]) => {\n return Reflect.get(parsed, logicalName) === physicalName;\n })\n );\n }\n\n private upgradeManifestMapping(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): void {\n connection\n .prepare(\n `UPDATE \"${SQLITE_SCHEMA_MANIFEST_TABLE}\"\n SET format_version = 2, mapping_json = ?, mapping_checksum = ?, updated_at_ms = ?\n WHERE target_id = ?`,\n )\n .run(\n JSON.stringify(tableMap.manifestMapping()),\n tableMap.checksum,\n this.options.now(),\n this.targetId,\n );\n }\n\n private async runMigrations(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): Promise<void> {\n const sqlRunner = new TelemetryProperSqlRunner(connection, tableMap);\n const migrationRunner = await new MigrationRunnerFactory().create({\n migration_folder: this.options.migrationsDirectory,\n migration_table: tableMap.quoted('migrationHistory'),\n database: 'sqlite',\n sqlite: { database: this.options.configuration.path },\n }, sqlRunner);\n const pending = await migrationRunner.getPendingMigrations();\n await migrationRunner.migrate(pending, true);\n }\n\n private verifySchema(connection: BetterSqlite3.Database, tableMap: TelemetryTableMap): void {\n const rows = connection.prepare(\n `SELECT name FROM sqlite_master WHERE type = 'table'`,\n ).all();\n const names = new Set(rows.map((row) => this.readName(row)));\n if (!names.has(SQLITE_SCHEMA_MANIFEST_TABLE)) {\n throw new Error('Telemetry schema manifest is missing');\n }\n const missing = SQLITE_LOGICAL_TABLE_NAMES\n .map((logicalName) => tableMap.physical(logicalName))\n .filter((physicalName) => !names.has(physicalName));\n if (missing.length > 0) {\n throw new Error(`Telemetry schema is missing table(s): ${missing.join(', ')}`);\n }\n }\n\n private startHeartbeat(): void {\n const intervalMs = Math.max(1_000, Math.floor(this.options.configuration.leaseExpiryMs / 3));\n this.heartbeatHandle = this.options.createInterval(() => {\n const heartbeat = this.lease?.heartbeat();\n if (heartbeat && !heartbeat.ok) {\n this.accepting = false;\n this.state = 'failed';\n this.detail = heartbeat.error;\n }\n }, intervalMs);\n }\n\n private withReaderLease<T>(work: () => TelemetryResult<T, TelemetryQueryError>): TelemetryResult<T, TelemetryQueryError> {\n if (!this.accepting || this.state !== 'ready') {\n return { ok: false, error: { kind: 'storage-failure', message: 'Telemetry target is not accepting readers' } };\n }\n this.activeReaders += 1;\n const leaseId = randomUUID();\n const table = this.requireTableMap().quoted('readerLeases');\n const connection = this.requireConnection();\n try {\n const acquiredAtMs = this.options.now();\n connection.prepare(\n `INSERT INTO ${table} (\n target_id, lease_id, owner_id, acquired_at_ms, expires_at_ms, state\n ) VALUES (?, ?, ?, ?, ?, 'active')`,\n ).run(\n this.targetId,\n leaseId,\n this.options.processToken,\n acquiredAtMs,\n acquiredAtMs + this.options.configuration.leaseExpiryMs,\n );\n return work();\n } finally {\n connection.prepare(\n `UPDATE ${table} SET state = 'released' WHERE target_id = ? AND lease_id = ?`,\n ).run(this.targetId, leaseId);\n this.activeReaders -= 1;\n }\n }\n\n private requireRepositoryResult(\n work: (repository: TelemetryRepository) => TelemetryResult<MaintenanceStageResult, string>,\n ): TelemetryResult<MaintenanceStageResult, string> {\n try {\n return work(this.requireRepository());\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private validateTimelineQuery(query: TimelineQuery): string | null {\n const commonError = this.validateQueryRange(query.targetId, query.fromMs, query.toMs, query.limit);\n return commonError;\n }\n\n private validateMetricQuery(query: MetricQuery): string | null {\n const rangeError = this.validateQueryRange(query.targetId, query.fromMs, query.toMs, query.limit);\n if (rangeError !== null) {\n return rangeError;\n }\n if (query.limit > this.options.configuration.query.maxBuckets) {\n return 'Metric query limit exceeds the configured bucket maximum';\n }\n return null;\n }\n\n private validateQueryRange(\n targetId: string | null,\n fromMs: number,\n toMs: number,\n limit: number,\n ): string | null {\n if (targetId !== null && targetId !== this.targetId) {\n return `Query target ${targetId} does not match ${this.targetId}`;\n }\n if (!Number.isSafeInteger(fromMs) || !Number.isSafeInteger(toMs) || fromMs >= toMs) {\n return 'Query time range must use safe integer milliseconds and be non-empty';\n }\n if (toMs - fromMs > this.options.configuration.query.maxRangeMs) {\n return 'Query time range exceeds the configured maximum';\n }\n if (!Number.isInteger(limit) || limit <= 0 || limit > this.options.configuration.query.maxRows) {\n return 'Query row limit is outside the configured bounds';\n }\n return null;\n }\n\n private validateConfiguration(): void {\n const configuration = this.options.configuration;\n if (!configuration.targetId.trim() || !configuration.path.trim()) {\n throw new Error('SQLite telemetry target id and path are required');\n }\n if (!Number.isInteger(configuration.leaseExpiryMs) || configuration.leaseExpiryMs < 1_000) {\n throw new Error('SQLite telemetry ownership lease expiry must be at least one second');\n }\n const queryLimits = Object.values(configuration.query);\n if (queryLimits.some((limit) => !Number.isSafeInteger(limit) || limit <= 0)) {\n throw new Error('SQLite telemetry query limits must be positive safe integers');\n }\n const retention = configuration.retention;\n const invalidRetention = retention.rawMs <= 0\n || retention.lateArrivalMs < 0\n || retention.samplesMs < retention.rawMs + retention.lateArrivalMs;\n if (invalidRetention) {\n throw new Error('SQLite telemetry retention values are invalid');\n }\n this.validateRollupTiers();\n }\n\n private validateRollupTiers(): void {\n const retention = this.options.configuration.retention;\n const tiers = retention.rollups;\n if (tiers.length === 0) {\n throw new Error('SQLite telemetry requires at least one rollup retention tier');\n }\n for (let index = 0; index < tiers.length; index += 1) {\n const tier = tiers[index];\n const previous = tiers[index - 1];\n if (!tier || tier.resolutionMs <= 0 || tier.retainMs < retention.rawMs) {\n throw new Error('SQLite telemetry rollup tiers are invalid');\n }\n if (previous && (tier.resolutionMs <= previous.resolutionMs || tier.retainMs < previous.retainMs)) {\n throw new Error('SQLite telemetry rollup tiers must increase by resolution and retention');\n }\n }\n }\n\n private enforceResponseBytes<T>(\n result: TelemetryResult<T, TelemetryQueryError>,\n ): TelemetryResult<T, TelemetryQueryError> {\n if (!result.ok) {\n return result;\n }\n // This output guard runs after repository materialization. Range/row/bucket limits\n // bound normal reads, but a future streaming query path should enforce bytes while decoding.\n try {\n const bytes = telemetryUtf8Length(canonicalJson(result.value));\n if (bytes > this.options.configuration.query.maxResponseBytes) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Query result exceeds the configured response byte maximum' },\n };\n }\n return result;\n } catch (cause) {\n return {\n ok: false,\n error: { kind: 'storage-failure', message: `Unable to size telemetry query result: ${this.errorMessage(cause)}` },\n };\n }\n }\n\n private failStart(error: string): TelemetryResult<void, string> {\n this.state = 'failed';\n this.detail = error;\n return { ok: false, error };\n }\n\n private closedAcknowledgement(idempotencyKey: string): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey,\n reason: 'SQLite telemetry target is not ready',\n retryAfterMs: 100,\n targetStates: [{\n targetId: this.targetId,\n delivery: this.options.configuration.delivery,\n state: 'failed',\n attempts: 0,\n reason: 'target-not-ready',\n }],\n };\n }\n\n private closeOwnedResources(): void {\n if (this.heartbeatHandle !== null) {\n this.options.clearInterval(this.heartbeatHandle);\n this.heartbeatHandle = null;\n }\n if (this.connection?.open) {\n try {\n this.connection.close();\n } catch {\n // Release the ownership lease even if SQLite close reports a failure.\n }\n }\n this.connection = null;\n this.repository = null;\n this.lease?.release();\n this.lease = null;\n }\n\n private requireRepository(): TelemetryRepository {\n if (this.repository === null) {\n throw new Error('SQLite telemetry repository is not initialized');\n }\n return this.repository;\n }\n\n private requireConnection(): BetterSqlite3.Database {\n if (this.connection === null) {\n throw new Error('SQLite telemetry connection is not initialized');\n }\n return this.connection;\n }\n\n private requireTableMap(): TelemetryTableMap {\n if (this.tableMap === null) {\n throw new Error('SQLite telemetry table map is not initialized');\n }\n return this.tableMap;\n }\n\n private readCount(row: unknown): number {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error('SQLite count query returned no row');\n }\n const count = Reflect.get(row, 'count');\n if (typeof count !== 'number') {\n throw new Error('SQLite count query returned an invalid count');\n }\n return count;\n }\n\n private readName(row: unknown): string {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error('SQLite schema query returned an invalid row');\n }\n const name = Reflect.get(row, 'name');\n if (typeof name !== 'string') {\n throw new Error('SQLite schema query returned an invalid table name');\n }\n return name;\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type { SqliteTableOverrides } from '../../core/types/configuration.types.js';\n\nexport const SQLITE_LOGICAL_TABLE_NAMES = [\n 'rawEvents',\n 'batchAcknowledgements',\n 'ingestWatermarks',\n 'metricDefinitions',\n 'metricSamples',\n 'metricRollups',\n 'rollupCompletions',\n 'extractionFailures',\n 'maintenanceRuns',\n 'readerLeases',\n 'committedDropCounters',\n 'migrationHistory',\n] as const satisfies readonly (keyof SqliteTableOverrides)[];\n\nexport const SQLITE_DEFAULT_TABLE_NAMES: Readonly<Record<(typeof SQLITE_LOGICAL_TABLE_NAMES)[number], string>> =\n Object.freeze({\n rawEvents: 'raw_events',\n batchAcknowledgements: 'batch_acknowledgements',\n ingestWatermarks: 'ingest_watermarks',\n metricDefinitions: 'metric_definitions',\n metricSamples: 'metric_samples',\n metricRollups: 'metric_rollups',\n rollupCompletions: 'rollup_completions',\n extractionFailures: 'extraction_failures',\n maintenanceRuns: 'maintenance_runs',\n readerLeases: 'reader_leases',\n committedDropCounters: 'committed_drop_counters',\n migrationHistory: 'migration_history',\n });\n\nexport const SQLITE_SCHEMA_MANIFEST_TABLE = 'telemetry_schema_manifest';\n","import {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n SqliteOwnershipLeaseOptions,\n SqliteOwnershipLeaseRecord,\n} from './types/sqlite_ownership_lease.types.js';\n\nexport class SqliteOwnershipLease {\n private readonly canonicalDatabasePath: string;\n private readonly leasePath: string;\n private held = false;\n\n constructor(private readonly options: SqliteOwnershipLeaseOptions) {\n mkdirSync(dirname(options.databasePath), { recursive: true });\n const canonicalDirectory = realpathSync(dirname(resolve(options.databasePath)));\n const databaseName = resolve(options.databasePath).slice(dirname(resolve(options.databasePath)).length + 1);\n this.canonicalDatabasePath = resolve(canonicalDirectory, databaseName);\n this.leasePath = `${this.canonicalDatabasePath}.telemetry-owner.json`;\n }\n\n acquire(): TelemetryResult<void, string> {\n const firstAttempt = this.writeExclusive(this.createRecord());\n if (firstAttempt.ok) {\n this.held = true;\n return firstAttempt;\n }\n\n const recovered = this.recoverStaleLease();\n if (!recovered.ok) {\n return recovered;\n }\n const secondAttempt = this.writeExclusive(this.createRecord());\n if (secondAttempt.ok) {\n this.held = true;\n }\n return secondAttempt;\n }\n\n heartbeat(): TelemetryResult<void, string> {\n if (!this.held) {\n return { ok: false, error: 'Cannot heartbeat a telemetry lease that is not held' };\n }\n const current = this.readRecord();\n if (!current.ok) {\n return current;\n }\n if (current.value.processToken !== this.options.processToken) {\n this.held = false;\n return { ok: false, error: 'Telemetry ownership lease was replaced by another owner' };\n }\n const now = this.options.now();\n return this.writeReplace({\n ...current.value,\n heartbeatAtMs: now,\n expiresAtMs: now + this.options.expiryMs,\n });\n }\n\n release(): void {\n if (!this.held || !existsSync(this.leasePath)) {\n this.held = false;\n return;\n }\n const current = this.readRecord();\n if (current.ok && current.value.processToken === this.options.processToken) {\n try {\n rmSync(this.leasePath, { force: true });\n } catch {\n // The lease will expire and can be recovered by a later owner.\n }\n }\n this.held = false;\n }\n\n isHeld(): boolean {\n return this.held;\n }\n\n path(): string {\n return this.leasePath;\n }\n\n private createRecord(): SqliteOwnershipLeaseRecord {\n const now = this.options.now();\n return {\n formatVersion: 1,\n targetId: this.options.targetId,\n databasePath: this.canonicalDatabasePath,\n mode: this.options.mode,\n pid: process.pid,\n processToken: this.options.processToken,\n acquiredAtMs: now,\n heartbeatAtMs: now,\n expiresAtMs: now + this.options.expiryMs,\n };\n }\n\n private writeExclusive(record: SqliteOwnershipLeaseRecord): TelemetryResult<void, string> {\n let descriptor: number | null = null;\n try {\n descriptor = openSync(this.leasePath, 'wx', 0o600);\n writeFileSync(descriptor, JSON.stringify(record), { encoding: 'utf8' });\n closeSync(descriptor);\n return { ok: true, value: undefined };\n } catch (cause) {\n if (descriptor !== null) {\n try {\n closeSync(descriptor);\n } catch {\n // Preserve the original lease acquisition error.\n }\n }\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private writeReplace(record: SqliteOwnershipLeaseRecord): TelemetryResult<void, string> {\n const temporaryPath = `${this.leasePath}.${this.options.processToken}.tmp`;\n try {\n writeFileSync(temporaryPath, JSON.stringify(record), { encoding: 'utf8', mode: 0o600 });\n renameSync(temporaryPath, this.leasePath);\n return { ok: true, value: undefined };\n } catch (cause) {\n try {\n rmSync(temporaryPath, { force: true });\n } catch {\n // Preserve the original heartbeat write error.\n }\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private readRecord(): TelemetryResult<SqliteOwnershipLeaseRecord, string> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(this.leasePath, 'utf8'));\n if (!this.isLeaseRecord(parsed)) {\n return { ok: false, error: `Invalid telemetry ownership lease at ${this.leasePath}` };\n }\n return { ok: true, value: parsed };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private recoverStaleLease(): TelemetryResult<void, string> {\n const current = this.readRecord();\n if (!current.ok) {\n return current;\n }\n const expired = current.value.expiresAtMs < this.options.now();\n const processAlive = this.isProcessAlive(current.value.pid);\n if (!expired || processAlive) {\n return {\n ok: false,\n error: `Telemetry target ${this.options.targetId} is owned by pid ${current.value.pid} (${current.value.mode})`,\n };\n }\n try {\n const stalePath = `${this.leasePath}.stale.${current.value.processToken}`;\n renameSync(this.leasePath, stalePath);\n rmSync(stalePath, { force: true });\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (cause) {\n const code = typeof cause === 'object' && cause !== null && 'code' in cause\n ? Reflect.get(cause, 'code')\n : null;\n return code === 'EPERM';\n }\n }\n\n private isLeaseRecord(value: unknown): value is SqliteOwnershipLeaseRecord {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return Reflect.get(value, 'formatVersion') === 1\n && typeof Reflect.get(value, 'targetId') === 'string'\n && typeof Reflect.get(value, 'databasePath') === 'string'\n && (Reflect.get(value, 'mode') === 'writer' || Reflect.get(value, 'mode') === 'offline-maintenance')\n && Number.isInteger(Reflect.get(value, 'pid'))\n && typeof Reflect.get(value, 'processToken') === 'string'\n && typeof Reflect.get(value, 'acquiredAtMs') === 'number'\n && typeof Reflect.get(value, 'heartbeatAtMs') === 'number'\n && typeof Reflect.get(value, 'expiresAtMs') === 'number';\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type Database from 'better-sqlite3';\nimport type { ISQLRunner } from '@noego/proper/runners';\nimport { TelemetryTableMap } from './telemetry_table_map.js';\n\nexport class TelemetryProperSqlRunner implements ISQLRunner {\n constructor(\n private readonly connection: Database.Database,\n private readonly tableMap: TelemetryTableMap,\n ) {}\n\n async query(sql: string, params: unknown[] = []): Promise<unknown> {\n const substituted = this.substitute(sql);\n const normalized = this.leadingKeyword(substituted);\n if (normalized === 'SELECT' || normalized === 'WITH' || normalized === 'PRAGMA' || normalized === 'EXPLAIN') {\n return [this.connection.prepare(substituted).all(...params), undefined];\n }\n if (params.length > 0) {\n return [this.connection.prepare(substituted).run(...params), undefined];\n }\n this.connection.exec(substituted);\n return [{ changes: 0 }, undefined];\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<unknown> {\n const substituted = this.substitute(sql);\n if (params.length > 0) {\n return [this.connection.prepare(substituted).run(...params), undefined];\n }\n this.connection.exec(substituted);\n return [{ changes: 0 }, undefined];\n }\n\n async end(): Promise<void> {\n // Proper shares the SQLite target's connection and must not close it.\n }\n\n private substitute(sql: string): string {\n const substituted = this.tableMap.substitute(sql);\n if (!substituted.ok) {\n throw new Error(substituted.error);\n }\n return substituted.value;\n }\n\n private leadingKeyword(sql: string): string {\n const withoutComments = sql\n .replace(/--.*$/gm, '')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .trimStart();\n return withoutComments.split(/\\s+/, 1)[0]?.toUpperCase() ?? '';\n }\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalJson, telemetryChecksum } from '../core/helper/canonical_json.js';\nimport { MetricDefinitionContract } from '../core/metric_definition_contract.js';\nimport type { TelemetryEnvelope } from '../core/types/envelope.types.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from '../core/types/json.types.js';\nimport type {\n MetricAggregate,\n MetricDefinition,\n MetricMeasurement,\n MetricRollupValues,\n} from '../core/types/metric.types.js';\nimport type {\n MetricBucket,\n MetricDimensionFilter,\n MetricQuery,\n MetricQueryGap,\n MetricQueryResponse,\n MetricQuerySegment,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n RetentionDrain,\n RetentionDrainBatchResult,\n StoragePersistRequest,\n} from '../core/types/storage.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryDropCounter,\n} from '../core/types/transport.types.js';\nimport {\n BatchAcknowledgementRowSchema,\n type MetricSampleRow,\n StoredMetricDefinitionRowSchema,\n StoredMetricDefinitionSchema,\n} from './schema/telemetry_repository_rows.js';\nimport { TelemetryRepositoryRowParser } from './telemetry_repository_row_parser.js';\nimport type {\n MetricBucketWork,\n MutableMaterializedMetricGroup,\n MutableMetricFieldAggregate,\n NormalizedMetricSample,\n RepositoryPersistOutcome,\n RollupCoverageInterval,\n TelemetryRepositoryOptions,\n} from './types/telemetry_repository.types.js';\n\nconst RETENTION_PAGE_SIZE = 500;\n\ntype RawRetentionCursor = Readonly<{\n occurredAtMs: number;\n producerId: string;\n sequence: number;\n}>;\n\ntype SampleRetentionCursor = Readonly<{\n occurredAtMs: number;\n metricName: string;\n definitionVersion: number;\n producerId: string;\n sequence: number;\n}>;\n\ntype RetentionStepOutcome = Readonly<{ deleted: number; done: boolean }>;\n\ntype RetentionStep = () => RetentionStepOutcome;\n\nclass MetricCardinalityRejectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MetricCardinalityRejectionError';\n }\n}\n\nexport class TelemetryRepository {\n private readonly rowParser = new TelemetryRepositoryRowParser();\n private readonly definitionContract = new MetricDefinitionContract();\n private readonly definitions = new Map<string, MetricDefinition>();\n\n constructor(private readonly options: TelemetryRepositoryOptions) {}\n\n registerDefinitions(definitions: readonly MetricDefinition[]): TelemetryResult<void, string> {\n try {\n const normalizedDefinitions = this.normalizeDefinitions(definitions);\n const registeredAtMs = this.options.now();\n const byName = new Map<string, MetricDefinition[]>();\n for (const definition of normalizedDefinitions) {\n const versions = byName.get(definition.name) ?? [];\n versions.push(definition);\n byName.set(definition.name, versions);\n }\n\n const transaction = this.options.connection.transaction(() => {\n const table = this.options.tableMap.quoted('metricDefinitions');\n const deactivate = this.options.connection.prepare(\n `UPDATE ${table} SET active = 0 WHERE target_id = ? AND metric_name = ?`,\n );\n const existing = this.options.connection.prepare(\n `SELECT definition_checksum FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?`,\n );\n const insert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, metric_name, definition_version, definition_json,\n definition_checksum, active, registered_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n );\n const activate = this.options.connection.prepare(\n `UPDATE ${table} SET active = 1\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?`,\n );\n\n for (const [metricName, versions] of byName) {\n deactivate.run(this.options.targetId, metricName);\n const latestVersion = Math.max(...versions.map((definition) => definition.version));\n for (const definition of versions) {\n const definitionJson = canonicalJson(definition);\n const definitionChecksum = telemetryChecksum(definition);\n const prior = existing.get(this.options.targetId, definition.name, definition.version);\n if (prior !== undefined) {\n const priorChecksum = this.readStringField(prior, 'definition_checksum');\n if (priorChecksum !== definitionChecksum) {\n throw new Error(\n `Metric ${definition.name} version ${definition.version} changed without a version bump`,\n );\n }\n } else {\n insert.run(\n this.options.targetId,\n definition.name,\n definition.version,\n definitionJson,\n definitionChecksum,\n definition.version === latestVersion ? 1 : 0,\n registeredAtMs,\n );\n }\n }\n activate.run(this.options.targetId, metricName, latestVersion);\n }\n });\n transaction();\n const loaded = this.loadDefinitionsReadOnly(normalizedDefinitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n loadDefinitionsReadOnly(\n expectedDefinitions: readonly MetricDefinition[],\n ): TelemetryResult<void, string> {\n try {\n const normalizedExpectedDefinitions = this.normalizeDefinitions(expectedDefinitions);\n const table = this.options.tableMap.quoted('metricDefinitions');\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, definition_json, definition_checksum, active\n FROM ${table} WHERE target_id = ?`,\n )\n .all(this.options.targetId);\n const loaded = new Map<string, MetricDefinition>();\n for (const rawRow of rows) {\n const row = StoredMetricDefinitionRowSchema.parse(rawRow);\n const parsedJson: unknown = JSON.parse(row.definition_json);\n const parsedDefinition = StoredMetricDefinitionSchema.parse(parsedJson);\n const normalized = this.definitionContract.normalize(parsedDefinition);\n if (!normalized.ok) {\n throw new Error(normalized.error);\n }\n const definition = normalized.value;\n const identityMatches =\n definition.name === row.metric_name && definition.version === row.definition_version;\n if (!identityMatches) {\n throw new Error('Stored metric definition identity does not match its row');\n }\n const checksum = telemetryChecksum(definition);\n const canonicalRowMatches =\n checksum === row.definition_checksum &&\n canonicalJson(definition) === row.definition_json;\n // Rows written before the shared canonical-json/fnv1a64 contract used\n // sha256 over the writer's own serialization. Their integrity is still\n // verifiable against their stored checksum, and registration rewrites\n // them in the canonical format on the next collector start.\n const legacyRowMatches =\n !canonicalRowMatches &&\n createHash('sha256').update(row.definition_json, 'utf8').digest('hex') ===\n row.definition_checksum;\n if (!canonicalRowMatches && !legacyRowMatches) {\n // Stale inactive rows are not load-bearing; an unreadable legacy\n // format must not wedge readers.\n if (row.active !== 1) {\n continue;\n }\n throw new Error(\n `Stored metric ${definition.name} version ${definition.version} checksum is invalid`,\n );\n }\n loaded.set(this.definitionKey(definition.name, definition.version), definition);\n }\n for (const expected of normalizedExpectedDefinitions) {\n const stored = loaded.get(this.definitionKey(expected.name, expected.version));\n if (stored === undefined || telemetryChecksum(stored) !== telemetryChecksum(expected)) {\n throw new Error(\n `Configured metric ${expected.name} version ${expected.version} is not registered in target ${this.options.targetId}`,\n );\n }\n }\n this.definitions.clear();\n for (const [identity, definition] of loaded) {\n this.definitions.set(identity, definition);\n }\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n persist(request: StoragePersistRequest): RepositoryPersistOutcome {\n try {\n const outsideHorizon = this.outsideIngestionHorizon(request.batch);\n if (outsideHorizon !== null) {\n return { kind: 'acknowledged', acknowledgement: outsideHorizon };\n }\n const replay = this.findReplay(request.batch);\n if (replay !== null) {\n return { kind: 'acknowledged', acknowledgement: replay };\n }\n const acknowledgement = this.persistTransaction(request);\n return { kind: 'acknowledged', acknowledgement };\n } catch (cause) {\n return { kind: 'failed', reason: this.errorMessage(cause) };\n }\n }\n\n timeline(\n query: TimelineQuery,\n rawRetentionCutoffMs: number,\n ): TelemetryResult<TimelineQueryResponse, TelemetryQueryError> {\n try {\n const cursor =\n query.cursor === null ? null : this.rowParser.parseTimelineCursor(query.cursor);\n if (cursor !== null && !cursor.ok) {\n return { ok: false, error: { kind: 'invalid-query', message: cursor.error } };\n }\n if (cursor !== null && cursor.value.order !== query.order) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Timeline cursor order changed' },\n };\n }\n\n const availableFromMs = Math.max(query.fromMs, rawRetentionCutoffMs);\n const clauses = ['target_id = ?', 'occurred_at_ms >= ?', 'occurred_at_ms < ?'];\n const params: unknown[] = [this.options.targetId, availableFromMs, query.toMs];\n this.addTimelineFilters(query, clauses, params);\n if (cursor?.ok) {\n this.addTimelineCursor(cursor.value, query.order, clauses, params);\n }\n const direction = query.order === 'asc' ? 'ASC' : 'DESC';\n const table = this.options.tableMap.quoted('rawEvents');\n const sql = `SELECT\n producer_id, sequence, event_id, occurred_at_ms, monotonic_ns,\n source, process_kind, level, label, conversation_id,\n conversation_id_kind, correlation_id, metadata_json, schema_version\n FROM ${table}\n WHERE ${clauses.join(' AND ')}\n ORDER BY occurred_at_ms ${direction}, producer_id ${direction}, sequence ${direction}\n LIMIT ?`;\n params.push(query.limit + 1);\n const rows = this.options.connection.prepare(sql).all(...params);\n const hasNextPage = rows.length > query.limit;\n const pageRows = hasNextPage ? rows.slice(0, query.limit) : rows;\n const events: TelemetryEnvelope[] = [];\n for (const row of pageRows) {\n const parsed = this.rowParser.parseRawEnvelope(row);\n if (!parsed.ok) {\n return { ok: false, error: { kind: 'storage-failure', message: parsed.error } };\n }\n events.push(parsed.value);\n }\n const last = events[events.length - 1];\n const nextCursor =\n hasNextPage && last\n ? this.encodeCursor({\n version: 1,\n order: query.order,\n occurredAtMs: last.occurredAtMs,\n producerId: last.producerId,\n sequence: last.sequence,\n })\n : null;\n const unavailableEnd = Math.min(query.toMs, rawRetentionCutoffMs);\n const gaps =\n query.fromMs < unavailableEnd\n ? [{ fromMs: query.fromMs, toMs: unavailableEnd, reason: 'raw-retention' as const }]\n : [];\n return {\n ok: true,\n value: {\n targetId: this.options.targetId,\n events: Object.freeze(events),\n gaps: Object.freeze(gaps),\n nextCursor,\n },\n };\n } catch (cause) {\n return { ok: false, error: { kind: 'storage-failure', message: this.errorMessage(cause) } };\n }\n }\n\n metrics(query: MetricQuery): TelemetryResult<MetricQueryResponse, TelemetryQueryError> {\n try {\n const definitions = this.metricDefinitions(query.metric);\n if (definitions.length === 0) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: `Unknown metric ${query.metric}` },\n };\n }\n const validationError = this.validateMetricQuery(query, definitions);\n if (validationError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: validationError } };\n }\n const cursor = query.cursor === null ? null : this.rowParser.parseMetricCursor(query.cursor);\n if (cursor !== null && !cursor.ok) {\n return { ok: false, error: { kind: 'invalid-query', message: cursor.error } };\n }\n if (cursor !== null && cursor.value.order !== query.order) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Metric cursor order changed' },\n };\n }\n\n const coverage = this.planCoverage(query, definitions);\n const rows = this.readRollupsForCoverage(query, coverage.intervals);\n const filtered = rows.filter((row) => this.matchesWhere(row.bucket.dimensions, query.where));\n const ordered = filtered.sort((left, right) =>\n this.compareParsedRollups(left, right, query.order),\n );\n const afterCursor = cursor?.ok\n ? ordered.filter((row) => this.isAfterMetricCursor(row, cursor.value, query.order))\n : ordered;\n const hasNextPage = afterCursor.length > query.limit;\n const page = hasNextPage ? afterCursor.slice(0, query.limit) : afterCursor;\n const projected = page.map((row) => ({\n ...row,\n bucket: {\n ...row.bucket,\n values: this.selectMeasurements(row.bucket.values, query.measurements),\n },\n }));\n const segments = this.rowsToSegments(coverage.intervals, projected);\n const last = page[page.length - 1];\n const nextCursor =\n hasNextPage && last\n ? this.encodeCursor({\n version: 1,\n order: query.order,\n bucketStartMs: last.bucket.startMs,\n resolutionMs: last.resolutionMs,\n definitionVersion: last.definitionVersion,\n dimensionKey: last.dimensionKey,\n })\n : null;\n return {\n ok: true,\n value: {\n targetId: this.options.targetId,\n metric: query.metric,\n segments,\n gaps: coverage.gaps,\n nextCursor,\n partialFailures: [],\n },\n };\n } catch (cause) {\n return { ok: false, error: { kind: 'storage-failure', message: this.errorMessage(cause) } };\n }\n }\n\n materializeRollups(\n nowMs: number,\n maxWorkMs: number,\n ): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n let affectedRows = 0;\n let rejectedBucketCount = 0;\n const rejectedBucketExamples: string[] = [];\n try {\n for (const definition of this.definitions.values()) {\n for (const resolutionMs of definition.resolutionsMs) {\n const dueBeforeMs = nowMs - this.options.retention.lateArrivalMs;\n const bucketStarts = this.findDueBucketStarts(definition, resolutionMs, dueBeforeMs);\n for (const bucketStartMs of bucketStarts) {\n if (this.options.now() - startedAt >= maxWorkMs) {\n return {\n ok: true,\n value: {\n stage: 'rollup',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: this.rollupStageDetail(\n rejectedBucketCount,\n rejectedBucketExamples,\n true,\n ),\n },\n };\n }\n const work = this.loadBucketWork(definition, resolutionMs, bucketStartMs);\n if (this.bucketIsCurrent(work)) {\n continue;\n }\n try {\n affectedRows += this.materializeBucket(work, nowMs);\n } catch (cause) {\n if (!(cause instanceof MetricCardinalityRejectionError)) {\n throw cause;\n }\n this.recordRejectedBucket(work, nowMs, cause.message);\n rejectedBucketCount += 1;\n if (rejectedBucketExamples.length < 3) {\n rejectedBucketExamples.push(\n `${definition.name}:${definition.version}:${resolutionMs}:${bucketStartMs}: ${cause.message}`,\n );\n }\n }\n }\n }\n }\n return {\n ok: true,\n value: {\n stage: 'rollup',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: this.rollupStageDetail(\n rejectedBucketCount,\n rejectedBucketExamples,\n false,\n ),\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n beginRetentionDrain(nowMs: number): RetentionDrain {\n const steps: RetentionStep[] = [\n this.createRawEventRetentionStep(nowMs),\n this.createSampleRetentionStep(nowMs),\n ...this.createRollupRetentionSteps(nowMs),\n ...this.createAuxiliaryRetentionSteps(nowMs),\n ];\n let index = 0;\n return {\n nextBatch: (): TelemetryResult<RetentionDrainBatchResult, string> => {\n try {\n if (steps.length === 0) {\n return { ok: true, value: { deletedRows: 0, hasMore: false } };\n }\n if (index >= steps.length) {\n index = 0;\n }\n const step = steps[index];\n if (step === undefined) {\n return { ok: true, value: { deletedRows: 0, hasMore: false } };\n }\n const outcome = step();\n if (outcome.done) {\n steps.splice(index, 1);\n } else {\n index += 1;\n }\n return {\n ok: true,\n value: { deletedRows: outcome.deleted, hasMore: steps.length > 0 },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n },\n };\n }\n\n checkpoint(): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n try {\n const rows = this.options.connection.pragma('wal_checkpoint(PASSIVE)');\n return {\n ok: true,\n value: {\n stage: 'checkpoint',\n affectedRows: Array.isArray(rows) ? rows.length : 0,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n reclaim(maxPages: number): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n try {\n const before = Number(this.options.connection.pragma('freelist_count', { simple: true }));\n this.options.connection.pragma(`incremental_vacuum(${Math.max(0, Math.floor(maxPages))})`);\n const after = Number(this.options.connection.pragma('freelist_count', { simple: true }));\n return {\n ok: true,\n value: {\n stage: 'reclaim',\n affectedRows: 0,\n affectedPages: Math.max(0, before - after),\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n pageStats(): TelemetryResult<\n Readonly<{ pageCount: number; freePages: number; pageSize: number }>,\n string\n > {\n try {\n return {\n ok: true,\n value: {\n pageCount: Number(this.options.connection.pragma('page_count', { simple: true })),\n freePages: Number(this.options.connection.pragma('freelist_count', { simple: true })),\n pageSize: Number(this.options.connection.pragma('page_size', { simple: true })),\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n recordMaintenance(record: MaintenanceRunRecord): TelemetryResult<void, string> {\n try {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const affectedRows = record.stages.reduce((sum, stage) => sum + stage.affectedRows, 0);\n const affectedPages = record.stages.reduce((sum, stage) => sum + stage.affectedPages, 0);\n const detail = canonicalJson({\n stages: record.stages,\n failedStage: record.failedStage,\n error: record.error,\n });\n this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, run_id, state, stage, started_at_ms, completed_at_ms,\n affected_rows, affected_pages, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, run_id, stage) DO UPDATE SET\n state = excluded.state,\n completed_at_ms = excluded.completed_at_ms,\n affected_rows = excluded.affected_rows,\n affected_pages = excluded.affected_pages,\n detail = excluded.detail`,\n ).run(\n this.options.targetId,\n record.runId,\n record.state,\n record.kind,\n record.startedAtMs,\n record.completedAtMs,\n affectedRows,\n affectedPages,\n detail,\n );\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n recoverInterruptedMaintenance(nowMs: number): TelemetryResult<number, string> {\n try {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const detail = canonicalJson({\n stages: [],\n failedStage: null,\n error: 'interrupted-before-restart',\n });\n const result = this.options.connection.prepare(\n `UPDATE ${table}\n SET state = 'failed', completed_at_ms = ?, detail = ?\n WHERE target_id = ? AND state = 'started'`,\n ).run(nowMs, detail, this.options.targetId);\n return { ok: true, value: result.changes };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n committedDropCounters(): TelemetryResult<readonly TelemetryDropCounter[], string> {\n try {\n const table = this.options.tableMap.quoted('committedDropCounters');\n const rows = this.options.connection\n .prepare(\n `SELECT reason, priority, count\n FROM ${table}\n WHERE target_id = ?\n ORDER BY reason ASC, priority ASC`,\n )\n .all(this.options.targetId);\n const counters = rows.map((row) => this.parseCommittedDropCounter(row));\n return { ok: true, value: Object.freeze(counters) };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private findReplay(batch: TelemetryBatch): TelemetryAcknowledgement | null {\n const table = this.options.tableMap.quoted('batchAcknowledgements');\n const rows = this.options.connection\n .prepare(\n `SELECT idempotency_key, producer_id, sequence_start, sequence_end,\n schema_version, checksum, accepted_events, committed_at_ms\n FROM ${table}\n WHERE target_id = ? AND producer_id = ?\n AND sequence_start <= ? AND sequence_end >= ?`,\n )\n .all(this.options.targetId, batch.producerId, batch.sequenceEnd, batch.sequenceStart);\n if (rows.length === 0) {\n return this.findPrunedReplayConflict(batch);\n }\n for (const row of rows) {\n const parsed = BatchAcknowledgementRowSchema.safeParse(row);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n const identical =\n parsed.data.idempotency_key === batch.idempotencyKey &&\n parsed.data.checksum === batch.checksum &&\n parsed.data.sequence_start === batch.sequenceStart &&\n parsed.data.sequence_end === batch.sequenceEnd;\n if (identical) {\n return {\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs: parsed.data.committed_at_ms,\n acceptedEvents: parsed.data.accepted_events,\n duplicate: true,\n targetStates: [this.committedTargetState(0)],\n };\n }\n }\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: 'Producer sequence range overlaps a different committed batch',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'sequence-range-conflict',\n },\n ],\n };\n }\n\n private outsideIngestionHorizon(\n batch: TelemetryBatch,\n ): TelemetryAcknowledgement | null {\n const cutoffMs = this.options.now() - this.longestRetentionMs();\n const containsExpiredEvent = batch.envelopes.some(\n (envelope) => envelope.occurredAtMs < cutoffMs,\n );\n if (!containsExpiredEvent) {\n return null;\n }\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'invalid-batch',\n reason: 'Telemetry batch is older than the configured ingestion horizon',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'batch-outside-ingestion-horizon',\n },\n ],\n };\n }\n\n private findPrunedReplayConflict(batch: TelemetryBatch): TelemetryAcknowledgement | null {\n const table = this.options.tableMap.quoted('ingestWatermarks');\n const row = this.options.connection\n .prepare(\n `SELECT highest_sequence\n FROM ${table}\n WHERE target_id = ? AND producer_id = ?`,\n )\n .get(this.options.targetId, batch.producerId);\n if (row === undefined) {\n return null;\n }\n const highestSequence = this.readNumberField(row, 'highest_sequence');\n if (batch.sequenceStart > highestSequence) {\n return null;\n }\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: 'Producer sequence range is at or below the durable ingest watermark',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'sequence-at-or-below-watermark',\n },\n ],\n };\n }\n\n private persistTransaction(request: StoragePersistRequest): TelemetryAcknowledgement {\n const committedAtMs = this.options.now();\n const transaction = this.options.connection.transaction(() => {\n this.insertRawEvents(request, committedAtMs);\n this.insertMetricSamples(request, committedAtMs);\n this.insertExtractionFailures(request, committedAtMs);\n this.upsertCommittedDropCounters(request.batch, committedAtMs);\n this.insertBatchAcknowledgement(request.batch, committedAtMs);\n this.updateIngestWatermark(request.batch, committedAtMs);\n });\n transaction();\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs,\n acceptedEvents: request.batch.envelopes.length,\n duplicate: false,\n targetStates: [this.committedTargetState(1)],\n };\n }\n\n private insertRawEvents(request: StoragePersistRequest, insertedAtMs: number): void {\n const table = this.options.tableMap.quoted('rawEvents');\n const insert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, producer_id, sequence, event_id, batch_idempotency_key,\n occurred_at_ms, monotonic_ns, source, process_kind, level, label,\n conversation_id, conversation_id_kind, correlation_id, metadata_json,\n schema_version, inserted_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const envelope of request.batch.envelopes) {\n const conversationId =\n envelope.conversationId === null ? null : String(envelope.conversationId);\n const conversationKind =\n envelope.conversationId === null ? null : typeof envelope.conversationId;\n insert.run(\n this.options.targetId,\n envelope.producerId,\n envelope.sequence,\n envelope.eventId,\n request.batch.idempotencyKey,\n envelope.occurredAtMs,\n envelope.monotonicNs,\n envelope.source,\n envelope.processKind,\n envelope.level,\n envelope.label,\n conversationId,\n conversationKind,\n envelope.correlationId,\n canonicalJson(envelope.metadata),\n envelope.schemaVersion,\n insertedAtMs,\n );\n }\n }\n\n private insertMetricSamples(request: StoragePersistRequest, _insertedAtMs: number): void {\n const samplesTable = this.options.tableMap.quoted('metricSamples');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const insert = this.options.connection.prepare(\n `INSERT INTO ${samplesTable} (\n target_id, metric_name, definition_version, occurred_at_ms,\n producer_id, sequence, dimension_key, dimensions_json, values_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n const invalidate = this.options.connection.prepare(\n `DELETE FROM ${completionTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n );\n for (const sample of request.samples) {\n insert.run(\n this.options.targetId,\n sample.metricName,\n sample.definitionVersion,\n sample.occurredAtMs,\n sample.producerId,\n sample.sequence,\n sample.dimensionKey,\n canonicalJson(sample.dimensions),\n canonicalJson(sample.values),\n );\n const definition = this.definitions.get(\n this.definitionKey(sample.metricName, sample.definitionVersion),\n );\n if (!definition) {\n throw new Error(\n `Missing registered metric definition ${sample.metricName}:${sample.definitionVersion}`,\n );\n }\n for (const resolutionMs of definition.resolutionsMs) {\n const bucketStartMs = this.bucketStart(sample.occurredAtMs, resolutionMs);\n invalidate.run(\n this.options.targetId,\n sample.metricName,\n sample.definitionVersion,\n resolutionMs,\n bucketStartMs,\n );\n }\n }\n }\n\n private insertExtractionFailures(request: StoragePersistRequest, recordedAtMs: number): void {\n const table = this.options.tableMap.quoted('extractionFailures');\n const insert = this.options.connection.prepare(\n `INSERT OR REPLACE INTO ${table} (\n target_id, metric_name, definition_version, producer_id,\n sequence, reason, recorded_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const failure of request.extractionFailures) {\n insert.run(\n this.options.targetId,\n failure.metricName,\n failure.definitionVersion,\n failure.producerId,\n failure.sequence,\n failure.reason.slice(0, 1_024),\n recordedAtMs,\n );\n }\n }\n\n private upsertCommittedDropCounters(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('committedDropCounters');\n const upsert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, reason, priority, count, first_committed_at_ms, last_committed_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, reason, priority) DO UPDATE SET\n count = MIN(9007199254740991, ${table}.count + excluded.count),\n first_committed_at_ms = MIN(\n ${table}.first_committed_at_ms,\n excluded.first_committed_at_ms\n ),\n last_committed_at_ms = MAX(\n ${table}.last_committed_at_ms,\n excluded.last_committed_at_ms\n )`,\n );\n for (const counter of batch.dropCounters) {\n if (!Number.isSafeInteger(counter.count) || counter.count <= 0) {\n throw new Error('Committed telemetry drop counters must be positive safe integers');\n }\n upsert.run(\n this.options.targetId,\n counter.reason,\n counter.priority,\n counter.count,\n committedAtMs,\n committedAtMs,\n );\n }\n }\n\n private insertBatchAcknowledgement(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('batchAcknowledgements');\n this.options.connection\n .prepare(\n `INSERT INTO ${table} (\n target_id, idempotency_key, producer_id, sequence_start, sequence_end,\n schema_version, checksum, accepted_events, committed_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n this.options.targetId,\n batch.idempotencyKey,\n batch.producerId,\n batch.sequenceStart,\n batch.sequenceEnd,\n batch.schemaVersion,\n batch.checksum,\n batch.envelopes.length,\n committedAtMs,\n );\n }\n\n private updateIngestWatermark(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('ingestWatermarks');\n const lastOccurredAtMs = Math.max(...batch.envelopes.map((envelope) => envelope.occurredAtMs));\n const internalGapCount = batch.sequenceEnd - batch.sequenceStart + 1 - batch.envelopes.length;\n const initialGapCount = batch.sequenceStart + internalGapCount;\n this.options.connection\n .prepare(\n `INSERT INTO ${table} (\n target_id, producer_id, highest_sequence, last_occurred_at_ms,\n last_committed_at_ms, observed_gap_count\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, producer_id) DO UPDATE SET\n observed_gap_count = ${table}.observed_gap_count\n + MAX(0, ? - ${table}.highest_sequence - 1)\n + ?,\n highest_sequence = MAX(${table}.highest_sequence, excluded.highest_sequence),\n last_occurred_at_ms = MAX(${table}.last_occurred_at_ms, excluded.last_occurred_at_ms),\n last_committed_at_ms = excluded.last_committed_at_ms`,\n )\n .run(\n this.options.targetId,\n batch.producerId,\n batch.sequenceEnd,\n lastOccurredAtMs,\n committedAtMs,\n initialGapCount,\n batch.sequenceStart,\n internalGapCount,\n );\n }\n\n private addTimelineFilters(query: TimelineQuery, clauses: string[], params: unknown[]): void {\n const filters: readonly [unknown, string, unknown][] = [\n [\n query.conversationId,\n 'conversation_id = ?',\n query.conversationId === null ? null : String(query.conversationId),\n ],\n [query.source, 'source = ?', query.source],\n [query.label, 'label = ?', query.label],\n [query.level, 'level = ?', query.level],\n [query.producerId, 'producer_id = ?', query.producerId],\n [query.correlationId, 'correlation_id = ?', query.correlationId],\n ];\n for (const [guard, clause, parameter] of filters) {\n if (guard !== null) {\n clauses.push(clause);\n params.push(parameter);\n }\n }\n }\n\n private addTimelineCursor(\n cursor: Readonly<{ occurredAtMs: number; producerId: string; sequence: number }>,\n order: 'asc' | 'desc',\n clauses: string[],\n params: unknown[],\n ): void {\n const comparison = order === 'asc' ? '>' : '<';\n clauses.push(`(\n occurred_at_ms ${comparison} ?\n OR (occurred_at_ms = ? AND producer_id ${comparison} ?)\n OR (occurred_at_ms = ? AND producer_id = ? AND sequence ${comparison} ?)\n )`);\n params.push(\n cursor.occurredAtMs,\n cursor.occurredAtMs,\n cursor.producerId,\n cursor.occurredAtMs,\n cursor.producerId,\n cursor.sequence,\n );\n }\n\n private findDueBucketStarts(\n definition: MetricDefinition,\n resolutionMs: number,\n dueBeforeMs: number,\n ): number[] {\n const sampleTable = this.options.tableMap.quoted('metricSamples');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const rows = this.options.connection\n .prepare(\n `WITH sample_buckets AS (\n SELECT\n CAST(occurred_at_ms / ? AS INTEGER) * ? AS bucket_start_ms,\n COUNT(*) AS sample_count,\n MAX(occurred_at_ms) AS sample_watermark_ms\n FROM ${sampleTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND occurred_at_ms < ?\n AND (CAST(occurred_at_ms / ? AS INTEGER) * ?) + ? <= ?\n GROUP BY bucket_start_ms\n )\n SELECT bucket.bucket_start_ms\n FROM sample_buckets AS bucket\n LEFT JOIN ${completionTable} AS completion\n ON completion.target_id = ?\n AND completion.metric_name = ?\n AND completion.definition_version = ?\n AND completion.resolution_ms = ?\n AND completion.bucket_start_ms = bucket.bucket_start_ms\n WHERE completion.bucket_start_ms IS NULL\n OR completion.sample_count <> bucket.sample_count\n OR completion.sample_watermark_ms <> bucket.sample_watermark_ms\n ORDER BY bucket.bucket_start_ms ASC\n LIMIT 256`,\n )\n .all(\n resolutionMs,\n resolutionMs,\n this.options.targetId,\n definition.name,\n definition.version,\n dueBeforeMs,\n resolutionMs,\n resolutionMs,\n resolutionMs,\n dueBeforeMs,\n this.options.targetId,\n definition.name,\n definition.version,\n resolutionMs,\n );\n return rows.map((row) => this.readNumberField(row, 'bucket_start_ms'));\n }\n\n private loadBucketWork(\n definition: MetricDefinition,\n resolutionMs: number,\n bucketStartMs: number,\n ): MetricBucketWork {\n const table = this.options.tableMap.quoted('metricSamples');\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND occurred_at_ms >= ? AND occurred_at_ms < ?\n ORDER BY occurred_at_ms ASC, producer_id ASC, sequence ASC`,\n )\n .all(\n this.options.targetId,\n definition.name,\n definition.version,\n bucketStartMs,\n bucketStartMs + resolutionMs,\n );\n const samples = rows.map((row) => {\n const parsed = this.rowParser.parseMetricSample(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n return { definition, resolutionMs, bucketStartMs, samples };\n }\n\n private bucketIsCurrent(work: MetricBucketWork): boolean {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const row = this.options.connection\n .prepare(\n `SELECT sample_count, sample_watermark_ms\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n )\n .get(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n if (row === undefined) {\n return false;\n }\n const sampleCount = this.readNumberField(row, 'sample_count');\n const watermark = this.readNumberField(row, 'sample_watermark_ms');\n return sampleCount === work.samples.length && watermark === this.sampleWatermark(work);\n }\n\n private sampleWatermark(work: MetricBucketWork): number {\n return work.samples.length === 0\n ? work.bucketStartMs\n : Math.max(...work.samples.map((sample) => sample.occurred_at_ms));\n }\n\n private materializeBucket(work: MetricBucketWork, materializedAtMs: number): number {\n const normalized = this.normalizeSamplesForCardinality(work);\n const groups = this.aggregateSamples(work.definition.measurements, normalized);\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const transaction = this.options.connection.transaction(() => {\n this.options.connection\n .prepare(\n `DELETE FROM ${rollupTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n )\n .run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n const insert = this.options.connection.prepare(\n `INSERT INTO ${rollupTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, dimension_key, dimensions_json, values_json,\n materialized_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const [dimensionKey, group] of groups) {\n insert.run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n dimensionKey,\n group.dimensionsJson,\n canonicalJson(group.values),\n materializedAtMs,\n );\n }\n this.options.connection\n .prepare(\n `INSERT INTO ${completionTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, sample_count, sample_watermark_ms, completed_at_ms,\n state, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'completed', NULL)\n ON CONFLICT(\n target_id, metric_name, definition_version, resolution_ms, bucket_start_ms\n ) DO UPDATE SET\n sample_count = excluded.sample_count,\n sample_watermark_ms = excluded.sample_watermark_ms,\n completed_at_ms = excluded.completed_at_ms,\n state = 'completed',\n detail = NULL`,\n )\n .run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n work.samples.length,\n this.sampleWatermark(work),\n materializedAtMs,\n );\n });\n transaction();\n return groups.size;\n }\n\n private recordRejectedBucket(\n work: MetricBucketWork,\n recordedAtMs: number,\n detail: string,\n ): void {\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const transaction = this.options.connection.transaction(() => {\n this.options.connection.prepare(\n `DELETE FROM ${rollupTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n ).run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n this.options.connection.prepare(\n `INSERT INTO ${completionTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, sample_count, sample_watermark_ms, completed_at_ms,\n state, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'rejected', ?)\n ON CONFLICT(\n target_id, metric_name, definition_version, resolution_ms, bucket_start_ms\n ) DO UPDATE SET\n sample_count = excluded.sample_count,\n sample_watermark_ms = excluded.sample_watermark_ms,\n completed_at_ms = excluded.completed_at_ms,\n state = 'rejected',\n detail = excluded.detail`,\n ).run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n work.samples.length,\n this.sampleWatermark(work),\n recordedAtMs,\n detail.slice(0, 1_024),\n );\n });\n transaction();\n }\n\n private rollupStageDetail(\n rejectedBucketCount: number,\n examples: readonly string[],\n workBudgetReached: boolean,\n ): string | null {\n const rejected = rejectedBucketCount === 0\n ? null\n : `cardinality-rejected-buckets=${rejectedBucketCount}; ${examples.join('; ')}`;\n const detail = workBudgetReached\n ? ['work-budget-reached', rejected].filter((value) => value !== null).join('; ')\n : rejected;\n return detail?.slice(0, 2_048) ?? null;\n }\n\n private normalizeSamplesForCardinality(work: MetricBucketWork): NormalizedMetricSample[] {\n const admittedByField = new Map<string, Set<string>>();\n const normalized: NormalizedMetricSample[] = [];\n for (const sample of work.samples) {\n const dimensions = this.rowParser.parseJsonObject(sample.dimensions_json);\n const values = this.rowParser.parseNumericValues(sample.values_json);\n if (!dimensions.ok) {\n throw new Error(dimensions.error);\n }\n if (!values.ok) {\n throw new Error(values.error);\n }\n const admittedDimensions: Record<string, TelemetryJsonValue> = { ...dimensions.value };\n let dropSample = false;\n for (const field of work.definition.groupBy) {\n const rule = work.definition.cardinality[field];\n if (!rule) {\n throw new Error(`Missing cardinality rule for ${field}`);\n }\n const dimensionValue = admittedDimensions[field];\n const valueKey = canonicalJson(dimensionValue);\n const admittedValues = admittedByField.get(field) ?? new Set<string>();\n if (!admittedValues.has(valueKey) && admittedValues.size >= rule.maxValuesPerBucket) {\n if (rule.overflow === 'other') {\n admittedDimensions[field] = '__telemetry_other__';\n } else if (rule.overflow === 'reject') {\n throw new MetricCardinalityRejectionError(\n `Metric ${work.definition.name} rejected cardinality overflow for ${field}`,\n );\n } else {\n dropSample = true;\n break;\n }\n } else {\n admittedValues.add(valueKey);\n admittedByField.set(field, admittedValues);\n }\n }\n if (dropSample) {\n continue;\n }\n const dimensionsJson = canonicalJson(admittedDimensions);\n normalized.push({\n dimensionKey: dimensionsJson,\n dimensionsJson,\n values: values.value,\n occurredAtMs: sample.occurred_at_ms,\n producerId: sample.producer_id,\n sequence: sample.sequence,\n });\n }\n return normalized;\n }\n\n private aggregateSamples(\n measurements: readonly MetricMeasurement[],\n samples: readonly NormalizedMetricSample[],\n ): Map<string, MutableMaterializedMetricGroup> {\n const groups = new Map<string, MutableMaterializedMetricGroup>();\n const fields = measurements\n .filter((measurement): measurement is Extract<MetricMeasurement, { kind: 'field' }> => {\n return measurement.kind === 'field';\n })\n .map((measurement) => measurement.field);\n for (const sample of samples) {\n const group = groups.get(sample.dimensionKey) ?? {\n dimensionsJson: sample.dimensionsJson,\n values: { count: 0, fields: {} },\n };\n group.values.count += 1;\n for (const field of fields) {\n const measured = sample.values[field];\n if (measured === undefined) {\n continue;\n }\n const aggregate = group.values.fields[field] ?? this.newFieldAggregate(measured, sample);\n aggregate.count += group.values.fields[field] === undefined ? 0 : 1;\n aggregate.sum += group.values.fields[field] === undefined ? 0 : measured;\n aggregate.min = Math.min(aggregate.min, measured);\n aggregate.max = Math.max(aggregate.max, measured);\n aggregate.last = measured;\n aggregate.lastOccurredAtMs = sample.occurredAtMs;\n aggregate.lastProducerId = sample.producerId;\n aggregate.lastSequence = sample.sequence;\n group.values.fields[field] = aggregate;\n }\n groups.set(sample.dimensionKey, group);\n }\n return groups;\n }\n\n private newFieldAggregate(\n measured: number,\n sample: NormalizedMetricSample,\n ): MutableMetricFieldAggregate {\n return {\n count: 1,\n sum: measured,\n min: measured,\n max: measured,\n last: measured,\n lastOccurredAtMs: sample.occurredAtMs,\n lastProducerId: sample.producerId,\n lastSequence: sample.sequence,\n };\n }\n\n /**\n * Raw retention is purely time-based, matching the native collector: every\n * expired row goes in one set-based statement per level band. No page size,\n * no row cap, and no rollup-completion gate — metric samples are extracted at\n * ingest and retained on their own clock, so dropping a raw row costs no\n * metric fidelity, and no row can outlive its window waiting on a rollup.\n */\n private createRawEventRetentionStep(nowMs: number): RetentionStep {\n const table = this.options.tableMap.quoted('rawEvents');\n const levelMs = this.options.retention.levelMs ?? {};\n const levels = Object.keys(levelMs);\n const removeByLevel = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND lower(coalesce(level, '')) = ? AND occurred_at_ms < ?`,\n );\n const fallbackPlaceholders = levels.map(() => '?').join(', ');\n const removeFallback = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?` +\n (levels.length === 0\n ? ''\n : ` AND lower(coalesce(level, '')) NOT IN (${fallbackPlaceholders})`),\n );\n let done = false;\n return (): RetentionStepOutcome => {\n if (done) {\n return { deleted: 0, done: true };\n }\n done = true;\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const level of levels) {\n const retainMs = levelMs[level];\n if (retainMs === undefined) {\n continue;\n }\n deleted += removeByLevel.run(this.options.targetId, level, nowMs - retainMs).changes;\n }\n deleted += removeFallback.run(\n this.options.targetId,\n nowMs - this.options.retention.rawMs,\n ...levels,\n ).changes;\n return deleted;\n });\n return { deleted: transaction(), done: true };\n };\n }\n\n private rawEventHasRequiredRollups(envelope: TelemetryEnvelope): boolean {\n const applicable = [...this.definitions.values()].filter((definition) => {\n return this.definitionContract.matches(definition.selector, envelope.label);\n });\n return applicable.every((definition) => {\n if (!this.metricSampleExists(definition, envelope)) {\n return true;\n }\n return definition.resolutionsMs.every((resolutionMs) => {\n return this.hasCompletion(\n definition.name,\n definition.version,\n resolutionMs,\n this.bucketStart(envelope.occurredAtMs, resolutionMs),\n );\n });\n });\n }\n\n private metricSampleExists(definition: MetricDefinition, envelope: TelemetryEnvelope): boolean {\n const table = this.options.tableMap.quoted('metricSamples');\n const row = this.options.connection\n .prepare(\n `SELECT 1 AS present\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND producer_id = ? AND sequence = ?`,\n )\n .get(\n this.options.targetId,\n definition.name,\n definition.version,\n envelope.producerId,\n envelope.sequence,\n );\n return row !== undefined;\n }\n\n private createSampleRetentionStep(nowMs: number): RetentionStep {\n const cutoffMs = nowMs - this.options.retention.samplesMs;\n const table = this.options.tableMap.quoted('metricSamples');\n const readFirstPage = this.options.connection.prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?\n ORDER BY occurred_at_ms ASC, metric_name ASC, definition_version ASC,\n producer_id ASC, sequence ASC\n LIMIT ${RETENTION_PAGE_SIZE}`,\n );\n const readNextPage = this.options.connection.prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?\n AND (\n occurred_at_ms, metric_name, definition_version, producer_id, sequence\n ) > (?, ?, ?, ?, ?)\n ORDER BY occurred_at_ms ASC, metric_name ASC, definition_version ASC,\n producer_id ASC, sequence ASC\n LIMIT ${RETENTION_PAGE_SIZE}`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND producer_id = ? AND sequence = ?`,\n );\n let cursor: SampleRetentionCursor | null = null;\n return (): RetentionStepOutcome => {\n const rows: unknown[] = cursor === null\n ? readFirstPage.all(this.options.targetId, cutoffMs)\n : readNextPage.all(\n this.options.targetId,\n cutoffMs,\n cursor.occurredAtMs,\n cursor.metricName,\n cursor.definitionVersion,\n cursor.producerId,\n cursor.sequence,\n );\n if (rows.length === 0) {\n return { deleted: 0, done: true };\n }\n const samples: MetricSampleRow[] = rows.map((row) => {\n const parsed = this.rowParser.parseMetricSample(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const sample of samples) {\n const definition = this.definitions.get(\n this.definitionKey(sample.metric_name, sample.definition_version),\n );\n if (!definition) {\n continue;\n }\n const complete = definition.resolutionsMs.every((resolutionMs) => {\n return this.hasCompletion(\n definition.name,\n definition.version,\n resolutionMs,\n this.bucketStart(sample.occurred_at_ms, resolutionMs),\n );\n });\n if (complete) {\n deleted += remove.run(\n this.options.targetId,\n sample.metric_name,\n sample.definition_version,\n sample.producer_id,\n sample.sequence,\n ).changes;\n }\n }\n return deleted;\n });\n const deleted = transaction();\n const last = samples[samples.length - 1];\n if (last === undefined || rows.length < RETENTION_PAGE_SIZE) {\n return { deleted, done: true };\n }\n cursor = {\n occurredAtMs: last.occurred_at_ms,\n metricName: last.metric_name,\n definitionVersion: last.definition_version,\n producerId: last.producer_id,\n sequence: last.sequence,\n };\n return { deleted, done: false };\n };\n }\n\n private createRollupRetentionSteps(nowMs: number): RetentionStep[] {\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const steps: RetentionStep[] = [];\n for (const tier of this.options.retention.rollups) {\n const cutoffMs = nowMs - tier.retainMs;\n steps.push(this.createExpiredRollupStep(rollupTable, tier.resolutionMs, cutoffMs, false));\n steps.push(this.createExpiredRollupStep(completionTable, tier.resolutionMs, cutoffMs, true));\n }\n return steps;\n }\n\n private createExpiredRollupStep(\n table: string,\n resolutionMs: number,\n cutoffMs: number,\n completedOnly: boolean,\n ): RetentionStep {\n const statePredicate = completedOnly ? \" AND state = 'completed'\" : '';\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND resolution_ms = ? AND bucket_start_ms < ?${statePredicate}\n ORDER BY bucket_start_ms ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, resolutionMs, cutoffMs).changes,\n );\n }\n\n private createPagedDeleteStep(deletePage: () => number): RetentionStep {\n return (): RetentionStepOutcome => {\n const changes = deletePage();\n return { deleted: changes, done: changes < RETENTION_PAGE_SIZE };\n };\n }\n\n private createAuxiliaryRetentionSteps(nowMs: number): RetentionStep[] {\n const acknowledgementCutoffMs = nowMs - this.acknowledgementRetentionMs();\n const ingestionCutoffMs = nowMs - this.longestRetentionMs();\n const extractionCutoffMs = nowMs - this.options.retention.samplesMs;\n return [\n this.createRowsBeforeStep('batchAcknowledgements', 'committed_at_ms', acknowledgementCutoffMs),\n this.createRowsBeforeStep('extractionFailures', 'recorded_at_ms', extractionCutoffMs),\n this.createFinishedMaintenanceRunStep(acknowledgementCutoffMs),\n ...this.createReaderLeaseSteps(nowMs),\n this.createStaleIngestWatermarkStep(ingestionCutoffMs),\n this.createUnreferencedMetricDefinitionStep(),\n ];\n }\n\n private createRowsBeforeStep(\n logicalTable: 'batchAcknowledgements' | 'extractionFailures',\n timestampColumn: 'committed_at_ms' | 'recorded_at_ms',\n cutoffMs: number,\n ): RetentionStep {\n const table = this.options.tableMap.quoted(logicalTable);\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND ${timestampColumn} < ?\n ORDER BY ${timestampColumn} ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs).changes,\n );\n }\n\n private createFinishedMaintenanceRunStep(cutoffMs: number): RetentionStep {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state IN ('completed', 'failed')\n AND COALESCE(completed_at_ms, started_at_ms) < ?\n ORDER BY COALESCE(completed_at_ms, started_at_ms) ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs).changes,\n );\n }\n\n private createReaderLeaseSteps(nowMs: number): RetentionStep[] {\n const table = this.options.tableMap.quoted('readerLeases');\n const expire = this.options.connection.prepare(\n `UPDATE ${table}\n SET state = 'expired'\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state = 'active' AND expires_at_ms <= ?\n ORDER BY expires_at_ms ASC\n LIMIT 500\n )`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state IN ('released', 'expired')\n AND expires_at_ms <= ?\n ORDER BY expires_at_ms ASC\n LIMIT 500\n )`,\n );\n return [\n this.createPagedDeleteStep(() => expire.run(this.options.targetId, nowMs).changes),\n this.createPagedDeleteStep(() => remove.run(this.options.targetId, nowMs).changes),\n ];\n }\n\n private createStaleIngestWatermarkStep(cutoffMs: number): RetentionStep {\n const watermarks = this.options.tableMap.quoted('ingestWatermarks');\n const acknowledgements = this.options.tableMap.quoted('batchAcknowledgements');\n const rawEvents = this.options.tableMap.quoted('rawEvents');\n const samples = this.options.tableMap.quoted('metricSamples');\n const failures = this.options.tableMap.quoted('extractionFailures');\n const remove = this.options.connection.prepare(\n `DELETE FROM ${watermarks}\n WHERE rowid IN (\n SELECT watermark.rowid\n FROM ${watermarks} AS watermark\n WHERE watermark.target_id = ?\n AND watermark.last_occurred_at_ms < ?\n AND watermark.last_committed_at_ms < ?\n AND NOT EXISTS (\n SELECT 1 FROM ${acknowledgements} AS acknowledgement\n WHERE acknowledgement.target_id = watermark.target_id\n AND acknowledgement.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${rawEvents} AS raw_event\n WHERE raw_event.target_id = watermark.target_id\n AND raw_event.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${samples} AS sample\n WHERE sample.target_id = watermark.target_id\n AND sample.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${failures} AS failure\n WHERE failure.target_id = watermark.target_id\n AND failure.producer_id = watermark.producer_id\n )\n ORDER BY watermark.last_committed_at_ms ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs, cutoffMs).changes,\n );\n }\n\n private createUnreferencedMetricDefinitionStep(): RetentionStep {\n const definitions = this.options.tableMap.quoted('metricDefinitions');\n const samples = this.options.tableMap.quoted('metricSamples');\n const rollups = this.options.tableMap.quoted('metricRollups');\n const completions = this.options.tableMap.quoted('rollupCompletions');\n const failures = this.options.tableMap.quoted('extractionFailures');\n const read = this.options.connection.prepare(\n `SELECT definition.metric_name, definition.definition_version\n FROM ${definitions} AS definition\n WHERE definition.target_id = ? AND definition.active = 0\n AND NOT EXISTS (\n SELECT 1 FROM ${samples} AS sample\n WHERE sample.target_id = definition.target_id\n AND sample.metric_name = definition.metric_name\n AND sample.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${rollups} AS rollup\n WHERE rollup.target_id = definition.target_id\n AND rollup.metric_name = definition.metric_name\n AND rollup.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${completions} AS completion\n WHERE completion.target_id = definition.target_id\n AND completion.metric_name = definition.metric_name\n AND completion.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${failures} AS failure\n WHERE failure.target_id = definition.target_id\n AND failure.metric_name = definition.metric_name\n AND failure.definition_version = definition.definition_version\n )\n ORDER BY definition.registered_at_ms ASC\n LIMIT 500`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${definitions}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ? AND active = 0`,\n );\n return (): RetentionStepOutcome => {\n const rows = read.all(this.options.targetId).map((row) => ({\n metricName: this.readStringField(row, 'metric_name'),\n definitionVersion: this.readNumberField(row, 'definition_version'),\n }));\n if (rows.length === 0) {\n return { deleted: 0, done: true };\n }\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const row of rows) {\n deleted += remove.run(\n this.options.targetId,\n row.metricName,\n row.definitionVersion,\n ).changes;\n }\n return deleted;\n });\n const deleted = transaction();\n for (const row of rows) {\n this.definitions.delete(this.definitionKey(row.metricName, row.definitionVersion));\n }\n return { deleted, done: deleted === 0 || rows.length < RETENTION_PAGE_SIZE };\n };\n }\n\n private acknowledgementRetentionMs(): number {\n return this.options.retention.rawMs + this.options.retention.lateArrivalMs;\n }\n\n private longestRetentionMs(): number {\n return Math.max(\n this.options.retention.rawMs,\n this.options.retention.samplesMs,\n ...this.options.retention.rollups.map((tier) => tier.retainMs),\n );\n }\n\n private hasCompletion(\n metricName: string,\n definitionVersion: number,\n resolutionMs: number,\n bucketStartMs: number,\n ): boolean {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const row = this.options.connection\n .prepare(\n `SELECT 1 AS present FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?\n AND state = 'completed'`,\n )\n .get(this.options.targetId, metricName, definitionVersion, resolutionMs, bucketStartMs);\n return row !== undefined;\n }\n\n private metricDefinitions(metricName: string): MetricDefinition[] {\n return [...this.definitions.values()]\n .filter((definition) => definition.name === metricName)\n .sort((left, right) => left.version - right.version);\n }\n\n private validateMetricQuery(\n query: MetricQuery,\n definitions: readonly MetricDefinition[],\n ): string | null {\n const dimensionSets = definitions.map((definition) => new Set(definition.groupBy));\n const invalidDimension = Object.keys(query.where).find((field) => {\n return dimensionSets.some((dimensions) => !dimensions.has(field));\n });\n if (invalidDimension) {\n return `Metric ${query.metric} does not declare dimension ${invalidDimension}`;\n }\n if (query.resolution !== 'auto') {\n const explicitResolution = query.resolution;\n const unavailable = definitions.every(\n (definition) => !definition.resolutionsMs.includes(explicitResolution),\n );\n if (unavailable) {\n return `Resolution ${query.resolution} is not configured for metric ${query.metric}`;\n }\n }\n const invalidMeasurement = query.measurements.find((measurement) => {\n return definitions.some((definition) =>\n !this.definitionHasMeasurement(definition, measurement),\n );\n });\n return invalidMeasurement\n ? `Metric ${query.metric} does not declare measurement ${invalidMeasurement}`\n : null;\n }\n\n private definitionHasMeasurement(definition: MetricDefinition, requested: string): boolean {\n if (requested === 'count') {\n return definition.measurements.some((measurement) => measurement.kind === 'count');\n }\n const [field, aggregate] = requested.split('.');\n if (!field || !aggregate) {\n return false;\n }\n return definition.measurements.some((measurement) => {\n return (\n measurement.kind === 'field' &&\n measurement.field === field &&\n ((aggregate === 'avg' && measurement.aggregates.includes('sum')) ||\n (this.isMetricAggregate(aggregate) && measurement.aggregates.includes(aggregate)))\n );\n });\n }\n\n private planCoverage(\n query: MetricQuery,\n definitions: readonly MetricDefinition[],\n ): Readonly<{\n intervals: readonly RollupCoverageInterval[];\n gaps: readonly MetricQueryGap[];\n }> {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const rows = this.options.connection\n .prepare(\n `SELECT definition_version, resolution_ms, bucket_start_ms\n FROM ${table}\n WHERE target_id = ? AND metric_name = ?\n AND state = 'completed'\n AND bucket_start_ms < ?\n AND bucket_start_ms + resolution_ms > ?\n ORDER BY bucket_start_ms ASC, resolution_ms ASC, definition_version DESC`,\n )\n .all(this.options.targetId, query.metric, query.toMs, query.fromMs);\n const definitionVersions = new Set(definitions.map((definition) => definition.version));\n const available = rows\n .map((row) => ({\n fromMs: this.readNumberField(row, 'bucket_start_ms'),\n toMs:\n this.readNumberField(row, 'bucket_start_ms') +\n this.readNumberField(row, 'resolution_ms'),\n definitionVersion: this.readNumberField(row, 'definition_version'),\n resolutionMs: this.readNumberField(row, 'resolution_ms'),\n }))\n .filter((row) => {\n return (\n definitionVersions.has(row.definitionVersion) &&\n (query.resolution === 'auto' || row.resolutionMs === query.resolution)\n );\n });\n const intervals: RollupCoverageInterval[] = [];\n for (const definition of definitions) {\n const versionCandidates = available.filter(\n (candidate) => candidate.definitionVersion === definition.version,\n );\n intervals.push(...this.planDefinitionCoverage(query, versionCandidates));\n }\n const orderedIntervals = intervals.sort((left, right) => {\n return (\n left.fromMs - right.fromMs ||\n left.definitionVersion - right.definitionVersion ||\n left.resolutionMs - right.resolutionMs\n );\n });\n return {\n intervals: orderedIntervals,\n gaps: this.coverageGaps(query, orderedIntervals, available),\n };\n }\n\n private planDefinitionCoverage(\n query: MetricQuery,\n candidates: readonly RollupCoverageInterval[],\n ): readonly RollupCoverageInterval[] {\n const contained = candidates.filter((candidate) => {\n return candidate.fromMs >= query.fromMs && candidate.toMs <= query.toMs;\n });\n const intervals: RollupCoverageInterval[] = [];\n let cursor = query.fromMs;\n while (cursor < query.toMs) {\n const starting = contained\n .filter((candidate) => candidate.fromMs === cursor)\n .sort((left, right) => left.resolutionMs - right.resolutionMs);\n const chosen = starting[0];\n if (chosen) {\n this.appendCoverageInterval(intervals, chosen);\n cursor = chosen.toMs;\n continue;\n }\n const nextStart = contained\n .map((candidate) => candidate.fromMs)\n .filter((startMs) => startMs > cursor)\n .sort((left, right) => left - right)[0];\n cursor = nextStart ?? query.toMs;\n }\n return intervals;\n }\n\n private appendCoverageInterval(\n intervals: RollupCoverageInterval[],\n candidate: RollupCoverageInterval,\n ): void {\n const previous = intervals[intervals.length - 1];\n const extendsPrevious =\n previous !== undefined &&\n previous.toMs === candidate.fromMs &&\n previous.resolutionMs === candidate.resolutionMs &&\n previous.definitionVersion === candidate.definitionVersion;\n if (extendsPrevious) {\n intervals[intervals.length - 1] = { ...previous, toMs: candidate.toMs };\n return;\n }\n intervals.push(candidate);\n }\n\n private coverageGaps(\n query: MetricQuery,\n intervals: readonly RollupCoverageInterval[],\n candidates: readonly RollupCoverageInterval[],\n ): readonly MetricQueryGap[] {\n const coverage = [...intervals].sort(\n (left, right) => left.fromMs - right.fromMs || right.toMs - left.toMs,\n );\n const gaps: MetricQueryGap[] = [];\n let cursor = query.fromMs;\n for (const interval of coverage) {\n if (interval.fromMs > cursor) {\n this.appendSplitCoverageGaps(gaps, cursor, interval.fromMs, query, candidates);\n }\n cursor = Math.max(cursor, interval.toMs);\n }\n if (cursor < query.toMs) {\n this.appendSplitCoverageGaps(gaps, cursor, query.toMs, query, candidates);\n }\n return Object.freeze(gaps);\n }\n\n private appendSplitCoverageGaps(\n gaps: MetricQueryGap[],\n fromMs: number,\n toMs: number,\n query: MetricQuery,\n candidates: readonly RollupCoverageInterval[],\n ): void {\n const partialCandidates = candidates.filter((candidate) => {\n const outsideQuery = candidate.fromMs < query.fromMs || candidate.toMs > query.toMs;\n return outsideQuery && candidate.fromMs < toMs && candidate.toMs > fromMs;\n });\n const boundaries = new Set<number>([fromMs, toMs]);\n for (const candidate of partialCandidates) {\n boundaries.add(Math.max(fromMs, candidate.fromMs));\n boundaries.add(Math.min(toMs, candidate.toMs));\n }\n const ordered = [...boundaries].sort((left, right) => left - right);\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const gapStart = ordered[index];\n const gapEnd = ordered[index + 1];\n if (gapStart === undefined || gapEnd === undefined || gapStart >= gapEnd) {\n continue;\n }\n const isPartialBucket = partialCandidates.some((candidate) => {\n return candidate.fromMs < gapEnd && candidate.toMs > gapStart;\n });\n this.appendMetricGap(gaps, {\n fromMs: gapStart,\n toMs: gapEnd,\n reason: isPartialBucket ? 'partial-bucket' : 'not-materialized',\n });\n }\n }\n\n private appendMetricGap(gaps: MetricQueryGap[], gap: MetricQueryGap): void {\n const previous = gaps[gaps.length - 1];\n if (previous && previous.toMs === gap.fromMs && previous.reason === gap.reason) {\n gaps[gaps.length - 1] = { ...previous, toMs: gap.toMs };\n return;\n }\n gaps.push(gap);\n }\n\n private readRollupsForCoverage(\n query: MetricQuery,\n intervals: readonly RollupCoverageInterval[],\n ): Array<\n Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>\n > {\n const table = this.options.tableMap.quoted('metricRollups');\n const parsedRows = [];\n for (const interval of intervals) {\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, resolution_ms, bucket_start_ms,\n dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms >= ?\n AND bucket_start_ms + resolution_ms <= ?`,\n )\n .all(\n this.options.targetId,\n query.metric,\n interval.definitionVersion,\n interval.resolutionMs,\n interval.fromMs,\n interval.toMs,\n );\n for (const row of rows) {\n const parsed = this.rowParser.parseMetricRollup(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n const dimensions = this.rowParser.parseJsonObject(parsed.value.dimensions_json);\n const values = this.rowParser.parseRollupValues(parsed.value.values_json);\n if (!dimensions.ok) {\n throw new Error(dimensions.error);\n }\n if (!values.ok) {\n throw new Error(values.error);\n }\n parsedRows.push({\n bucket: {\n startMs: parsed.value.bucket_start_ms,\n endMs: parsed.value.bucket_start_ms + parsed.value.resolution_ms,\n dimensions: dimensions.value,\n values: this.rollupValuesToJson(values.value),\n },\n resolutionMs: parsed.value.resolution_ms,\n definitionVersion: parsed.value.definition_version,\n dimensionKey: parsed.value.dimension_key,\n });\n }\n }\n return parsedRows;\n }\n\n private rollupValuesToJson(values: MetricRollupValues): TelemetryJsonObject {\n const fields: Record<string, TelemetryJsonValue> = {};\n for (const [field, aggregate] of Object.entries(values.fields)) {\n fields[field] = {\n count: aggregate.count,\n sum: aggregate.sum,\n min: aggregate.min,\n max: aggregate.max,\n last: aggregate.last,\n avg: aggregate.count === 0 ? 0 : aggregate.sum / aggregate.count,\n };\n }\n return Object.freeze({ count: values.count, ...fields });\n }\n\n private selectMeasurements(\n values: TelemetryJsonObject,\n measurements: readonly string[],\n ): TelemetryJsonObject {\n const selected: Record<string, TelemetryJsonValue> = {};\n for (const measurement of measurements) {\n if (measurement === 'count') {\n selected.count = values.count ?? 0;\n continue;\n }\n const [field, aggregate] = measurement.split('.');\n const fieldValues = field ? values[field] : null;\n if (!field || !aggregate) {\n continue;\n }\n if (!this.isJsonObject(fieldValues)) {\n continue;\n }\n const existing = selected[field];\n const selectedField: Record<string, TelemetryJsonValue> = this.isJsonObject(existing)\n ? { ...existing }\n : {};\n const aggregateValue = fieldValues[aggregate];\n if (aggregateValue !== undefined) {\n selectedField[aggregate] = aggregateValue;\n }\n selected[field] = selectedField;\n }\n return Object.freeze(selected);\n }\n\n private matchesWhere(\n dimensions: TelemetryJsonObject,\n where: Readonly<Record<string, MetricDimensionFilter>>,\n ): boolean {\n return Object.entries(where).every(([field, expected]) => {\n const actual = dimensions[field];\n const candidates = Array.isArray(expected) ? expected : [expected];\n return candidates.some((candidate) => canonicalJson(candidate) === canonicalJson(actual));\n });\n }\n\n private compareParsedRollups(\n left: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n right: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n order: 'asc' | 'desc',\n ): number {\n const direction = order === 'asc' ? 1 : -1;\n return (\n direction *\n this.compareRollupIdentity(\n left.bucket.startMs,\n left.resolutionMs,\n left.definitionVersion,\n left.dimensionKey,\n right.bucket.startMs,\n right.resolutionMs,\n right.definitionVersion,\n right.dimensionKey,\n )\n );\n }\n\n private isAfterMetricCursor(\n row: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n cursor: Readonly<{\n bucketStartMs: number;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n order: 'asc' | 'desc',\n ): boolean {\n const comparison = this.compareRollupIdentity(\n row.bucket.startMs,\n row.resolutionMs,\n row.definitionVersion,\n row.dimensionKey,\n cursor.bucketStartMs,\n cursor.resolutionMs,\n cursor.definitionVersion,\n cursor.dimensionKey,\n );\n return order === 'asc' ? comparison > 0 : comparison < 0;\n }\n\n private compareRollupIdentity(\n leftStartMs: number,\n leftResolutionMs: number,\n leftDefinitionVersion: number,\n leftDimensionKey: string,\n rightStartMs: number,\n rightResolutionMs: number,\n rightDefinitionVersion: number,\n rightDimensionKey: string,\n ): number {\n return (\n leftStartMs - rightStartMs ||\n leftResolutionMs - rightResolutionMs ||\n leftDefinitionVersion - rightDefinitionVersion ||\n leftDimensionKey.localeCompare(rightDimensionKey)\n );\n }\n\n private rowsToSegments(\n intervals: readonly RollupCoverageInterval[],\n rows: readonly Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>[],\n ): readonly MetricQuerySegment[] {\n return Object.freeze(\n intervals.map((interval) => ({\n fromMs: interval.fromMs,\n toMs: interval.toMs,\n resolutionMs: interval.resolutionMs,\n isAggregated: true as const,\n definitionVersion: interval.definitionVersion,\n buckets: Object.freeze(\n rows\n .filter(\n (row) =>\n row.resolutionMs === interval.resolutionMs &&\n row.definitionVersion === interval.definitionVersion &&\n row.bucket.startMs >= interval.fromMs &&\n row.bucket.endMs <= interval.toMs,\n )\n .map((row) => row.bucket),\n ),\n })),\n );\n }\n\n private committedTargetState(attempts: number): TelemetryAcknowledgement['targetStates'][number] {\n return {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'committed',\n attempts,\n reason: null,\n };\n }\n\n private definitionKey(name: string, version: number): string {\n return `${name}:${version}`;\n }\n\n private normalizeDefinitions(\n definitions: readonly MetricDefinition[],\n ): readonly MetricDefinition[] {\n return definitions.map((definition) => {\n const normalized = this.definitionContract.normalize(definition);\n if (!normalized.ok) {\n throw new Error(normalized.error);\n }\n return normalized.value;\n });\n }\n\n private bucketStart(occurredAtMs: number, resolutionMs: number): number {\n return Math.floor(occurredAtMs / resolutionMs) * resolutionMs;\n }\n\n private encodeCursor(cursor: object): string {\n return Buffer.from(canonicalJson(cursor), 'utf8').toString('base64url');\n }\n\n private readStringField(row: unknown, field: string): string {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error(`Expected a SQLite row while reading ${field}`);\n }\n const value = Reflect.get(row, field);\n if (typeof value !== 'string') {\n throw new Error(`Expected string field ${field}`);\n }\n return value;\n }\n\n private readNumberField(row: unknown, field: string): number {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error(`Expected a SQLite row while reading ${field}`);\n }\n const value = Reflect.get(row, field);\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Expected numeric field ${field}`);\n }\n return value;\n }\n\n private parseCommittedDropCounter(row: unknown): TelemetryDropCounter {\n const reason = this.readStringField(row, 'reason');\n const priority = this.readStringField(row, 'priority');\n const count = this.readNumberField(row, 'count');\n if (!this.isDropReason(reason) || !this.isDropPriority(priority)) {\n throw new Error('Stored committed telemetry drop counter identity is invalid');\n }\n if (!Number.isSafeInteger(count) || count < 0) {\n throw new Error('Stored committed telemetry drop counter value is invalid');\n }\n return Object.freeze({ reason, priority, count });\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n\n private isJsonObject(value: TelemetryJsonValue | undefined): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private isMetricAggregate(value: string): value is MetricAggregate {\n return value === 'sum' || value === 'min' || value === 'max' || value === 'last';\n }\n\n private isDropReason(value: string): value is TelemetryDropCounter['reason'] {\n return (\n value === 'capacity' ||\n value === 'sampled' ||\n value === 'stopped' ||\n value === 'invalid' ||\n value === 'transport'\n );\n }\n\n private isDropPriority(value: string): value is TelemetryDropCounter['priority'] {\n return value === 'low' || value === 'normal' || value === 'high';\n }\n}\n","import { z } from 'zod';\n\nconst integer = z.number().int();\n\nexport const RawTelemetryEventRowSchema = z\n .object({\n producer_id: z.string(),\n sequence: integer.nonnegative(),\n event_id: z.string(),\n occurred_at_ms: integer,\n monotonic_ns: z.string().nullable(),\n source: z.string(),\n process_kind: z.string(),\n level: z.string(),\n label: z.string(),\n conversation_id: z.string().nullable(),\n conversation_id_kind: z.enum(['string', 'number']).nullable(),\n correlation_id: z.string().nullable(),\n metadata_json: z.string(),\n schema_version: integer.positive(),\n })\n .strict();\n\nexport type RawTelemetryEventRow = z.infer<typeof RawTelemetryEventRowSchema>;\n\nexport const BatchAcknowledgementRowSchema = z\n .object({\n idempotency_key: z.string(),\n producer_id: z.string(),\n sequence_start: integer.nonnegative(),\n sequence_end: integer.nonnegative(),\n schema_version: integer.positive(),\n checksum: z.string(),\n accepted_events: integer.nonnegative(),\n committed_at_ms: integer,\n })\n .strict();\n\nexport type BatchAcknowledgementRow = z.infer<typeof BatchAcknowledgementRowSchema>;\n\nexport const MetricSampleRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n occurred_at_ms: integer,\n producer_id: z.string(),\n sequence: integer.nonnegative(),\n dimension_key: z.string(),\n dimensions_json: z.string(),\n values_json: z.string(),\n })\n .strict();\n\nexport type MetricSampleRow = z.infer<typeof MetricSampleRowSchema>;\n\nexport const MetricRollupRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n resolution_ms: integer.positive(),\n bucket_start_ms: integer,\n dimension_key: z.string(),\n dimensions_json: z.string(),\n values_json: z.string(),\n })\n .strict();\n\nexport type MetricRollupRow = z.infer<typeof MetricRollupRowSchema>;\n\nexport const RollupCompletionRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n resolution_ms: integer.positive(),\n bucket_start_ms: integer,\n sample_count: integer.nonnegative(),\n sample_watermark_ms: integer,\n completed_at_ms: integer,\n state: z.enum(['completed', 'rejected']),\n detail: z.string().nullable(),\n })\n .strict();\n\nexport type RollupCompletionRow = z.infer<typeof RollupCompletionRowSchema>;\n\nexport const TimelineCursorSchema = z\n .object({\n version: z.literal(1),\n order: z.enum(['asc', 'desc']),\n occurredAtMs: integer,\n producerId: z.string(),\n sequence: integer.nonnegative(),\n })\n .strict();\n\nexport type TimelineCursor = z.infer<typeof TimelineCursorSchema>;\n\nexport const MetricCursorSchema = z\n .object({\n version: z.literal(1),\n order: z.enum(['asc', 'desc']),\n bucketStartMs: integer,\n resolutionMs: integer.positive(),\n definitionVersion: integer.positive(),\n dimensionKey: z.string(),\n })\n .strict();\n\nexport type MetricCursor = z.infer<typeof MetricCursorSchema>;\n\nexport const TelemetryJsonObjectSchema = z.record(z.string(), z.json());\nexport const NumericValuesSchema = z.record(z.string(), z.number().finite());\n\nconst StoredMetricMeasurementSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('count') }).strict(),\n z\n .object({\n kind: z.literal('field'),\n field: z.string().min(1),\n aggregates: z.array(z.enum(['sum', 'min', 'max', 'last'])).min(1),\n })\n .strict(),\n]);\n\nexport const StoredMetricDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: integer.positive(),\n selector: z.string().min(1),\n groupBy: z.array(z.string().min(1)),\n measurements: z.array(StoredMetricMeasurementSchema).min(1),\n cardinality: z.record(\n z.string(),\n z\n .object({\n maxValuesPerBucket: integer.positive(),\n overflow: z.enum(['other', 'drop', 'reject']),\n })\n .strict(),\n ),\n targetIds: z.array(z.string().min(1)),\n resolutionsMs: z.array(integer.positive()).min(1),\n missingField: z.enum(['skip', 'record-failure']),\n })\n .strict();\n\nexport const StoredMetricDefinitionRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n definition_json: z.string(),\n definition_checksum: z.string(),\n active: integer.min(0).max(1),\n })\n .strict();\n\nexport const MetricRollupValuesSchema = z\n .object({\n count: integer.nonnegative(),\n fields: z.record(\n z.string(),\n z\n .object({\n count: integer.nonnegative(),\n sum: z.number().finite(),\n min: z.number().finite(),\n max: z.number().finite(),\n last: z.number().finite(),\n lastOccurredAtMs: integer,\n lastProducerId: z.string(),\n lastSequence: integer.nonnegative(),\n })\n .strict(),\n ),\n })\n .strict();\n","import type { TelemetryEnvelope } from '../core/types/envelope.types.js';\nimport type { TelemetryJsonObject } from '../core/types/json.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport {\n MetricCursorSchema,\n MetricRollupRowSchema,\n MetricRollupValuesSchema,\n MetricSampleRowSchema,\n NumericValuesSchema,\n RawTelemetryEventRowSchema,\n TelemetryJsonObjectSchema,\n TimelineCursorSchema,\n type MetricCursor,\n type MetricRollupRow,\n type MetricSampleRow,\n type TimelineCursor,\n} from './schema/telemetry_repository_rows.js';\nimport type { MetricRollupValues } from '../core/types/metric.types.js';\n\nexport class TelemetryRepositoryRowParser {\n parseRawEnvelope(input: unknown): TelemetryResult<TelemetryEnvelope, string> {\n const parsed = RawTelemetryEventRowSchema.safeParse(input);\n if (!parsed.success) {\n return { ok: false, error: parsed.error.message };\n }\n const metadata = this.parseJsonObject(parsed.data.metadata_json);\n if (!metadata.ok) {\n return metadata;\n }\n const conversationId = this.parseConversationId(\n parsed.data.conversation_id,\n parsed.data.conversation_id_kind,\n );\n if (!conversationId.ok) {\n return conversationId;\n }\n return {\n ok: true,\n value: Object.freeze({\n schemaVersion: parsed.data.schema_version,\n eventId: parsed.data.event_id,\n producerId: parsed.data.producer_id,\n sequence: parsed.data.sequence,\n occurredAtMs: parsed.data.occurred_at_ms,\n monotonicNs: parsed.data.monotonic_ns,\n source: parsed.data.source,\n processKind: parsed.data.process_kind,\n level: parsed.data.level,\n label: parsed.data.label,\n conversationId: conversationId.value,\n correlationId: parsed.data.correlation_id,\n metadata: metadata.value,\n }),\n };\n }\n\n parseMetricSample(input: unknown): TelemetryResult<MetricSampleRow, string> {\n const parsed = MetricSampleRowSchema.safeParse(input);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n }\n\n parseMetricRollup(input: unknown): TelemetryResult<MetricRollupRow, string> {\n const parsed = MetricRollupRowSchema.safeParse(input);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n }\n\n parseJsonObject(input: string): TelemetryResult<TelemetryJsonObject, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = TelemetryJsonObjectSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: Object.freeze(parsed.data) }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseNumericValues(input: string): TelemetryResult<Readonly<Record<string, number>>, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = NumericValuesSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: Object.freeze(parsed.data) }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseRollupValues(input: string): TelemetryResult<MetricRollupValues, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = MetricRollupValuesSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseTimelineCursor(input: string): TelemetryResult<TimelineCursor, string> {\n return this.parseCursor(input, TimelineCursorSchema);\n }\n\n parseMetricCursor(input: string): TelemetryResult<MetricCursor, string> {\n return this.parseCursor(input, MetricCursorSchema);\n }\n\n private parseCursor<T>(input: string, schema: { safeParse(value: unknown): { success: true; data: T } | { success: false; error: Error } }): TelemetryResult<T, string> {\n try {\n const decodedText = Buffer.from(input, 'base64url').toString('utf8');\n const decoded: unknown = JSON.parse(decodedText);\n const parsed = schema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n private parseConversationId(\n value: string | null,\n kind: 'string' | 'number' | null,\n ): TelemetryResult<string | number | null, string> {\n if (value === null) {\n return { ok: true, value: null };\n }\n if (kind === 'string') {\n return { ok: true, value };\n }\n if (kind === 'number') {\n const numeric = Number(value);\n return Number.isFinite(numeric)\n ? { ok: true, value: numeric }\n : { ok: false, error: `Invalid numeric conversation id ${value}` };\n }\n return { ok: false, error: 'Conversation id kind is missing' };\n }\n}\n","import type { SqliteSchemaConfiguration } from '../core/types/configuration.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport { telemetryChecksum } from '../core/helper/canonical_json.js';\nimport {\n SQLITE_DEFAULT_TABLE_NAMES,\n SQLITE_LOGICAL_TABLE_NAMES,\n SQLITE_SCHEMA_MANIFEST_TABLE,\n} from './helper/sqlite_table_names.js';\nimport type {\n TelemetryLogicalTableName,\n TelemetryPhysicalTableMapping,\n} from './types/telemetry_table_map.types.js';\n\nexport class TelemetryTableMap {\n private readonly tokenMap: Readonly<Record<string, string>>;\n\n private constructor(\n private readonly mapping: TelemetryPhysicalTableMapping,\n readonly checksum: string,\n ) {\n this.tokenMap = Object.freeze({\n ...mapping,\n rawEventsOccurredIndex: this.indexName(mapping.rawEvents, 'occurred'),\n rawEventsConversationIndex: this.indexName(mapping.rawEvents, 'conversation'),\n rawEventsLabelIndex: this.indexName(mapping.rawEvents, 'label'),\n rawEventsLevelIndex: this.indexName(mapping.rawEvents, 'level'),\n metricSamplesTimeIndex: this.indexName(mapping.metricSamples, 'time'),\n metricSamplesEventIndex: this.indexName(mapping.metricSamples, 'event'),\n metricRollupsTimeIndex: this.indexName(mapping.metricRollups, 'time'),\n });\n }\n\n static create(configuration: SqliteSchemaConfiguration): TelemetryResult<TelemetryTableMap, string> {\n const prefixError = TelemetryTableMap.validateOptionalPrefix(configuration.tablePrefix);\n if (prefixError !== null) {\n return { ok: false, error: prefixError };\n }\n\n const entries = SQLITE_LOGICAL_TABLE_NAMES.map((logicalName) => {\n const override = configuration.tables[logicalName];\n const defaultName = SQLITE_DEFAULT_TABLE_NAMES[logicalName];\n const physicalName = override ?? (configuration.tablePrefix === null\n ? defaultName\n : `${configuration.tablePrefix}${defaultName}`);\n return [logicalName, physicalName] as const;\n });\n\n for (const [logicalName, physicalName] of entries) {\n const identifierError = TelemetryTableMap.validateIdentifier(physicalName);\n if (identifierError !== null) {\n return { ok: false, error: `${logicalName}: ${identifierError}` };\n }\n if (physicalName.toLowerCase() === SQLITE_SCHEMA_MANIFEST_TABLE) {\n return { ok: false, error: `${logicalName} cannot use the fixed schema manifest name` };\n }\n }\n\n const foldedNames = entries.map(([, physicalName]) => physicalName.toLowerCase());\n if (new Set(foldedNames).size !== foldedNames.length) {\n return { ok: false, error: 'Resolved telemetry table names must be unique after case folding' };\n }\n\n const mapping = Object.freeze(Object.fromEntries(entries)) as TelemetryPhysicalTableMapping;\n const checksum = telemetryChecksum(mapping);\n return { ok: true, value: new TelemetryTableMap(mapping, checksum) };\n }\n\n physical(logicalName: TelemetryLogicalTableName): string {\n return this.mapping[logicalName];\n }\n\n quoted(logicalName: TelemetryLogicalTableName): string {\n return this.quote(this.mapping[logicalName]);\n }\n\n manifestMapping(): TelemetryPhysicalTableMapping {\n return this.mapping;\n }\n\n substitute(sql: string): TelemetryResult<string, string> {\n const unknownTokens: string[] = [];\n const substituted = sql.replace(/\\{\\{([A-Za-z][A-Za-z0-9]*)\\}\\}/g, (_match, token: string) => {\n const identifier = this.tokenMap[token];\n if (identifier === undefined) {\n unknownTokens.push(token);\n return `{{${token}}}`;\n }\n return this.quote(identifier);\n });\n if (unknownTokens.length > 0 || substituted.includes('{{')) {\n return {\n ok: false,\n error: `Unknown telemetry migration identifier token(s): ${unknownTokens.join(', ') || 'malformed token'}`,\n };\n }\n return { ok: true, value: substituted };\n }\n\n private quote(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n }\n\n private indexName(tableName: string, purpose: string): string {\n const raw = `${tableName}_${purpose}_idx`;\n if (raw.length <= 63) {\n return raw;\n }\n const suffix = telemetryChecksum(raw).slice(0, 8);\n return `${raw.slice(0, 54)}_${suffix}`;\n }\n\n private static validateOptionalPrefix(prefix: string | null): string | null {\n if (prefix === null) {\n return null;\n }\n return this.validateIdentifier(prefix);\n }\n\n private static validateIdentifier(identifier: string): string | null {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {\n return `Invalid SQLite identifier ${identifier}`;\n }\n if (identifier.length > 63) {\n return `SQLite identifier ${identifier} exceeds 63 characters`;\n }\n if (identifier.toLowerCase().startsWith('sqlite_')) {\n return `SQLite identifier ${identifier} uses the reserved sqlite_ prefix`;\n }\n return null;\n }\n}\n","import { z } from 'zod';\n\nexport const TelemetrySchemaManifestRowSchema = z.object({\n target_id: z.string(),\n format_version: z.number().int().positive(),\n mapping_json: z.string(),\n mapping_checksum: z.string(),\n state: z.enum(['ready', 'renaming']),\n pending_mapping_json: z.string().nullable(),\n updated_at_ms: z.number().int(),\n}).strict();\n\nexport type TelemetrySchemaManifestRow = z.infer<typeof TelemetrySchemaManifestRowSchema>;\n","import { randomUUID } from 'node:crypto';\nimport { TelemetryClient } from '../../core/telemetry_client.js';\nimport type { NodeTelemetryProducerOptions } from './types/node_telemetry_producer_host.types.js';\n\nexport class NodeTelemetryProducerHost {\n readonly client: TelemetryClient;\n\n constructor(options: NodeTelemetryProducerOptions) {\n this.client = new TelemetryClient({\n source: options.source,\n processKind: options.processKind,\n transport: options.transport,\n admission: options.admission,\n metadata: options.metadata,\n producerId: options.producerId ?? randomUUID(),\n now: () => Date.now(),\n monotonicNowNs: () => process.hrtime.bigint().toString(),\n schedule: (work) => queueMicrotask(work),\n delay: (durationMs) => new Promise((resolve) => setTimeout(resolve, durationMs)),\n random: () => Math.random(),\n });\n }\n\n async stop(deadlineMs: number): Promise<void> {\n await this.client.stop(deadlineMs);\n }\n}\n","import { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from './types/json.types.js';\nimport type { MetadataSnapshot, MetadataSnapshotLimits, MetadataSnapshotStats } from './types/metadata.types.js';\n\nconst SENTINEL_CIRCULAR = '[telemetry:circular]';\nconst SENTINEL_TRUNCATED = '[telemetry:truncated]';\n\nexport class BoundedMetadataSnapshotter {\n constructor(private readonly limits: MetadataSnapshotLimits) {\n this.validateLimits();\n }\n\n snapshot(input: unknown): MetadataSnapshot {\n const state = {\n bytes: 0,\n properties: 0,\n truncatedValues: 0,\n redactedValues: 0,\n serializationFailures: 0,\n seen: new WeakSet<object>(),\n };\n\n let normalized: TelemetryJsonValue;\n try {\n normalized = this.normalize(input, '$', 0, state);\n } catch {\n state.serializationFailures += 1;\n normalized = { __telemetry: '[telemetry:snapshot-failed]' };\n }\n\n const root = this.ensureObject(normalized);\n const canonical = canonicalJson(root);\n const metadata = telemetryUtf8Length(canonical) <= this.limits.maxBytes\n ? root\n : Object.freeze({ __telemetry: SENTINEL_TRUNCATED });\n if (metadata !== root) {\n state.truncatedValues += 1;\n }\n\n const stats: MetadataSnapshotStats = Object.freeze({\n estimatedBytes: Math.min(telemetryUtf8Length(canonical), this.limits.maxBytes),\n truncatedValues: state.truncatedValues,\n redactedValues: state.redactedValues,\n serializationFailures: state.serializationFailures,\n });\n\n return Object.freeze({ metadata, stats });\n }\n\n private normalize(\n input: unknown,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonValue {\n const replacement = this.redactionFor(path);\n if (replacement !== null) {\n state.redactedValues += 1;\n return replacement;\n }\n\n if (depth > this.limits.maxDepth || state.bytes >= this.limits.maxBytes) {\n state.truncatedValues += 1;\n return SENTINEL_TRUNCATED;\n }\n\n if (input === null || typeof input === 'boolean') {\n return input;\n }\n if (typeof input === 'string') {\n return this.normalizeString(input, state);\n }\n if (typeof input === 'number') {\n return Number.isFinite(input) ? input : `[telemetry:number:${String(input)}]`;\n }\n if (typeof input === 'bigint') {\n return `[telemetry:bigint:${input.toString()}]`;\n }\n if (typeof input === 'undefined') {\n return '[telemetry:undefined]';\n }\n if (typeof input === 'symbol') {\n return `[telemetry:symbol:${input.description ?? ''}]`;\n }\n if (typeof input === 'function') {\n return '[telemetry:function]';\n }\n if (input instanceof Error) {\n return this.normalizeError(input, path, depth, state);\n }\n if (typeof input !== 'object') {\n return `[telemetry:unsupported:${typeof input}]`;\n }\n if (state.seen.has(input)) {\n return SENTINEL_CIRCULAR;\n }\n\n state.seen.add(input);\n try {\n return Array.isArray(input)\n ? this.normalizeArray(input, path, depth, state)\n : this.normalizeObject(input, path, depth, state);\n } finally {\n state.seen.delete(input);\n }\n }\n\n private normalizeString(\n input: string,\n state: { bytes: number; truncatedValues: number },\n ): string {\n const stringLimit = Math.min(this.limits.maxStringLength, Math.max(0, this.limits.maxBytes - state.bytes));\n const truncated = input.length > stringLimit;\n const normalized = truncated ? input.slice(0, stringLimit) : input;\n state.bytes += telemetryUtf8Length(normalized);\n if (truncated) {\n state.truncatedValues += 1;\n }\n return normalized;\n }\n\n private normalizeArray(\n input: readonly unknown[],\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): readonly TelemetryJsonValue[] {\n const length = Math.min(input.length, this.limits.maxArrayLength);\n const values: TelemetryJsonValue[] = [];\n for (let index = 0; index < length; index += 1) {\n let item: unknown;\n try {\n item = input[index];\n } catch {\n state.serializationFailures += 1;\n item = '[telemetry:property-read-failed]';\n }\n values.push(this.normalize(item, `${path}[${index}]`, depth + 1, state));\n }\n if (input.length > length) {\n values.push(SENTINEL_TRUNCATED);\n state.truncatedValues += 1;\n }\n return Object.freeze(values);\n }\n\n private normalizeObject(\n input: object,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n let keys: string[];\n try {\n keys = Object.keys(input).sort((left, right) => left.localeCompare(right));\n } catch {\n state.serializationFailures += 1;\n return Object.freeze({ __telemetry: '[telemetry:keys-failed]' });\n }\n\n const output: Record<string, TelemetryJsonValue> = {};\n for (const key of keys) {\n if (state.properties >= this.limits.maxProperties) {\n output.__telemetry = SENTINEL_TRUNCATED;\n state.truncatedValues += 1;\n break;\n }\n state.properties += 1;\n state.bytes += telemetryUtf8Length(key);\n const childPath = path === '$' ? key : `${path}.${key}`;\n const redaction = this.redactionFor(childPath);\n if (redaction !== null) {\n output[key] = redaction;\n state.redactedValues += 1;\n continue;\n }\n\n let property: unknown;\n try {\n property = Reflect.get(input, key);\n } catch {\n state.serializationFailures += 1;\n property = '[telemetry:property-read-failed]';\n }\n output[key] = this.normalize(property, childPath, depth + 1, state);\n }\n return Object.freeze(output);\n }\n\n private normalizeError(\n error: Error,\n path: string,\n depth: number,\n state: {\n bytes: number;\n properties: number;\n truncatedValues: number;\n redactedValues: number;\n serializationFailures: number;\n seen: WeakSet<object>;\n },\n ): TelemetryJsonObject {\n const name = this.readErrorField(error, 'name', state);\n const message = this.readErrorField(error, 'message', state);\n const stack = this.readErrorField(error, 'stack', state).slice(0, this.limits.maxErrorStackLength);\n return Object.freeze({\n name: this.normalize(name, `${path}.name`, depth + 1, state),\n message: this.normalize(message, `${path}.message`, depth + 1, state),\n stack: this.normalize(stack, `${path}.stack`, depth + 1, state),\n });\n }\n\n private readErrorField(\n error: Error,\n field: 'name' | 'message' | 'stack',\n state: { serializationFailures: number },\n ): string {\n try {\n return typeof error[field] === 'string' ? error[field] : '';\n } catch {\n state.serializationFailures += 1;\n return '[telemetry:error-field-read-failed]';\n }\n }\n\n private ensureObject(value: TelemetryJsonValue): TelemetryJsonObject {\n return this.isJsonObject(value) ? value : Object.freeze({ value });\n }\n\n private isJsonObject(value: TelemetryJsonValue): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private redactionFor(path: string): string | null {\n const matchingRule = this.limits.redactions.find((rule) => rule.path === path);\n return matchingRule?.replacement ?? null;\n }\n\n private validateLimits(): void {\n const limits = [\n this.limits.maxBytes,\n this.limits.maxDepth,\n this.limits.maxProperties,\n this.limits.maxArrayLength,\n this.limits.maxStringLength,\n this.limits.maxErrorStackLength,\n ];\n const hasInvalidLimit = limits.some((limit) => !Number.isInteger(limit) || limit <= 0);\n if (hasInvalidLimit) {\n throw new Error('Metadata snapshot limits must be positive integers');\n }\n }\n}\n","import { BoundedMetadataSnapshotter } from './bounded_metadata_snapshotter.js';\nimport { canonicalJson, telemetryUtf8Length } from './helper/canonical_json.js';\nimport { TelemetryBatchContract } from './telemetry_batch_contract.js';\nimport type { QueuedTelemetryEnvelope } from './types/client_internal.types.js';\nimport type {\n TelemetryAdmissionPriority,\n TelemetryAdmissionResult,\n TelemetryClientOptions,\n TelemetryClientStatus,\n TelemetryMinimumLevel,\n} from './types/client.types.js';\nimport type { TelemetryAdmitInput, TelemetryEnvelope, TelemetryLevel } from './types/envelope.types.js';\nimport type { TelemetryJsonObject } from './types/json.types.js';\nimport type { TelemetryAcknowledgement, TelemetryBatch, TelemetryDropCounter } from './types/transport.types.js';\n\nconst TELEMETRY_LEVEL_RANKS: Readonly<Record<TelemetryMinimumLevel, number>> = Object.freeze({\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n});\n\nexport class TelemetryClient {\n private readonly snapshotter: BoundedMetadataSnapshotter;\n private readonly batchContract = new TelemetryBatchContract();\n private readonly queue: QueuedTelemetryEnvelope[] = [];\n private readonly dropCounts = new Map<string, number>();\n private state: 'accepting' | 'draining' | 'stopped' = 'accepting';\n private nextSequence = 0;\n private queuedBytes = 0;\n private inFlightBatches = 0;\n private drainScheduled = false;\n private activeDrain: Promise<void> | null = null;\n private lastAcknowledgement: TelemetryAcknowledgement | null = null;\n\n constructor(private readonly options: TelemetryClientOptions) {\n this.validateOptions();\n this.snapshotter = new BoundedMetadataSnapshotter(options.metadata);\n }\n\n trace(level: TelemetryLevel, label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit(level, label, metadata);\n }\n\n debug(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('debug', label, metadata);\n }\n\n info(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('info', label, metadata);\n }\n\n warn(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('warn', label, metadata);\n }\n\n error(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('error', label, metadata);\n }\n\n fatal(label: string, metadata: unknown = {}): TelemetryAdmissionResult {\n return this.emit('fatal', label, metadata);\n }\n\n emit(level: TelemetryLevel, label: string, metadata: unknown): TelemetryAdmissionResult {\n return this.admit({\n source: this.options.source,\n processKind: this.options.processKind,\n level,\n label,\n occurredAtMs: this.options.now(),\n monotonicNs: this.options.monotonicNowNs(),\n conversationId: null,\n correlationId: null,\n metadata,\n });\n }\n\n admit(input: TelemetryAdmitInput): TelemetryAdmissionResult {\n const sequence = this.nextSequence;\n this.nextSequence += 1;\n\n if (this.state !== 'accepting') {\n this.incrementDrop('stopped', this.priorityFor(input.level));\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'client-stopped' };\n }\n\n const hasInvalidIdentity = !this.isValidLabel(input.label)\n || !input.source.trim()\n || !input.processKind.trim()\n || !Number.isFinite(input.occurredAtMs);\n if (hasInvalidIdentity) {\n this.incrementDrop('invalid', this.priorityFor(input.level));\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'invalid-label' };\n }\n\n const priority = this.priorityFor(input.level);\n if (!this.meetsMinimumLevel(input.level)) {\n this.incrementDrop('sampled', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'below-minimum-level' };\n }\n if (!this.isSampled(priority)) {\n this.incrementDrop('sampled', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'sampled' };\n }\n\n const snapshot = this.snapshotter.snapshot(input.metadata);\n const extractedCorrelation = this.resolveCorrelation(snapshot.metadata);\n const correlation = {\n conversationId: input.conversationId ?? extractedCorrelation.conversationId,\n correlationId: input.correlationId ?? extractedCorrelation.correlationId,\n };\n const envelope = this.createEnvelope(sequence, input, snapshot.metadata, correlation);\n const bytes = telemetryUtf8Length(canonicalJson(envelope));\n const single = this.batchContract.create([envelope], []);\n if (!single.ok) {\n this.incrementDrop('invalid', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'invalid-envelope' };\n }\n const framedBytes = telemetryUtf8Length(canonicalJson(single.value));\n const queueWouldOverflow = this.queue.length >= this.options.admission.maxQueuedEvents\n || this.queuedBytes + bytes > this.options.admission.maxQueuedBytes\n || framedBytes > this.options.admission.maxBatchBytes;\n if (queueWouldOverflow) {\n this.incrementDrop('capacity', priority);\n return { kind: 'dropped', producerId: this.options.producerId, sequence, reason: 'capacity' };\n }\n\n this.queue.push(Object.freeze({ envelope, bytes }));\n this.queuedBytes += bytes;\n this.scheduleDrain();\n return {\n kind: 'admitted',\n producerId: this.options.producerId,\n sequence,\n eventId: envelope.eventId,\n };\n }\n\n status(): TelemetryClientStatus {\n return Object.freeze({\n state: this.state,\n producerId: this.options.producerId,\n nextSequence: this.nextSequence,\n queuedEvents: this.queue.length,\n queuedBytes: this.queuedBytes,\n inFlightBatches: this.inFlightBatches,\n dropCounters: this.dropCounterSnapshot(),\n lastAcknowledgement: this.lastAcknowledgement,\n });\n }\n\n async flush(deadlineMs: number): Promise<void> {\n this.scheduleDrain();\n while ((this.queue.length > 0 || this.activeDrain !== null) && this.options.now() < deadlineMs) {\n const currentDrain = this.activeDrain;\n if (currentDrain) {\n await Promise.race([currentDrain, this.options.delay(1)]);\n } else {\n await this.options.delay(1);\n }\n }\n await this.settleExternalShutdown(\n () => this.options.transport.flush(deadlineMs),\n deadlineMs,\n );\n }\n\n async stop(deadlineMs: number): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n this.state = 'draining';\n await this.flush(deadlineMs);\n const abandoned = this.queue.splice(0, this.queue.length);\n if (abandoned.length > 0) {\n this.incrementDropBy('transport', 'normal', abandoned.length);\n this.queuedBytes = 0;\n }\n await this.settleExternalShutdown(\n () => this.options.transport.close(deadlineMs),\n deadlineMs,\n );\n this.state = 'stopped';\n }\n\n private createEnvelope(\n sequence: number,\n input: TelemetryAdmitInput,\n metadata: TelemetryJsonObject,\n correlation: Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }>,\n ): TelemetryEnvelope {\n return Object.freeze({\n schemaVersion: TelemetryBatchContract.schemaVersion,\n eventId: `${this.options.producerId}:${sequence}`,\n producerId: this.options.producerId,\n sequence,\n occurredAtMs: input.occurredAtMs,\n monotonicNs: input.monotonicNs,\n source: input.source,\n processKind: input.processKind,\n level: input.level.trim().toLowerCase() || 'info',\n label: input.label,\n conversationId: correlation.conversationId,\n correlationId: correlation.correlationId,\n metadata,\n });\n }\n\n private resolveCorrelation(metadata: TelemetryJsonObject): Readonly<{\n conversationId: string | number | null;\n correlationId: string | null;\n }> {\n const conversationValue = metadata.conversationId ?? metadata.threadId ?? null;\n const conversationId = typeof conversationValue === 'string' || typeof conversationValue === 'number'\n ? conversationValue\n : null;\n const correlationValue = metadata.correlationId;\n const correlationId = typeof correlationValue === 'string' ? correlationValue : null;\n return { conversationId, correlationId };\n }\n\n private scheduleDrain(): void {\n if (this.drainScheduled || this.activeDrain !== null || this.queue.length === 0) {\n return;\n }\n this.drainScheduled = true;\n try {\n this.options.schedule(() => {\n this.drainScheduled = false;\n const drain = this.drainLoop();\n this.activeDrain = drain;\n const settle = () => {\n this.activeDrain = null;\n if (this.queue.length > 0) {\n this.scheduleDrain();\n }\n };\n void drain.then(settle, settle);\n });\n } catch {\n this.drainScheduled = false;\n }\n }\n\n private async drainLoop(): Promise<void> {\n while (this.queue.length > 0) {\n const dropSnapshot = this.dropCounterSnapshot();\n const prepared = this.prepareBatch(dropSnapshot);\n if (prepared === null) {\n continue;\n }\n\n this.inFlightBatches += 1;\n try {\n const acknowledgement = await this.deliverWithRetry(prepared.batch);\n this.lastAcknowledgement = acknowledgement;\n if (acknowledgement.kind === 'committed') {\n this.subtractDropSnapshot(prepared.dropCounters);\n } else {\n this.incrementDropBy('transport', 'normal', prepared.eventCount);\n }\n } finally {\n this.inFlightBatches -= 1;\n }\n }\n }\n\n private prepareBatch(dropCounters: readonly TelemetryDropCounter[]): Readonly<{\n batch: TelemetryBatch;\n dropCounters: readonly TelemetryDropCounter[];\n eventCount: number;\n }> | null {\n const entries = this.peekBatchEntries();\n const withCounters = this.findFittingBatch(entries, dropCounters);\n const prepared = withCounters ?? this.findFittingBatch(entries, []);\n if (prepared === null) {\n const invalid = this.queue.shift();\n if (invalid !== undefined) {\n this.queuedBytes -= invalid.bytes;\n this.incrementDrop('invalid', this.priorityFor(invalid.envelope.level));\n }\n return null;\n }\n for (let index = 0; index < prepared.eventCount; index += 1) {\n const removed = this.queue.shift();\n if (removed !== undefined) {\n this.queuedBytes -= removed.bytes;\n }\n }\n return prepared;\n }\n\n private peekBatchEntries(): QueuedTelemetryEnvelope[] {\n const entries: QueuedTelemetryEnvelope[] = [];\n let batchBytes = 0;\n while (entries.length < this.options.admission.maxBatchEvents) {\n const next = this.queue[entries.length];\n if (!next) {\n break;\n }\n const exceedsBatchBytes = entries.length > 0\n && batchBytes + next.bytes > this.options.admission.maxBatchBytes;\n if (exceedsBatchBytes) {\n break;\n }\n batchBytes += next.bytes;\n entries.push(next);\n }\n return entries;\n }\n\n private findFittingBatch(\n entries: readonly QueuedTelemetryEnvelope[],\n dropCounters: readonly TelemetryDropCounter[],\n ): Readonly<{\n batch: TelemetryBatch;\n dropCounters: readonly TelemetryDropCounter[];\n eventCount: number;\n }> | null {\n for (let eventCount = entries.length; eventCount > 0; eventCount -= 1) {\n const created = this.batchContract.create(\n entries.slice(0, eventCount).map((entry) => entry.envelope),\n dropCounters,\n );\n if (created.ok\n && telemetryUtf8Length(canonicalJson(created.value)) <= this.options.admission.maxBatchBytes) {\n return Object.freeze({ batch: created.value, dropCounters, eventCount });\n }\n }\n return null;\n }\n\n private async deliverWithRetry(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n let attempt = 0;\n while (attempt <= this.options.admission.retryLimit) {\n let acknowledgement: TelemetryAcknowledgement;\n try {\n const received: unknown = await this.options.transport.send(batch);\n acknowledgement = this.normalizeAcknowledgement(batch, received, attempt);\n } catch (cause) {\n acknowledgement = {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.errorMessage(cause),\n retryAfterMs: this.retryDelay(attempt),\n targetStates: [],\n };\n }\n\n if (acknowledgement.kind !== 'retryable' || attempt === this.options.admission.retryLimit) {\n return acknowledgement;\n }\n const requestedDelay = Math.max(acknowledgement.retryAfterMs, this.retryDelay(attempt));\n await this.options.delay(requestedDelay);\n attempt += 1;\n }\n\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: 'retry-limit-exhausted',\n retryAfterMs: 0,\n targetStates: [],\n };\n }\n\n private retryDelay(attempt: number): number {\n return Math.min(\n Number.MAX_SAFE_INTEGER,\n this.options.admission.retryBaseDelayMs * (2 ** attempt),\n );\n }\n\n private normalizeAcknowledgement(\n batch: TelemetryBatch,\n value: unknown,\n attempt: number,\n ): TelemetryAcknowledgement {\n try {\n const error = this.acknowledgementError(batch, value);\n return error === null\n ? this.detachAcknowledgement(value as TelemetryAcknowledgement)\n : this.invalidAcknowledgement(batch, error, attempt);\n } catch {\n return this.invalidAcknowledgement(batch, 'acknowledgement could not be inspected', attempt);\n }\n }\n\n private acknowledgementError(batch: TelemetryBatch, value: unknown): string | null {\n if (!this.isRecord(value) || value.idempotencyKey !== batch.idempotencyKey) {\n return 'acknowledgement identity is missing or mismatched';\n }\n const targetsError = this.targetStatesError(value.targetStates);\n if (targetsError !== null) {\n return targetsError;\n }\n switch (value.kind) {\n case 'committed':\n return this.committedAcknowledgementError(batch, value);\n case 'retryable':\n return this.retryableAcknowledgementError(value);\n case 'rejected':\n return this.rejectedAcknowledgementError(value);\n case 'conflict':\n return this.conflictAcknowledgementError(value);\n default:\n return 'acknowledgement kind is invalid';\n }\n }\n\n private committedAcknowledgementError(\n batch: TelemetryBatch,\n value: Record<string, unknown>,\n ): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'committedAtMs',\n 'acceptedEvents',\n 'duplicate',\n 'targetStates',\n ])\n && Number.isSafeInteger(value.committedAtMs)\n && Number(value.committedAtMs) >= 0\n && value.acceptedEvents === batch.envelopes.length\n && typeof value.duplicate === 'boolean';\n return valid ? null : 'committed acknowledgement fields are invalid';\n }\n\n private retryableAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'reason',\n 'retryAfterMs',\n 'targetStates',\n ])\n && this.isBoundedReason(value.reason)\n && Number.isFinite(value.retryAfterMs)\n && Number(value.retryAfterMs) >= 0\n && Number(value.retryAfterMs) <= Number.MAX_SAFE_INTEGER;\n return valid ? null : 'retryable acknowledgement fields are invalid';\n }\n\n private rejectedAcknowledgementError(value: Record<string, unknown>): string | null {\n const codes = ['invalid-batch', 'unsupported-version', 'no-required-terminal', 'closed'];\n const valid = this.hasExactKeys(value, [\n 'kind',\n 'idempotencyKey',\n 'code',\n 'reason',\n 'targetStates',\n ])\n && codes.includes(String(value.code))\n && this.isBoundedReason(value.reason);\n return valid ? null : 'rejected acknowledgement fields are invalid';\n }\n\n private conflictAcknowledgementError(value: Record<string, unknown>): string | null {\n const valid = this.hasExactKeys(value, ['kind', 'idempotencyKey', 'reason', 'targetStates'])\n && this.isBoundedReason(value.reason);\n return valid ? null : 'conflict acknowledgement fields are invalid';\n }\n\n private targetStatesError(value: unknown): string | null {\n if (!Array.isArray(value) || value.length > 1_024) {\n return 'acknowledgement target states are invalid';\n }\n const targetIds = new Set<string>();\n for (const target of value) {\n if (!this.isValidTargetState(target) || targetIds.has(target.targetId as string)) {\n return 'acknowledgement target states are invalid';\n }\n targetIds.add(target.targetId as string);\n }\n return null;\n }\n\n private isValidTargetState(value: unknown): value is Record<string, unknown> {\n if (!this.isRecord(value)\n || !this.hasExactKeys(value, ['targetId', 'delivery', 'state', 'attempts', 'reason'])) {\n return false;\n }\n const deliveries = ['required', 'best-effort'];\n const states = ['pending', 'committed', 'failed', 'abandoned'];\n return typeof value.targetId === 'string'\n && value.targetId.length > 0\n && telemetryUtf8Length(value.targetId) <= 256\n && deliveries.includes(String(value.delivery))\n && states.includes(String(value.state))\n && Number.isSafeInteger(value.attempts)\n && Number(value.attempts) >= 0\n && (value.reason === null || this.isBoundedReason(value.reason));\n }\n\n private invalidAcknowledgement(\n batch: TelemetryBatch,\n error: string,\n attempt: number,\n ): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: `Invalid telemetry acknowledgement: ${error}`,\n retryAfterMs: this.retryDelay(attempt),\n targetStates: [],\n };\n }\n\n private detachAcknowledgement(value: TelemetryAcknowledgement): TelemetryAcknowledgement {\n const detached = JSON.parse(canonicalJson(value)) as TelemetryAcknowledgement;\n const targetStates = Object.freeze(detached.targetStates.map((target) => Object.freeze({ ...target })));\n return Object.freeze({ ...detached, targetStates });\n }\n\n private isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private hasExactKeys(value: Record<string, unknown>, expected: readonly string[]): boolean {\n const keys = Object.keys(value);\n return Object.getOwnPropertySymbols(value).length === 0\n && keys.length === expected.length\n && expected.every((key) => Object.prototype.hasOwnProperty.call(value, key));\n }\n\n private isBoundedReason(value: unknown): value is string {\n return typeof value === 'string' && telemetryUtf8Length(value) <= 512;\n }\n\n private dropCounterSnapshot(): readonly TelemetryDropCounter[] {\n const counters = [...this.dropCounts.entries()]\n .filter(([, count]) => count > 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, count]) => {\n const [reason, priority] = key.split(':');\n return Object.freeze({\n reason: reason as TelemetryDropCounter['reason'],\n priority: priority as TelemetryDropCounter['priority'],\n count,\n });\n });\n return Object.freeze(counters);\n }\n\n private subtractDropSnapshot(snapshot: readonly TelemetryDropCounter[]): void {\n for (const counter of snapshot) {\n const key = `${counter.reason}:${counter.priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.max(0, current - counter.count));\n }\n }\n\n private incrementDrop(reason: TelemetryDropCounter['reason'], priority: TelemetryAdmissionPriority): void {\n this.incrementDropBy(reason, priority, 1);\n }\n\n private incrementDropBy(\n reason: TelemetryDropCounter['reason'],\n priority: TelemetryAdmissionPriority,\n count: number,\n ): void {\n const key = `${reason}:${priority}`;\n const current = this.dropCounts.get(key) ?? 0;\n this.dropCounts.set(key, Math.min(Number.MAX_SAFE_INTEGER, current + count));\n }\n\n private priorityFor(level: string): TelemetryAdmissionPriority {\n const normalized = level.trim().toLowerCase();\n if (normalized === 'error' || normalized === 'fatal') {\n return 'high';\n }\n if (normalized === 'trace' || normalized === 'debug') {\n return 'low';\n }\n return 'normal';\n }\n\n private isSampled(priority: TelemetryAdmissionPriority): boolean {\n const sampleRate = this.options.admission.sampleRates[priority];\n return sampleRate >= 1 || this.options.random() < sampleRate;\n }\n\n private meetsMinimumLevel(level: string): boolean {\n const minimum = this.options.admission.minimumLevel;\n if (minimum === undefined) {\n return true;\n }\n const normalized = level.trim().toLowerCase() as TelemetryMinimumLevel;\n const rank = TELEMETRY_LEVEL_RANKS[normalized] ?? TELEMETRY_LEVEL_RANKS.info;\n return rank >= TELEMETRY_LEVEL_RANKS[minimum];\n }\n\n private isValidLabel(label: string): boolean {\n return /^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(label) && label.length <= 256;\n }\n\n private errorMessage(cause: unknown): string {\n if (cause instanceof Error) {\n return cause.message.slice(0, 512);\n }\n return String(cause).slice(0, 512);\n }\n\n private async settleExternalShutdown(\n work: () => Promise<void>,\n deadlineMs: number,\n ): Promise<void> {\n const operation = Promise.resolve().then(work);\n const remainingMs = deadlineMs - this.options.now();\n if (!Number.isFinite(remainingMs) || remainingMs <= 0) {\n void operation.catch(() => undefined);\n return;\n }\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const finish = (failed: boolean, error?: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n if (failed) {\n reject(error);\n } else {\n resolve();\n }\n };\n const timer = setTimeout(\n () => finish(false),\n Math.min(remainingMs, 2_147_483_647),\n );\n void operation.then(\n () => finish(false),\n (error: unknown) => finish(true, error),\n );\n });\n }\n\n private validateOptions(): void {\n this.validateIdentityOptions();\n this.validateOrderedDeliveryOptions();\n this.validateCapacityOptions();\n this.validateBatchEventOptions();\n this.validateBatchByteOptions();\n this.validateMetadataOptions();\n this.validateRetryOptions();\n this.validateSampleRateOptions();\n }\n\n private validateIdentityOptions(): void {\n if (!this.options.source.trim() || !this.options.processKind.trim() || !this.options.producerId.trim()) {\n throw new Error('Telemetry client source, process kind, and producer id are required');\n }\n }\n\n private validateOrderedDeliveryOptions(): void {\n if (this.options.admission.maxInFlightBatches !== 1) {\n throw new Error('Ordered telemetry clients currently require maxInFlightBatches to equal 1');\n }\n }\n\n private validateCapacityOptions(): void {\n const capacities = [\n this.options.admission.maxQueuedEvents,\n this.options.admission.maxQueuedBytes,\n this.options.admission.maxBatchEvents,\n this.options.admission.maxBatchBytes,\n this.options.admission.maxInFlightBatches,\n this.options.transport.capabilities.maxBatchBytes,\n this.options.transport.capabilities.boundedCapacity,\n ];\n if (capacities.some((capacity) => !Number.isSafeInteger(capacity) || capacity <= 0)) {\n throw new Error('Telemetry client and transport capacities must be positive safe integers');\n }\n }\n\n private validateBatchEventOptions(): void {\n if (this.options.admission.maxBatchEvents > this.options.admission.maxQueuedEvents\n || this.options.admission.maxBatchEvents > this.batchContract.limits.maxBatchEvents) {\n throw new Error('Telemetry maxBatchEvents must not exceed queue or receiver capacity');\n }\n }\n\n private validateBatchByteOptions(): void {\n if (this.options.admission.maxBatchBytes > this.options.admission.maxQueuedBytes\n || this.options.admission.maxBatchBytes > this.options.transport.capabilities.maxBatchBytes\n || this.options.admission.maxBatchBytes > this.batchContract.limits.maxBatchBytes) {\n throw new Error('Telemetry maxBatchBytes must not exceed queue, transport, or receiver capacity');\n }\n }\n\n private validateMetadataOptions(): void {\n if (this.options.metadata.maxBytes > this.options.admission.maxBatchBytes) {\n throw new Error('Telemetry metadata bytes must not exceed maxBatchBytes');\n }\n }\n\n private validateRetryOptions(): void {\n if (!Number.isSafeInteger(this.options.admission.retryLimit)\n || this.options.admission.retryLimit < 0\n || !Number.isFinite(this.options.admission.retryBaseDelayMs)\n || this.options.admission.retryBaseDelayMs < 0) {\n throw new Error('Telemetry retry limit and delay must be nonnegative finite values');\n }\n }\n\n private validateSampleRateOptions(): void {\n const rates = Object.values(this.options.admission.sampleRates);\n if (rates.some((rate) => !Number.isFinite(rate) || rate < 0 || rate > 1)) {\n throw new Error('Telemetry sample rates must be between zero and one');\n }\n }\n}\n","import { createRequire } from 'node:module';\nimport { dirname, resolve } from 'node:path';\nimport type { TelemetryClient } from '../../core/telemetry_client.js';\nimport type { TelemetryCollectorStatus } from '../../core/types/runtime.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryBatchTransport,\n TelemetryDropCounter,\n} from '../../core/types/transport.types.js';\nimport { NodeTelemetryProducerHost } from './node_telemetry_producer_host.js';\nimport type {\n AnimationArtifactError,\n AnimationArtifactManifest,\n AnimationArtifactMetadata,\n NodeCombinedTelemetryOptions,\n} from './types/node_telemetry_host.types.js';\n\ntype NativeCollectorBinding = Readonly<{\n start(): Promise<string>;\n receive(batchJson: string): Promise<string>;\n storeAnimationArtifact(manifestJson: string, payload: Buffer): Promise<string>;\n getAnimationArtifact(artifactId: string): Promise<Buffer | string>;\n listAnimationArtifacts(): Promise<string>;\n maintenance(): Promise<string>;\n status(): Promise<string>;\n stop(): Promise<string>;\n}>;\n\ntype NativeCollectorConstructor = new (\n configurationJson: string,\n definitionsJson: string,\n) => NativeCollectorBinding;\n\ntype NativeModule = Readonly<{\n NativeTelemetryCollector: NativeCollectorConstructor;\n}>;\n\nexport class NativeTelemetryHost {\n readonly client: TelemetryClient;\n readonly collector: TelemetryBatchReceiver;\n private readonly native: NativeCollectorBinding;\n private readonly transport: NativeTelemetryTransport;\n\n private constructor(options: NodeCombinedTelemetryOptions) {\n const binding = loadNativeModule();\n this.native = new binding.NativeTelemetryCollector(\n JSON.stringify(options.sqlite),\n JSON.stringify(options.definitions),\n );\n this.transport = new NativeTelemetryTransport(\n this.native,\n options.sqlite.targetId,\n );\n this.collector = this.transport;\n this.client = new NodeTelemetryProducerHost({\n source: options.source,\n processKind: options.processKind,\n transport: this.transport,\n admission: options.admission,\n metadata: options.metadata,\n producerId: options.producerId,\n }).client;\n }\n\n static combined(options: NodeCombinedTelemetryOptions): NativeTelemetryHost {\n return new NativeTelemetryHost(options);\n }\n\n async start(): Promise<void> {\n await this.native.start();\n this.transport.markReady();\n }\n\n async stop(deadlineMs: number): Promise<void> {\n await this.client.stop(deadlineMs);\n await this.transport.close(deadlineMs);\n }\n\n async status(): Promise<unknown> {\n return JSON.parse(await this.native.status());\n }\n\n collectorStatus(): TelemetryCollectorStatus {\n return this.transport.status();\n }\n\n async storeAnimationArtifact(\n manifest: AnimationArtifactManifest,\n payload: Buffer,\n ): Promise<{ ok: true; artifactId: string } | AnimationArtifactError> {\n return JSON.parse(await this.native.storeAnimationArtifact(JSON.stringify(manifest), payload));\n }\n\n async getAnimationArtifact(artifactId: string): Promise<Buffer | AnimationArtifactError> {\n const result = await this.native.getAnimationArtifact(artifactId);\n return Buffer.isBuffer(result) ? result : JSON.parse(result);\n }\n\n async listAnimationArtifacts(): Promise<\n { ok: true; artifacts: readonly AnimationArtifactMetadata[] } | AnimationArtifactError\n > {\n return JSON.parse(await this.native.listAnimationArtifacts());\n }\n\n async maintenance(): Promise<unknown> {\n return JSON.parse(await this.native.maintenance());\n }\n}\n\nclass NativeTelemetryTransport implements TelemetryBatchTransport, TelemetryBatchReceiver {\n readonly transportId = 'native-rust-collector';\n readonly receiverId = 'native-rust-collector';\n readonly capabilities = Object.freeze({\n maxBatchBytes: 1_048_576,\n acknowledgement: 'durable' as const,\n ordering: 'producer' as const,\n boundedCapacity: 64,\n });\n private closed = false;\n private state: TelemetryCollectorStatus['state'] = 'created';\n private acceptedBatches = 0;\n private committedEvents = 0;\n private rejectedBatches = 0;\n private lastFailure: string | null = null;\n private readonly dropCounters = new Map<string, TelemetryDropCounter>();\n\n constructor(\n private readonly native: NativeCollectorBinding,\n private readonly targetId: string,\n ) {}\n\n markReady(): void {\n this.state = 'ready';\n }\n\n receive(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n return this.send(batch);\n }\n\n async send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n if (this.closed) {\n return rejectedClosed(batch.idempotencyKey);\n }\n this.acceptedBatches += 1;\n try {\n const value: unknown = JSON.parse(await this.native.receive(JSON.stringify(batch)));\n const acknowledgement = parseAcknowledgement(value, batch.idempotencyKey);\n if (acknowledgement.kind === 'committed' && !acknowledgement.duplicate) {\n this.committedEvents += acknowledgement.acceptedEvents;\n this.aggregateDropCounters(batch.dropCounters);\n } else if (acknowledgement.kind !== 'committed') {\n this.rejectedBatches += 1;\n this.lastFailure = acknowledgement.reason;\n }\n return acknowledgement;\n } catch (error) {\n this.lastFailure = error instanceof Error ? error.message : String(error);\n throw error;\n }\n }\n\n async flush(_deadlineMs: number): Promise<void> {}\n\n async close(deadlineMs: number): Promise<void> {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.state = 'draining';\n const operation = this.native.stop().then(() => {\n this.state = 'stopped';\n });\n const remainingMs = Math.max(0, deadlineMs - Date.now());\n let timer: ReturnType<typeof setTimeout> | null = null;\n await Promise.race([\n operation,\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, remainingMs);\n }),\n ]);\n if (timer !== null) {\n clearTimeout(timer);\n }\n }\n\n status(): TelemetryCollectorStatus {\n return Object.freeze({\n state: this.state,\n acceptedBatches: this.acceptedBatches,\n committedEvents: this.committedEvents,\n rejectedBatches: this.rejectedBatches,\n dropCounters: Object.freeze([...this.dropCounters.values()]),\n lastFailure: this.lastFailure,\n targets: Object.freeze([{\n targetId: this.targetId,\n state: this.state === 'draining' ? 'ready' : this.state,\n detail: this.lastFailure,\n writerLeaseHeld: this.state === 'ready',\n }]),\n });\n }\n\n private aggregateDropCounters(counters: readonly TelemetryDropCounter[]): void {\n for (const counter of counters) {\n const key = `${counter.reason}:${counter.priority}`;\n const previous = this.dropCounters.get(key);\n this.dropCounters.set(key, Object.freeze({\n ...counter,\n count: Math.min(Number.MAX_SAFE_INTEGER, (previous?.count ?? 0) + counter.count),\n }));\n }\n }\n}\n\nfunction loadNativeModule(): NativeModule {\n const require = createRequire(typeof __filename === 'string' ? __filename : import.meta.url);\n const packageRoot = dirname(require.resolve('@noego/telemetry/package.json'));\n const modulePath = resolve(packageRoot, 'native', 'noego_telemetry_native.node');\n const loaded: unknown = require(modulePath);\n if (!isRecord(loaded) || typeof loaded.NativeTelemetryCollector !== 'function') {\n throw new Error(`Native telemetry binding at ${modulePath} has an invalid export contract`);\n }\n return loaded as NativeModule;\n}\n\nfunction parseAcknowledgement(value: unknown, idempotencyKey: string): TelemetryAcknowledgement {\n if (!isRecord(value) || value.idempotencyKey !== idempotencyKey || typeof value.kind !== 'string') {\n throw new Error('Native telemetry acknowledgement has an invalid identity');\n }\n if (value.kind === 'committed'\n && isSafeNumber(value.committedAtMs)\n && isSafeNumber(value.acceptedEvents)\n && typeof value.duplicate === 'boolean'\n && Array.isArray(value.targetStates)) {\n return {\n kind: 'committed',\n idempotencyKey,\n committedAtMs: value.committedAtMs,\n acceptedEvents: value.acceptedEvents,\n duplicate: value.duplicate,\n targetStates: parseTargetStates(value.targetStates),\n };\n }\n const reason = typeof value.reason === 'string' ? value.reason : 'Native telemetry request failed';\n if (value.kind === 'retryable') {\n return {\n kind: 'retryable',\n idempotencyKey,\n reason,\n retryAfterMs: isSafeNumber(value.retryAfterMs) ? value.retryAfterMs : 100,\n targetStates: parseTargetStates(value.targetStates),\n };\n }\n if (value.kind === 'rejected') {\n const code = value.code === 'unsupported-version' || value.code === 'no-required-terminal'\n || value.code === 'closed' ? value.code : 'invalid-batch';\n return {\n kind: 'rejected',\n idempotencyKey,\n code,\n reason,\n targetStates: parseTargetStates(value.targetStates),\n };\n }\n return {\n kind: 'conflict',\n idempotencyKey,\n reason,\n targetStates: parseTargetStates(value.targetStates),\n };\n}\n\nfunction parseTargetStates(value: unknown): TelemetryAcknowledgement['targetStates'] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((state) => {\n if (!isRecord(state)\n || typeof state.targetId !== 'string'\n || (state.delivery !== 'required' && state.delivery !== 'best-effort')\n || (state.state !== 'pending' && state.state !== 'committed'\n && state.state !== 'failed' && state.state !== 'abandoned')\n || !isSafeNumber(state.attempts)) {\n return [];\n }\n return [{\n targetId: state.targetId,\n delivery: state.delivery,\n state: state.state,\n attempts: state.attempts,\n reason: typeof state.reason === 'string' ? state.reason : null,\n }];\n });\n}\n\nfunction rejectedClosed(idempotencyKey: string): TelemetryAcknowledgement {\n return {\n kind: 'rejected',\n idempotencyKey,\n code: 'closed',\n reason: 'Native telemetry transport is closed',\n targetStates: [],\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isSafeNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n","import { dirname, resolve } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { load as loadYaml } from 'js-yaml';\nimport { MetricDefinitionContract } from '../../core/metric_definition_contract.js';\nimport type {\n ResolvedTelemetryConfiguration,\n SqliteTableOverrides,\n SqliteTargetConfiguration,\n} from '../../core/types/configuration.types.js';\nimport type { MetricDefinition, MetricMeasurement } from '../../core/types/metric.types.js';\nimport { TelemetryTableMap } from '../../storage/telemetry_table_map.js';\nimport { TelemetryDurationParser } from './helper/telemetry_duration_parser.js';\nimport {\n TelemetryConfigurationDocumentSchema,\n type SerializedMetricDefinition,\n type SerializedSqliteTarget,\n} from './schema/telemetry_configuration_schema.js';\nimport type { NodeTelemetryConfigurationParseOptions } from './types/telemetry_configuration_parser.types.js';\n\nconst DEFAULT_LEASE_EXPIRY = '30s';\nconst DEFAULT_QUERY_RANGE = '365d';\nconst DEFAULT_QUERY_ROWS = 10_000;\nconst DEFAULT_QUERY_BUCKETS = 10_000;\nconst DEFAULT_QUERY_BYTES = 5_000_000;\nconst DEFAULT_RECLAIM_PAGES = 100;\n\nexport class TelemetryConfigurationError extends Error {\n constructor(\n message: string,\n readonly source: string,\n ) {\n super(`${source}: ${message}`);\n this.name = 'TelemetryConfigurationError';\n }\n}\n\nexport class NodeTelemetryConfigurationParser {\n constructor(\n private readonly durations = new TelemetryDurationParser(),\n private readonly metricContract = new MetricDefinitionContract(),\n ) {}\n\n parseFile(\n configurationPath: string,\n options: NodeTelemetryConfigurationParseOptions = {},\n ): ResolvedTelemetryConfiguration {\n const absolutePath = resolve(configurationPath);\n let source: string;\n try {\n source = readFileSync(absolutePath, 'utf8');\n } catch (cause) {\n throw new TelemetryConfigurationError(this.errorMessage(cause), absolutePath);\n }\n return this.parseYaml(source, {\n sourceName: options.sourceName ?? absolutePath,\n storageBaseDirectory: options.storageBaseDirectory ?? dirname(absolutePath),\n });\n }\n\n parseYaml(\n source: string,\n options: NodeTelemetryConfigurationParseOptions = {},\n ): ResolvedTelemetryConfiguration {\n const sourceName = options.sourceName ?? '<telemetry-configuration>';\n let document: unknown;\n try {\n document = loadYaml(source);\n } catch (cause) {\n throw new TelemetryConfigurationError(this.errorMessage(cause), sourceName);\n }\n const parsed = TelemetryConfigurationDocumentSchema.safeParse(document);\n if (!parsed.success) {\n throw new TelemetryConfigurationError(parsed.error.message, sourceName);\n }\n try {\n const baseDirectory =\n options.storageBaseDirectory === undefined\n ? dirname(resolve(sourceName))\n : resolve(options.storageBaseDirectory);\n return this.resolveDocument(parsed.data, baseDirectory);\n } catch (cause) {\n if (cause instanceof TelemetryConfigurationError) {\n throw cause;\n }\n throw new TelemetryConfigurationError(this.errorMessage(cause), sourceName);\n }\n }\n\n private resolveDocument(\n document: ReturnType<typeof TelemetryConfigurationDocumentSchema.parse>,\n baseDirectory: string,\n ): ResolvedTelemetryConfiguration {\n const telemetry = document.telemetry;\n this.validateRole(telemetry.role, telemetry.trace);\n const serializedTargets = telemetry.trace.storage?.targets ?? [];\n const targets = serializedTargets.map((target, index) =>\n this.resolveTarget(target, baseDirectory, index),\n );\n this.validateTargets(telemetry.role, targets, telemetry.trace.storage?.defaultTarget ?? null);\n const metrics = (telemetry.metrics ?? []).map((metric, index) =>\n this.resolveMetric(metric, targets, index),\n );\n this.validateMetricIdentities(metrics);\n return Object.freeze({\n version: telemetry.version ?? 1,\n role: telemetry.role,\n ingestionTransport: telemetry.trace.ingestionTransport ?? null,\n logTransport: telemetry.logs?.transport ?? null,\n defaultTargetId: telemetry.trace.storage?.defaultTarget ?? null,\n sqliteTargets: Object.freeze(targets),\n metrics: Object.freeze(metrics),\n });\n }\n\n private validateRole(\n role: 'producer' | 'collector' | 'combined',\n trace: Readonly<{\n ingestionTransport?: string | undefined;\n storage?: unknown;\n }>,\n ): void {\n const hasIngestion = trace.ingestionTransport !== undefined;\n const hasStorage = trace.storage !== undefined;\n if (role === 'producer' && (!hasIngestion || hasStorage)) {\n throw new Error('Producer telemetry requires ingestionTransport and forbids storage');\n }\n if (role === 'collector' && !hasStorage) {\n throw new Error('Collector telemetry requires storage targets');\n }\n if (role === 'combined' && (!hasIngestion || !hasStorage)) {\n throw new Error('Combined telemetry requires ingestionTransport and storage targets');\n }\n }\n\n private resolveTarget(\n target: SerializedSqliteTarget,\n baseDirectory: string,\n index: number,\n ): SqliteTargetConfiguration {\n const field = `telemetry.trace.storage.targets[${index}]`;\n const rawMs = this.durations.parse(target.retention.raw, `${field}.retention.raw`);\n const lateArrivalMs = this.durations.parse(\n target.retention.lateArrival ?? '0ms',\n `${field}.retention.lateArrival`,\n true,\n );\n const samplesMs =\n target.retention.samples === undefined\n ? rawMs + lateArrivalMs\n : this.durations.parse(target.retention.samples, `${field}.retention.samples`);\n const levelMs = this.resolveLevelRetention(target.retention.levels, field);\n const rollups = target.retention.rollups.map((tier, tierIndex) =>\n Object.freeze({\n resolutionMs: this.durations.parse(\n tier.resolution,\n `${field}.retention.rollups[${tierIndex}].resolution`,\n ),\n retainMs: this.durations.parse(\n tier.retain,\n `${field}.retention.rollups[${tierIndex}].retain`,\n ),\n }),\n );\n const tables = Object.freeze(\n Object.fromEntries(\n Object.entries(target.schema?.tables ?? {}).filter((entry) => entry[1] !== undefined),\n ),\n ) as SqliteTableOverrides;\n const schema = Object.freeze({\n tablePrefix: target.schema?.tablePrefix ?? null,\n tables,\n });\n const tableMap = TelemetryTableMap.create(schema);\n if (!tableMap.ok) {\n throw new Error(`${field}.schema: ${tableMap.error}`);\n }\n const resolved = Object.freeze({\n targetId: target.id,\n path: resolve(baseDirectory, target.path),\n delivery: target.delivery,\n schema,\n retention: Object.freeze({\n rawMs,\n lateArrivalMs,\n samplesMs,\n levelMs,\n rollups: Object.freeze(rollups),\n }),\n maintenance: Object.freeze({\n intervalMs: this.durations.parse(\n target.maintenance.interval,\n `${field}.maintenance.interval`,\n ),\n maxWorkMs: target.maintenance.maxWorkMs,\n maxReclaimPages: target.maintenance.maxReclaimPages ?? DEFAULT_RECLAIM_PAGES,\n }),\n leaseExpiryMs: this.durations.parse(\n target.leaseExpiry ?? DEFAULT_LEASE_EXPIRY,\n `${field}.leaseExpiry`,\n ),\n query: Object.freeze({\n maxRangeMs: this.durations.parse(\n target.query?.maxRange ?? DEFAULT_QUERY_RANGE,\n `${field}.query.maxRange`,\n ),\n maxRows: target.query?.maxRows ?? DEFAULT_QUERY_ROWS,\n maxBuckets: target.query?.maxBuckets ?? DEFAULT_QUERY_BUCKETS,\n maxResponseBytes: target.query?.maxResponseBytes ?? DEFAULT_QUERY_BYTES,\n }),\n });\n this.validateRetention(resolved, field);\n if (resolved.leaseExpiryMs < 1_000) {\n throw new Error(`${field}.leaseExpiry must be at least 1s`);\n }\n return resolved;\n }\n\n private resolveLevelRetention(\n levels: Readonly<Record<string, string>> | undefined,\n field: string,\n ): Readonly<Record<string, number>> {\n if (levels === undefined) {\n return Object.freeze({});\n }\n const resolved: Record<string, number> = {};\n for (const [level, duration] of Object.entries(levels)) {\n const normalized = level.trim().toLowerCase();\n if (normalized.length === 0) {\n throw new Error(`${field}.retention.levels contains an empty level name`);\n }\n if (resolved[normalized] !== undefined) {\n throw new Error(`${field}.retention.levels declares \"${normalized}\" more than once`);\n }\n resolved[normalized] = this.durations.parse(\n duration,\n `${field}.retention.levels.${normalized}`,\n );\n }\n return Object.freeze(resolved);\n }\n\n private validateRetention(target: SqliteTargetConfiguration, field: string): void {\n const retention = target.retention;\n const requiredSamplesMs = retention.rawMs + retention.lateArrivalMs;\n if (!Number.isSafeInteger(requiredSamplesMs) || retention.samplesMs < requiredSamplesMs) {\n throw new Error(`${field}.retention.samples must cover raw plus lateArrival`);\n }\n for (let index = 0; index < retention.rollups.length; index += 1) {\n const tier = retention.rollups[index];\n const previous = retention.rollups[index - 1];\n if (!tier || tier.retainMs < retention.rawMs) {\n throw new Error(`${field}.retention rollup retention cannot be shorter than raw retention`);\n }\n if (\n previous &&\n (tier.resolutionMs <= previous.resolutionMs || tier.retainMs <= previous.retainMs)\n ) {\n throw new Error(\n `${field}.retention rollup tiers must increase by resolution and retention`,\n );\n }\n }\n }\n\n private validateTargets(\n role: 'producer' | 'collector' | 'combined',\n targets: readonly SqliteTargetConfiguration[],\n defaultTargetId: string | null,\n ): void {\n if (role === 'producer') {\n return;\n }\n const targetIds = targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error('Telemetry storage target ids must be unique');\n }\n if (!targets.some((target) => target.delivery === 'required')) {\n throw new Error('Telemetry storage requires at least one required durable target');\n }\n if (defaultTargetId !== null && !targetIds.includes(defaultTargetId)) {\n throw new Error(`Unknown default telemetry target ${defaultTargetId}`);\n }\n }\n\n private resolveMetric(\n metric: SerializedMetricDefinition,\n targets: readonly SqliteTargetConfiguration[],\n index: number,\n ): MetricDefinition {\n if (metric.selector.endsWith('[*]') && (metric.groupBy?.length ?? 0) > 0) {\n throw new Error(`telemetry.metrics[${index}] selector [*] cannot declare groupBy`);\n }\n const targetIds = metric.targets ?? targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error(`telemetry.metrics[${index}] has duplicate target ids`);\n }\n const unknownTarget = targetIds.find(\n (targetId) => !targets.some((target) => target.targetId === targetId),\n );\n if (unknownTarget !== undefined) {\n throw new Error(`telemetry.metrics[${index}] references unknown target ${unknownTarget}`);\n }\n const resolutionsMs =\n metric.resolutions?.map((resolution, resolutionIndex) =>\n this.durations.parse(\n resolution,\n `telemetry.metrics[${index}].resolutions[${resolutionIndex}]`,\n ),\n ) ?? this.metricResolutions(targets, targetIds);\n this.validateMetricResolutions(resolutionsMs, targets, targetIds, index);\n const cardinality = Object.freeze(\n Object.fromEntries(\n Object.entries(metric.cardinality ?? {}).map(([field, rule]) => [\n field,\n Object.freeze({ ...rule }),\n ]),\n ),\n );\n const definition: MetricDefinition = {\n name: metric.name,\n version: metric.version ?? 1,\n selector: metric.selector,\n groupBy: Object.freeze([...(metric.groupBy ?? [])]),\n measurements: Object.freeze(\n metric.measurements.map((measurement) => this.resolveMeasurement(measurement)),\n ),\n cardinality,\n targetIds: Object.freeze([...targetIds]),\n resolutionsMs: Object.freeze(resolutionsMs),\n missingField: metric.missingField ?? 'record-failure',\n };\n const normalized = this.metricContract.normalize(definition);\n if (!normalized.ok) {\n throw new Error(`telemetry.metrics[${index}]: ${normalized.error}`);\n }\n this.validateNormalizedMetric(normalized.value, index);\n return normalized.value;\n }\n\n private validateNormalizedMetric(definition: MetricDefinition, index: number): void {\n const segments = definition.selector.split('.');\n const invalidSelector = segments.some(\n (segment) =>\n segment !== '*' && segment !== '**' && !/^[A-Za-z0-9_:-][A-Za-z0-9_:\\-]*$/.test(segment),\n );\n if (invalidSelector) {\n throw new Error(`telemetry.metrics[${index}] has an invalid dotted selector`);\n }\n const invalidGroupBy = definition.groupBy.find((field) => !this.isFieldPath(field));\n if (\n invalidGroupBy !== undefined ||\n new Set(definition.groupBy).size !== definition.groupBy.length\n ) {\n throw new Error(`telemetry.metrics[${index}] has invalid or duplicate groupBy fields`);\n }\n const extraCardinality = Object.keys(definition.cardinality).find(\n (field) => !definition.groupBy.includes(field),\n );\n if (extraCardinality !== undefined) {\n throw new Error(\n `telemetry.metrics[${index}] cardinality policy ${extraCardinality} is not a declared dimension`,\n );\n }\n const measurementKeys = definition.measurements.map((measurement) =>\n measurement.kind === 'count' ? 'count' : `field:${measurement.field}`,\n );\n const invalidField = definition.measurements.find(\n (measurement) => measurement.kind === 'field' && !this.isFieldPath(measurement.field),\n );\n if (invalidField !== undefined || new Set(measurementKeys).size !== measurementKeys.length) {\n throw new Error(`telemetry.metrics[${index}] has invalid or duplicate measurements`);\n }\n }\n\n private isFieldPath(value: string): boolean {\n return value.split('.').every((segment) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(segment));\n }\n\n private resolveMeasurement(\n measurement: SerializedMetricDefinition['measurements'][number],\n ): MetricMeasurement {\n if (measurement === 'count') {\n return Object.freeze({ kind: 'count' });\n }\n if (new Set(measurement.aggregate).size !== measurement.aggregate.length) {\n throw new Error(`Metric field ${measurement.field} has duplicate aggregates`);\n }\n return Object.freeze({\n kind: 'field',\n field: measurement.field,\n aggregates: Object.freeze([...measurement.aggregate]),\n });\n }\n\n private metricResolutions(\n targets: readonly SqliteTargetConfiguration[],\n targetIds: readonly string[],\n ): number[] {\n const selected = targets.filter((target) => targetIds.includes(target.targetId));\n const first = selected[0]?.retention.rollups.map((tier) => tier.resolutionMs) ?? [];\n return first\n .filter((resolution) =>\n selected.every((target) =>\n target.retention.rollups.some((tier) => tier.resolutionMs === resolution),\n ),\n )\n .sort((left, right) => left - right);\n }\n\n private validateMetricResolutions(\n resolutions: readonly number[],\n targets: readonly SqliteTargetConfiguration[],\n targetIds: readonly string[],\n metricIndex: number,\n ): void {\n for (const targetId of targetIds) {\n const target = targets.find((candidate) => candidate.targetId === targetId);\n const unavailable = resolutions.find(\n (resolution) => !target?.retention.rollups.some((tier) => tier.resolutionMs === resolution),\n );\n if (unavailable !== undefined) {\n throw new Error(\n `telemetry.metrics[${metricIndex}] resolution ${unavailable} is not configured for target ${targetId}`,\n );\n }\n }\n }\n\n private validateMetricIdentities(metrics: readonly MetricDefinition[]): void {\n const identities = metrics.map((metric) => `${metric.name}:${metric.version}`);\n if (new Set(identities).size !== identities.length) {\n throw new Error('Metric name/version identities must be unique');\n }\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","export class TelemetryDurationParser {\n private static readonly MULTIPLIERS = Object.freeze({\n ms: 1,\n s: 1_000,\n m: 60_000,\n h: 60 * 60_000,\n d: 24 * 60 * 60_000,\n w: 7 * 24 * 60 * 60_000,\n y: 365 * 24 * 60 * 60_000,\n });\n\n parse(value: string, field: string, allowZero = false): number {\n const match = /^(0|[1-9][0-9]*)(ms|s|m|h|d|w|y)$/.exec(value);\n if (!match) {\n throw new Error(`${field} must be an integer duration using ms, s, m, h, d, w, or y`);\n }\n const amount = Number(match[1]);\n const unit = match[2] as keyof typeof TelemetryDurationParser.MULTIPLIERS;\n const milliseconds = amount * TelemetryDurationParser.MULTIPLIERS[unit];\n if (!Number.isSafeInteger(milliseconds) || (!allowZero && milliseconds <= 0)) {\n throw new Error(`${field} is outside the supported duration range`);\n }\n return milliseconds;\n }\n}\n","import { z } from 'zod';\n\nconst DurationSchema = z.string().min(1);\nconst NonEmptyStringSchema = z.string().trim().min(1);\nconst StableIdSchema = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/);\n\nconst CardinalityRuleSchema = z\n .object({\n maxValuesPerBucket: z.number().int().positive(),\n overflow: z.enum(['other', 'drop', 'reject']),\n })\n .strict();\n\nconst MetricMeasurementSchema = z.union([\n z.literal('count'),\n z\n .object({\n field: z.string().min(1),\n aggregate: z.array(z.enum(['sum', 'min', 'max', 'last'])).min(1),\n })\n .strict(),\n]);\n\nconst MetricDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: z.number().int().positive().optional(),\n selector: z.string().min(1),\n groupBy: z.array(z.string().min(1)).optional(),\n measurements: z.array(MetricMeasurementSchema).min(1),\n cardinality: z.record(z.string(), CardinalityRuleSchema).optional(),\n targets: z.array(StableIdSchema).min(1).optional(),\n resolutions: z.array(DurationSchema).min(1).optional(),\n missingField: z.enum(['skip', 'record-failure']).optional(),\n })\n .strict();\n\nconst SqliteTablesSchema = z\n .object({\n rawEvents: NonEmptyStringSchema.optional(),\n batchAcknowledgements: NonEmptyStringSchema.optional(),\n ingestWatermarks: NonEmptyStringSchema.optional(),\n metricDefinitions: NonEmptyStringSchema.optional(),\n metricSamples: NonEmptyStringSchema.optional(),\n metricRollups: NonEmptyStringSchema.optional(),\n rollupCompletions: NonEmptyStringSchema.optional(),\n extractionFailures: NonEmptyStringSchema.optional(),\n maintenanceRuns: NonEmptyStringSchema.optional(),\n readerLeases: NonEmptyStringSchema.optional(),\n committedDropCounters: NonEmptyStringSchema.optional(),\n migrationHistory: NonEmptyStringSchema.optional(),\n })\n .strict();\n\nconst SqliteTargetSchema = z\n .object({\n id: StableIdSchema,\n transport: z.literal('sqlite'),\n delivery: z.enum(['required', 'best-effort']),\n path: z.string().min(1),\n schema: z\n .object({\n tablePrefix: NonEmptyStringSchema.nullable().optional(),\n tables: SqliteTablesSchema.optional(),\n })\n .strict()\n .optional(),\n retention: z\n .object({\n raw: DurationSchema,\n lateArrival: DurationSchema.optional(),\n samples: DurationSchema.optional(),\n levels: z.record(z.string().min(1), DurationSchema).optional(),\n rollups: z\n .array(\n z\n .object({\n resolution: DurationSchema,\n retain: DurationSchema,\n })\n .strict(),\n )\n .min(1),\n })\n .strict(),\n maintenance: z\n .object({\n interval: DurationSchema,\n maxWorkMs: z.number().int().positive(),\n reclaim: z.literal('incremental'),\n maxReclaimPages: z.number().int().positive().optional(),\n })\n .strict(),\n leaseExpiry: DurationSchema.optional(),\n query: z\n .object({\n maxRange: DurationSchema.optional(),\n maxRows: z.number().int().positive().optional(),\n maxBuckets: z.number().int().positive().optional(),\n maxResponseBytes: z.number().int().positive().optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nconst StorageSchema = z\n .object({\n defaultTarget: StableIdSchema.nullable().optional(),\n targets: z.array(SqliteTargetSchema).min(1),\n })\n .strict();\n\nconst TraceSchema = z\n .object({\n ingestionTransport: z.string().min(1).optional(),\n storage: StorageSchema.optional(),\n })\n .strict();\n\nexport const TelemetryConfigurationDocumentSchema = z\n .object({\n telemetry: z\n .object({\n version: z.literal(1).optional(),\n role: z.enum(['producer', 'collector', 'combined']),\n trace: TraceSchema,\n metrics: z.array(MetricDefinitionSchema).optional(),\n logs: z\n .object({\n transport: z.literal('console'),\n })\n .strict()\n .optional(),\n })\n .strict(),\n })\n .strict();\n\nexport type TelemetryConfigurationDocument = z.infer<typeof TelemetryConfigurationDocumentSchema>;\n\nexport type SerializedMetricDefinition = z.infer<typeof MetricDefinitionSchema>;\nexport type SerializedSqliteTarget = z.infer<typeof SqliteTargetSchema>;\n"],"mappings":"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","names":["randomUUID","resolve","resolve","resolve","target","resolve","resolve","resolve","deleted","z","resolve","randomUUID","resolve","randomUUID","resolve","randomUUID","dirname","resolve","resolve","require","dirname","dirname","resolve","readFileSync","z","resolve","readFileSync","dirname"]}